3.3. C ÁC THAO TÁC DỮ LIỆU TRONG SQL
3.3.5. Các phép toán tập hợp trong SQL
Giả sử trong CSDL có thêm một quan hệ học bổng (HOC_BONG) như sau:
HOC_BONG (MaSV, HoTenSV, KyHoc, NamHoc, HocBong) a. UNION
Cú pháp
(SELECT [DISTINCT]<biểu thức 1>, <biếu thức 2>, ...
FROM <tên bảng 1>, <tên bảng 2>, ...
[WHERE <điều kiện chọn>]) UNION [ALL]
(SELECT [DISTINCT]<biểu thức 1>, <biếu thức 2>, ...
FROM <tên bảng 1>, <tên bảng 2>, ...
106 [WHERE <điều kiện chọn>])
Ví dụ 3.56. Lập danh sách các sinh viên hoặc quê ở “Lai Châu” hoặc được học bổng kỳ 2 năm học 2017 – 2018.
(SELECT *
FROM SINH_VIEN
WHERE QueQuan=“Lai Châu”) UNION
(SELECT *
FROM HOC_BONG
WHERE HocKy=2 AND NamHoc=“2017 – 2018”);
Theo mặc định, phép toán UNION sẽ loại bỏ những dòng giống nhau trong kết quả. Nếu ta sử dụng tùy chọn ALL thì các dòng giống nhau sẽ không bị loại bỏ. Ta có thể sử dụng các dấu ngoặc để xác định thứ tự tính toán trong phép hợp.
Các nguyên tắc khi sử dụng toán tử UNION
• Tất cả các danh sách chọn trong câu lệnh UNION phải có cùng số biểu thức (các tên cột, các biểu thức số học, các hàm gộp,...)
• Các cột tương ứng trong tất cả các bảng, hoặc tập con bất kỳ các cột được sử dụng trong bản thân mỗi truy vấn phải cùng kiểu dữ liệu.
• Các cột tương ứng trong bản thân từng truy vấn của một câu lệnh UNION phải xuất hiện theo thứ tự như nhau. Nguyên nhân là do phép hợp so sánh các cột từng cột một theo thứ tự được cho trong mỗi truy vấn.
• Khi các kiểu dữ liệu khác nhau được kết hợp với nhau trong câu lệnh UNION, chúng sẽ được chuyển sang kiểu dữ liệu cao hơn (nếu có thể được).
• Tiêu đề cột trong kết quả của phép hợp sẽ là tiêu đề cột được chỉ định trong truy vấn đầu tiên.
b. Mệnh đề INTERSECT Cú pháp
(SELECT [DISTINCT]<biểu thức 1>, <biếu thức 2>, ...
FROM <tên bảng 1>, <tên bảng 2>, ...
[WHERE <điều kiện chọn>]) INTERSECT [ALL]
(SELECT [DISTINCT]<biểu thức 1>, <biếu thức 2>, ...
FROM <tên bảng 1>, <tên bảng 2>, ...
[WHERE <điều kiện chọn>])
Theo mặc định, phép toán INTERSECT sẽ loại bỏ những dòng giống nhau trong kết quả. Nếu ta sử dụng tùy chọn ALL thì các dòng giống nhau sẽ không bị loại bỏ.
Ví dụ 3.57. Lập danh sách các sinh viên quê ở “Nghệ An” được học bổng kỳ 2 năm học 2017 – 2018.
(SELECT *
107
FROM SINH_VIEN
WHERE QueQuan=“Nghệ An”) INTERSECT
(SELECT *
FROM HOC_BONG
WHERE HocKy=2 AND NamHoc=”2017 – 2018”);
c. Mệnh đề EXCEPT Cú pháp
(SELECT [DISTINCT]<biểu thức 1>, <biếu thức 2>, ...
FROM <tên bảng 1>, <tên bảng 2>, ...
[WHERE <điều kiện chọn>]) EXCEPT [ALL]
(SELECT [DISTINCT]<biểu thức 1>, <biếu thức 2>, ...
FROM <tên bảng 1>, <tên bảng 2>, ...
[WHERE <điều kiện chọn>])
Ví dụ 3.58. Đưa ra mã sinh viên, họ tên sinh viên của các sinh viên quê ở
“Nghệ An” không được học bổng kỳ 2 năm học 2017 – 2018.
(SELECT MaSV, HoTenSV
FROM SINH_VIEN
WHERE QueQuan=“Nghệ An”) EXCEPT
(SELECT MaSV, HoTenSV
FROM HOC_BONG
WHERE HocKy=2 AND NamHoc=”2017 – 2018”);
108
TÓM TẮT CUỐI CHƯƠNG 3
✓ SQL là ngôn ngữ phi thủ tục được dùng phổ biến trong hầu hết các hệ thống sử dụng CSDL, nó cho phép định nghĩa và thao tác các CSDL quan hệ.
✓ Câu lệnh SELECT – FROM – WHERE là câu lệnh cơ sở và quan trọng nhất của SQL, là tổ hợp của 3 phép cơ bản trên quan hệ: chọn (WHERE), chiếu (SELECT), kết nối (FROM), nó được sử dụng để biểu diễn một câu hỏi (truy vấn, yêu cầu). Kết quả mà câu lệnh này trả về cho một truy vấn là một bảng gồm một (hay nhiều) cột, nhiều (đôi khi không) bản ghi (dòng) nào.
✓ Câu lệnh SELECT được sử dụng để truy xuất dữ liệu từ các dòng và các cột của một hay nhiều bảng, khung nhìn. Câu lệnh này có thể dùng để thực hiện phép chọn (tức là truy xuất một tập con các dòng trong một hay nhiều bảng), phép chiếu (tức là truy xuất một tập con các cột trong một hay nhiều bảng) và phép nối (tức là liên kết các dòng trong hai hay nhiều bảng để truy xuất dữ liệu). Ngoài ra, câu lệnh này còn cung cấp khả năng thực hiện các thao tác truy vấn và thống kê dữ liệu phức tạp khác.
✓ Mệnh đề FROM trong câu lệnh SELECT được sử dung nhằm chỉ định các bảng và khung nhìn cần truy xuất dữ liệu. Sau FROM là danh sách tên của các bảngvà khung nhìn tham gia vào truy vấn, tên của các bảng và khung nhìn được phân cách nhau bởi dấu phẩy.
✓ Mệnh đề WHERE trong câu lệnh SELECT được sử dụng nhằm xác định các điều kiện đối với việc truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu thức logic và chỉ những dòng dữ liệu nào thoả mãn điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn.
✓ SQL hỗ trợ 5 hàm toán học (gộp, kết tập): MAX, MIN, COUNT, AVG, SUM. Các hàm này coi toàn bộ một cột như một tham số và tính toán để trả về kết quả là một giá trị.
✓ Mệnh đề GROUP BY cho phép những thông tin tổng kết được chứa trong một bảng kết quả. Các bản ghi có cùng giá trị ở một hay một số cột nào đó được gộp lại thành một nhóm và được coi là một đơn vị tham số khi áp dụng với các hàm gộp.
Nghĩa là, mỗi nhóm sẽ tương ứng với một kết quả khi thực hiện hàm gộp. Mệnh đề HAVING có vai trò như mệnh đề WHERE đối với các nhóm, nó đặc tả điều kiện chọn các nhóm đưa ra bảng kết quả. Tuy nhiên, khác với mệnh đề WHERE, mệnh đề HAVING có thể chứa các hàm gộp.
✓ Một truy vấn con là một câu lệnh SELECT – FROM – WHERE nhúng trong một truy vấn khác. Các truy vấn con có thể xuất hiện trong mệnh đề WHERE hay mệnh đề HAVING. Kết quả của truy vấn con là một bảng kết quả trung gian, bảng này sẽ được truy cập bởi các truy vấn ngoài. Một truy vấn con có thể được nhúng trong một truy vấn con khác.
✓ SQL cho phép định nghĩa (câu lệnh CREATE) hay huỷ bỏ (câu lệnh DROP) lược đồ CSDL, khai báo các ràng buộc toàn vẹn và tạo chỉ mục để tăng tốc độ tìm kiếm (câu lệnh CREATE INDEX).
✓ SQL cũng hỗ trợ các phép toán tập hợp: hợp (UNION), giao (INTERSECT), trừ (EXCEPT).
109
CÂU HỎI ÔN TẬP CHƯƠNG 3
3.1. SQL là gì? Với ngôn ngữ SQL ta có thể làm được những gì?
3.2. Hãy giải thích mỗi mệnh đề trong cấu trúc SELECT, nêu điều kiện cho mỗi mệnh đề đó.
3.3. Làm thế nào để lấy được tất cả các bản ghi trong một bảng xác định?
3.4. Trình bày định nghĩa từ khóa “JOIN” và các loại “JOIN” khác nhau?
3.5. Dùng cú pháp nào để thêm bản ghi vào một bảng? thêm một cột vào bảng?
3.6. Trình bày các phép toán so sánh, logic, các lượng từ so sánh trong ngôn ngữ SQL.
3.7. Hãy giải thích cách thực hiện của câu GROUP BY.
3.8. Hãy giải thích sự khác nhau giữa mệnh đề HAVING và WHERE?
3.9. SQL cho phép cài đặt các ràng buộc toàn vẹn như thế nào?
3.10. Trình bày các câu lệnh cập nhật dữ liệu trong SQL.
3.11. Cho ví dụ về các hàm gộp trong SQL.
110
BÀI TẬP CHƯƠNG 3
Bài 3.1. Cho lược đồ cơ sở dữ liệu quản lý giải bóng đá quốc gia Việt Nam với các quan hệ như sau:
Quan hệ CẦU THỦ (CAUTHU) gồm các thuộc tính: Mã cầu thủ (MaCT), họ tên (HoTen), vị trí (ViTri, vị trí trên sân của các cầu thủ thuộc một trong các vị trí sau:
thủ môn, tiền đạo, tiền vệ, trung vệ, hậu vệ), ngày sinh (NgaySinh), địa chỉ (DiaChi), mã câu lạc bộ (MaCLB), mã quốc gia (MaQG).
Quan hệ QUỐC GIA (QUOCGIA) gồm các thuộc tính: Mã quốc gia (MaQG), tên quốc gia (TenQG).
Quan hệ CÂU LẠC BỘ (CAULACBO) gồm các thuộc tính: Mã câu lạc bộ (MaCLB), Tên câu lạc bộ (TenCLB), sân vận động (SanVĐ), tỉnh thành (Tinh).
Quan hệ TRẬN ĐẤU (TRANDAU) gồm các thuộc tính: mã số trận đấu (MaTran), mùa giải (Nam), vòng đấu (Vong), ngày thi đấu (NgayTD), mã câu lạc bộ chủ nhà (MaCLB1), mã câu lạc bộ khách (MaCLB2), sân của đội chủ nhà (SanVĐ), câu lạc bộ chủ nhà (có mã MaCLB1) ghi được số bàn thắng là SBT1, câu lạc bộ khách (có mã MaCLB2) ghi được số bàn thắng là SBT2).
Chuyển các biểu thức đại số quan hệ sau sang SQL a, Пhoten, ngaysinh(σvitri=”Thủ môn”(CAUTHU))
b, ПMaCLB,TenCLB,SanVĐ(σTinh=”Hải Phòng”(CAULACBO)) c, ПMaQG,TenQG(r2)
d, ПMaQG(σTenQG=”Việt Nam”(QUOCGIA))
e, ПHoten, Ngaysinh,diachj,MaCLB,MaQG(σVitri=”Tiền đạo”(CAUTHU)) f, ПMaCLB,TenCLB(CAULACBO)
g, ПHoten, Ngaysinh,diachj(r1*r2*r3)
h,=ПMaCLB1(σVòng=20 and Nam=2015(TRANDAU)) i, r1*CAULACBO
k, ПMaCLB,TenCLB,SanVĐ(r2)
Thực hiện các yêu cầu sau bằng ngôn ngữ SQL:
a, Lập danh sách các câu lạc bộ ở “Hải Phòng”. Danh sách gồm các thông tin:
mã câu lạc bộ, tên công lạc bộ, sân vận động.
b, Đếm số cầu thủ thi đấu ở vị trí “Hậu vệ”.
c, Lập danh sách các câu lạc bộ thi đấu trên sân nhà ở vòng 20 giải vô địch quốc gia năm 2016. Danh sách gồm các thông tin: mã câu lạc bộ, tên công lạc bộ, sân vận động.
d, Lập danh sách các cầu thủ quốc tịch “Thái Lan” của đội bóng “Hoàng Anh Gia Lai”. Danh sách gồm các thông tin: họ tên, ngày sinh, địa chỉ và vị trí của các cầu thủ.
e, Lập danh sách các câu lạc bộ mà đội bóng “Bình Dương” chưa bao giờ thắng. Danh sách gồm các thông tin: mã câu lạc bộ, tên câu lạc bộ.
111
Bài 3.2. Cho lược đồ cơ sở dữ liệu quản lý bạn đọc thư viện gồm các quan hệ sau:
DOCGIA (SoThe, HoTen, GT, DiaChi, Email) SACH (MaS, TenS, TG, Loai, NXB, SL) MUON (SoThe, MaS, NgM, NgHT) Trong đó:
DOCGIA: Quan hệ độc giả, lưu danh sách các độc giả
SoThe: Số thẻ của độc giả, mỗi độc giả được cấp một số thẻ HoTen: Họ và tên của độc giả
GT: Giới tính của độc giả DiaChi: Địa chỉ liên hệ của độc giả Email: Địa chỉ mail của độc giả
SACH: quan hệ sách, lưu trữ các thông tin về sách MaS: mã sách, mỗi quyển sách có một mã riêng TenS: Tên sách
TG: Tên tác giả quyển sách
Loai: Thể loại sách (như tiểu thuyết, thơ, tuyển tập, …) NXB: Tên nhà xuất bản
SL: số lượng sách còn lại trong kho.
MUON: quan hệ mượn, lưu trữ thông tin mượn sách của các độc giả SoThe: Số thẻ của người mượn
MaS: Mã sách đã mượn NgM: Ngày mượn sách NgHT: Ngày hẹn trả sách
Chuyển các biểu thức đại số quan hệ sau sang SQL a, MaLoai, TenLoai(TenLoai=“Sách giáo trình“ (THE_LOAI))
b, B = (GT = “Nam” NS=1994); X={SoThe, HoTen}; X (B(DOCGIA)) c, X = {MaS, TenS, MaLoai }; B = (NXB=“Khoa học và kỹ thuật”)
r1=X(B(SACH))
r2=MaLoai, TenLoai(TenLoai=“Sách giáo trình“ (THE_LOAI)) r3=MaLoai, TenLoai(r1*r2)
d, B = (TENS = “Cơ sở dữ liệu”) (TG = “PGS.TS Hồ Thuần”)
A = (Month(NgM) = Month(Today)); C=(TheLoai=”Giáo trình”); X={SoThe, HoTen, NgM, NgHT}
X (B(SACH) *(A(MUON) *(C(THE_LOAI) * SoThe, HoTen (DOCGIA)) Hãy thực hiện các yêu cầu sau bằng ngôn ngữ SQL:
a, Lập danh sách các độc giả nam có địa chỉ ở Thành phố Thanh Hóa, các thông tin đưa ra bao gồm: số thẻ của độc giả, họ và tên độc giả, năm sinh.
b, Lập danh sách các sách có thể loại là tiểu thuyết do nhà xuất bản Văn học phát hành, các thông tin cần đưa ra bao gồm: mã sách, tên sách, tên tác giả.
112
c, Lập danh sách các quyển sách của tác giả “Trần Thị Bảo Châu” do nhà xuất bản
“Đà Nẵng” phát hành, các thông tin cần đưa ra bao gồm: mã sách, tên sách, số lượng sách còn lại trong kho.
d, Lập danh sách các quyển sách của nhà xuất bản Giáo dục đã được mượn trong tháng này, các thông tin cần đưa ra bao gồm: mã sách, tên sách, tên tác giả.
e, Lập danh sách các độc giả có hẹn trả sách ngày hôm nay, các thông tin cần đưa ra bao gồm: số thẻ của độc giả, họ và tên độc giả, mã sách đã mượn, địa chỉ liên hệ.
f, Lập danh sách các độc giả đang mượn cuốn “Phân tích thiết kế hệ thống” của tác giả “Đào Kiến Quốc”, các thông tin cần đưa ra bao gồm: số thẻ, họ và tên của độc giả.
Bài 3.3.Cho lược đồ cơ sở dữ liệu quản lý dự án gồm các quan hệ sau DUAN (MaDA, TenDA, ĐĐ, NgBD, NgKT, VonDT) NV (MaNV, TenNV, NS, GT, QQ, NN, Luong) CONG (MaNV, MaDA, NgC)
Trong đó:
DUAN: quan hệ dự án, lưu trữ thông tin về các dự án MaDA: mã dự án, mỗi dự án có một mã duy nhất TenDA: tên dự án
ĐĐ: địa điểm thực hiện dự án NgBD: ngày bắt đầu dự án
NgKT: ngày kết thúc dự án (dự kiến) VonDT: vốn đầu tư của dự án
NV: quan hệ nhân viên, lưu trữ thông tin về các nhân viên MaNV: mã nhân viên, mỗi nhân viên có một mã nhân viên TenNV: họ và tên nhân viên
NS: năm sinh của nhân viên GT: giới tính của nhân viên QQ: quê quán của nhân viên NN: nghề nghiệp của nhân viên Luong: lương hàng tháng của nhân viên
CONG: biểu diễn ngày công của mỗi nhân viên thực hiện ở dự án NgC: ngày công mà mỗi nhân viên thực hiện ở mỗi dự án Hãy thực hiện các yêu cầu sau bằng ngôn ngữ SQL:
a, Lập danh sách nhân viên quê ở Thanh Hoá, nghề nghiệp kỹ sư và có mức lương lớn hơn 10 triệu đồng, các thông tin cần đưa ra bao gồm: họ và tên, giới tính và năm sinh.
b, Lập danh sách những dự án bắt đầu và kết thúc trong năm nay, các thông tin cần đưa ra bao gồm: mã dự án, tên dự án, địa điểm thực hiện dự án, vốn đầu tư của dự án.
c, Lập danh sách các nhân viên làm việc ở dự án có mã dự án là “MLHC”, các thông tin cần đưa ra bao gồm: tên dự án, họ và tên nhân viên và ngày công mà nhân viên đó tham gia trong dự án.
113
d, Lập danh sách nhân viên có nghề nghiệp là kỹ sư làm việc ở dự án có tên là
“Cầu Nguyệt Viên”, các thông tin cần đưa ra bao gồm: mã nhân viên, họ và tên nhân viên, năm sinh của nhân viên.
e, Tính tổng số ngày công của mỗi dự án, các thông tin cần đưa ra bao gồm: mã dự án, tên dự án và tổng số ngày công.
f, Lập danh sách nhân viên đã làm tổng cộng trên 300 ngày công, các thông tin cần đưa ra bao gồm: mã nhân viên, họ và tên nhân viên, số ngày công đã thực hiện.
Bài 3.4. Cho lược đồ cơ sở dữ liệu dùng để quản lý sinh viên bao gồm các quan hệ:
SINHVIEN (MaSV, HoTen, GioiTinh, NamSinh, QueQuan, HocBong, MaLop) LOP (MaLop, TenLop, Nam, MaKH)
KHOA (MaKH, TenKH, TenTK, SoCBGD).
Trong đó:
SINHVIEN: Quan hệ sinh viên, lưu trữ các thông tin về sinh viên MaSV: Mã sinh viên, mỗi sinh viên có một mã sinh viên.
HoTen: Họ và tên sinh viên GioiTinh: Giới tính
NamSinh: Năm sinh của sinh viên QueQuan: Quê quán của sinh viên
HocBong: Học bổng mà sinh viên nhận được.
LOP: Quan hệ lớp, lưu trữ thông tin về các lớp MaLop: Mã lớp, mỗi lớp có một mã lớp
TenLop: Tên lớp
Nam: Năm nhập học
KHOA: Quan hệ khoa, lưu trữ thông tin về các khoa MaKH: Mã khoa, mỗi khoa có một mã khoa.
TenKH: Tên khoa
TenTK: Tên trưởng khoa
SoCBGD: Số lượng cán bộ giảng dạy của mỗi khoa.
Hãy thực hiện các yêu cầu sau bằng ngôn ngữ SQL:
a, Lập danh sách sinh viên, các thông tin cần đưa ra là: họ và tên sinh viên, ngày sinh.
b, Lập danh sách sinh viên có học bổng không bé hơn hai trăm ngàn đồng, các thông tin cần đưa ra là: mã sinh viên, họ và tên sinh viên, học bổng.
c, Lập danh sách sinh viên nam học ở lớp có tên lớp là CĐ CNTT K34, các thông tin cần đưa ra là: mã sinh viên, họ và tên sinh viên, giới tính.
d, Lập danh sách các sinh viên học ở khoa có số lượng cán bộ giảng dạy lớn nhất, các thông tin cần đưa ra là: mã sinh viên, họ và tên sinh viên, tên lớp.
e, Lập danh sách các lớp của khoa có tên là “Công nghệ thông tin và truyền thông”
nhập học trong năm 2014, các thông tin cần đưa ra là: mã lớp, tên lớp.
f, Đếm số sinh viên nam của lớp có mã lớp là “CNTT01”.
114