Kiến Thức Cơ Bản PostgreSQL Trực Tuyến - cwin222
Ngày 31 tháng 7 năm 2021 - Máy tính PGExercises.com là một trang web thực hành PostgreSQL trực tuyến tuyệt vời. Trang web này dựa trên một tập dữ liệu đơn giản, thiết lập nhiều câu hỏi khác nhau mà chúng ta có thể trả lời để ôn lại kiến thức SQL.
Các câu hỏi trên trang web bao gồm "truy vấn đơn giản và điều kiện WHERE", "liên kết và câu lệnh CASE", "hàm tập hợp, hàm cửa sổ và truy vấn đệ quy" cùng nhiều danh mục khác, là một nơi tuyệt vời để kiểm tra kiến thức đã học.
Dưới đây là một giới thiệu ngắn gọn về tập dữ liệu được sử dụng trên trang web. Tập dữ liệu này nhằm vào một câu lạc bộ vùng quê mới thành lập: có một nhóm thành viên, một nhóm cơ sở hạ tầng thể thao và các bản ghi đặt trước của những cơ sở hạ tầng này.
Trước tiên, hãy xem bảng members
:
Bảng này bao gồm ID, thông tin cơ bản, ID người giới thiệu và thời gian gia nhập, v.v.
1CREATETABLEcd.members(memidINTEGERNOTNULL,-- ID thành viên
2surnameCHARACTERVARYING(200)NOTNULL,-- Họ
3firstnameCHARACTERVARYING(200)NOTNULL,-- Tên
4addressCHARACTERVARYING(300)NOTNULL,-- Địa chỉ
5zipcodeINTEGERNOTNULL,-- Mã bưu điện
6telephoneCHARACTERVARYING(20)NOTNULL,-- Điện thoại
7recommendedbyINTEGER,-- Người giới thiệu
8joindateTIMESTAMPNOTNULL,-- Thời gian gia nhập
9CONSTRAINTmembers_pkPRIMARYKEY(memid),CONSTRAINTfk_members_recommendedbyFOREIGNKEY(recommendedby)REFERENCEScd.members(memid)ONDELETESETNULL);
Tiếp theo, hãy xem bảng facilities
:
Bảng này liệt kê các cơ sở hạ tầng có thể đặt trước, bao gồm ID cơ sở hạ tầng, tên cơ sở hạ tầng, chi phí đặt trước cho thành viên và du khách, v.v.
1CREATETABLEcd.facilities(facidintegerNOTNULL,-- ID cơ sở hạ tầng
2namecharactervarying(100)NOTNULL,-- Tên cơ sở hạ tầng
3membercostnumericNOTNULL,-- Chi phí đặt trước cho thành viên
4guestcostnumericNOTNULL,-- Chi phí đặt trước cho du khách
5initialoutlaynumericNOTNULL,monthlymaintenancenumericNOTNULL,CONSTRAINTfacilities_pkPRIMARYKEY(facid));
Cuối cùng, hãy xem bảng bookings
:
Bảng này dùng để theo dõi tình hình đặt trước của các cơ sở hạ tầng, bao gồm ID cơ sở hạ tầng, ID thành viên đặt trước, thời gian bắt đầu đặt trước, và số lượng nửa giờ (slots) đã đặt trước, v.v.
1CREATETABLEcd.bookings(bookidintegerNOTNULL,facidintegerNOTNULL,-- ID cơ sở hạ tầng
2memidintegerNOTNULL,-- ID thành viên
3starttimetimestampNOTNULL,-- Thời gian bắt đầu đặt trước
4slotsintegerNOTNULL,-- Số lượng nửa giờ đã đặt trước
5CONSTRAINTbookings_pkPRIMARYKEY(bookid),CONSTRAINTfk_bookings_facidFOREIGNKEY(facid)REFERENCEScd.facilities(facid),CONSTRAINTfk_bookings_memidFOREIGNKEY(memid)REFERENCEScd.members(memid));
Mối quan hệ giữa ba bảng này như sau: 
Sau khi giới thiệu xong tập dữ liệu, bây giờ chúng ta bắt đầu luyện tập nhé.
1 Truy vấn SQL đơn giản
Chuyên mục này kiểm tra kiến thức cơ bản về SQL, các câu hỏi bao gồm SELECT, WHERE, CASE, UNION, v.v. 1 Kiểm soát hàng nào được chọn Mô tả vấn đề: Tạo một danh sách các thiết bị mà thu phí từ thành viên và mức phí này ít hơn một phần năm mươi của chi phí bảo trì hàng tháng. Danh sách này trả về ID thiết bị, tên, phí thành viên và chi phí bảo trì hàng tháng. Lời giải:
1SELECTfacid,name,membercost,monthlymaintenanceFROMcd.facilitiesWHEREmembercost>0ANDmembercost<monthlymaintenance/50;
2 Phân loại kết quả
Mô tả vấn đề:
Tạo một danh sách các thiết bị, nếu chi phí bảo trì hàng tháng lớn hơn 100 thì đánh dấu là expensive
, ngược lại là cheap
. Trả về tên liên quan và tình trạng bảo trì hàng tháng.
Lời giải:
1SELECTname,CASEWHENmonthlymaintenance>100THEN'expensive'ELSE'cheap'ENDAScostFROMcd.facilities; [ban ca doi the](/post/7929.html)
3 Xử lý ngày Mô tả vấn đề: Tạo một danh sách thành viên, trả về những ai gia nhập từ tháng 9 năm 2012 trở đi. Trả về memid, surname, firstname và joindate. Lời giải:
1SELECTmemid,surname,firstname,joindateFROMcd.membersWHEREjoindate>='2012-09-01';
4 Loại bỏ trùng lặp và sắp xếp kết quả Mô tả vấn đề: Tạo một danh sách họ của 10 thành viên đầu tiên đã được sắp xếp và không có trùng lặp. Lời giải:
1SELECTDISTINCTsurnameFROMcd.membersORDERBYsurnameLIMIT10;
5 Kết hợp kết quả từ nhiều truy vấn
Mô tả vấn đề:
Do một số lý do, bạn cần một danh sách kết hợp tất cả họ và tên tất cả các cơ sở hạ tầng. Hãy tạo danh sách này.
Lời giải:
Lưu ý rằng việc sử dụng UNION
sẽ loại bỏ các phần tử trùng lặp, trong khi UNION ALL
thì không.
1SELECTsurnameFROMcd.membersUNIONSELECTnameFROMcd.facilities;
6 Sử dụng hàm tập hợp Mô tả vấn đề: Bạn muốn lấy tên và họ của thành viên cuối cùng gia nhập, cũng như thời gian gia nhập. Làm thế nào? Lời giải: Sử dụng subquery để đạt được điều này.
1SELECTfirstname,surname,joindateFROMcd.membersWHEREjoindate=(SELECTmax(joindate)FROMcd.members);
2 Liên kết và subquery
Chuyên mục này chủ yếu kiểm tra nền tảng cơ bản của cơ sở dữ liệu quan hệ - liên kết. Các câu hỏi bao gồm inner join, outer join, self join, subquery. 1 Lấy thời gian bắt đầu đặt trước của thành viên Mô tả vấn đề: Lấy thời gian bắt đầu đặt trước của thành viên có tên "David Farrell". Lời giải: Có hai cách thực hiện, một cách sử dụng inner join, một cách sử dụng subquery. Inner join có hai cách viết. a) Thực hiện bằng inner join
1SELECTb.starttimeFROMcd.bookingsb,cd.membersmWHEREb.memid=m.memidANDfirstname='David'ANDsurname='Farrell';-- Cách viết khác
2SELECTb.starttimeFROMcd.bookingsbINNERJOINcd.membersmONb.memid=m.memidWHEREfirstname='David'ANDsurname='Farrell';
b) Thực hiện bằng subquery
1SELECTstarttimeFROMcd.bookingsWHEREmemidIN(SELECTmemidFROMcd.membersWHEREfirstname='David'ANDsurname='Farrell'); [soi kèo bóng đá hôm nay](/post/postgres-foreign-data-wrappers.html)
2 Lấy thời gian bắt đầu đặt trước của sân tennis
Mô tả vấn đề:
Lấy danh sách thời gian bắt đầu đặt trước của "Tennis Court" vào ngày 2012-09-21
. Trả về thời gian bắt đầu và tên thiết bị, sắp xếp theo thời gian bắt đầu.
Lời giải:
1SELECTb.starttime,f.nameFROMcd.bookingsb,cd.facilitiesfWHEREb.facid=f.facidANDf.nameLIKE'Tennis Court%'ANDdate(b.starttime)='2012-09-21'ORDERBYb.starttime;
... [và tiếp 78win+đăng+nhập tục với các phần còn lại]