CƠ SỞ DỮ LIỆU
( Databases )
Chương 3: Ngôn ngữ truy vấn SQL
Nội dung
1.
2.
3.
4.
5.
6.
7.
8.
Khái quát về ngôn ngữ truy vấn dữ liệu
Câu lệnh SELECT
Các hàm thao tác dữ liệu
Truy vấn thông tin từ nhiều bảng
Các lệnh cập nhật dữ liệu
Các lệnh liên quan tới cấu trúc
Các lệnh giao quyền truy cập CSDL
Bài tập
Chương 3 - Ngôn ngữ truy vấn SQL
2
3.1. Giới thiệu SQL
SQL được xem là yếu tố chính đóng góp vào sự thành
công của CSDL quan hệ khi áp dụng trong thực tế.
Là ngôn ngữ mức cao, người dùng chỉ cần xác định kết
quả của truy vấn là gì, phần còn lại là tính toán và tối ưu
hoá câu lệnh được DBMS đảm nhiệm.
1970: SQL (Structured Query Language) bắt nguồn từ
ngôn ngữ SEQUEL (Structured English QUEry
Language), ngôn ngữ được thiết kế tại tập đoàn IBM
nhằm khi đưa ra hệ quản trị CSDL có tên là SYSTEM-R
Chương 3 - Ngôn ngữ truy vấn SQL
3
3.1. Giới thiệu SQL (tt)
Năm 1976: SEQUEL được cải tiến thành SEQUEL2
Năm 1978-1979: SEQUEL2 được nâng cấp và đổi
tên thành SQL (nhưng vẫn đọc là SEQUEL)
Chuẩn SQL đầu tiên có tên gọi SQL-86 (SQL1) được
công nhận và chuẩn hóa bởi ANSI và ISO.
Năm 1992: SQL1 được mở rộng với nhiều tính năng
mới và được gọi là SQL-92 (SQL2).
Năm 1999: Chuẩn SQL-99 (SQL3) ra đời
Phiên bản mới nhất hiện nay là SQL-2011
Chương 3 - Ngôn ngữ truy vấn SQL
4
3.1. Giới thiệu SQL (tt)
Ngôn ngữ giao thiết CSLD gồm:
–
–
–
–
DDL – Data Definition Language
DML – Data Manipulation Language
SQL – Structured Query Language
DCL – Data Control Language
SQL gồm 2 nhóm lệnh
– DDL: Tạo cấu trúc CSDL
– DML: Thao tác trên CDSDL
• CREATE
• SELECT
• INSERT, UPDATE, DELETE…
Chương 3 - Ngôn ngữ truy vấn SQL
5
Lược đồ CSDL sử dụng
NHANVIEN (MANV,HONV, TENLOT, TENNV, PHAI,
LUONG, DIACHI, NGAYSINH, MA_NQL, PHG)
PHONGBAN (MAPB, TENPB, TRPHG, NGAYBĐ)
DIADIEM_PHG (MAPB, DIADIEM)
DEAN (MADA, TENDA, NGAYBD, PHONG, DIADIEM_DA)
PHANCONG (MANV, MADA, THOIGIAN)
THANNHAN (MANV,TENTN,PHAI,NGAYSINH,QUANHE)
Chương 3 - Ngôn ngữ truy vấn SQL
6
3.2. lệnh SELECT – Truy vấn dữ liệu
Gồm 3 mệnh đề cơ bản
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
– <danh sách các cột>
• Tên các cột cần hiển thị ở kết quả truy vấn
– <danh sách các bảng>
• Tên các bảng (nguồn) dữ liệu khi truy vấn
– <điều kiện>
• Xác định biểu thức boolean xác định dòng (bộ) nào được trích
ra
• Nối các biểu thức: AND, OR, NOT
• Phép toán: >, <, <=, >=, =, <>, LIKE, BETWEEN
Chương 3 - Ngôn ngữ truy vấn SQL
7
3.2. lệnh SELECT (tt)
SQL và Đại số quan hệ
π
SELECT <danh sách các cột>
x
FROM <danh sách các bảng>
WHERE <điều kiện>
σ
SELECT L
FROM
R
WHERE
C
πL(σC(R ))
Chương 3 - Ngôn ngữ truy vấn SQL
8
Ví dụ
Lấy tất cả các cột
của quan hệ
SELECT *
FROM NHANVIEN
WHERE PHG=5
σ
PHG=5(NHANVIEN)
Chương 3 - Ngôn ngữ truy vấn SQL
9
Mệnh đề SELECT
Chương 3 - Ngôn ngữ truy vấn SQL
10
Mệnh đề SELECT (tt)
Tên, Bí danh
SELECT MANV, HONV AS 'Họ', TENLOT AS ‘Tên lót’, TENNV AS 'Tên'
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
ρ
(
MANV,HO,TEN LOT,TEN
π
σ
MaNV,HONV,TENLOT,TENNV
PHG=5∧PHAI=‘Nam’(NHANVIEN)))
Chương 3 - Ngôn ngữ truy vấn SQL
11
Mệnh đề SELECT (tt)
Mở rộng:
SELECT MANV, HONV +’ ‘+ TENLOT+’ ‘ TENNV AS ‘HO TEN’
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
Chương 3 - Ngôn ngữ truy vấn SQL
12
Mệnh đề SELECT (tt)
Mở rộng:
SELECT MANV, LUONG*1.1 AS ‘LUONG10%’
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
Chương 3 - Ngôn ngữ truy vấn SQL
13
Mệnh đề SELECT (tt)
Loại bỏ các dòng trùng nhau
SELECT LUONG
FROM NHANVIEN
SELECT DISTINCT LUONG
WHERE PHG=5 AND PHAI=‘Nam’
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
Chương 3 - Ngôn ngữ truy vấn SQL
14
Ví dụ
Cho biết MANV và TENNV làm việc ở phòng ‘Nghien
cuu’
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG AND TENPGH=‘Nghien cuu’
15
Chương 3 - Ngôn ngữ truy vấn SQL
Mệnh đề WHERE
Biểu thức luận lý
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG AND TENPHG=‘Nghien cuu’
TRUE
TRUE
Chương 3 - Ngôn ngữ truy vấn SQL
16
Mệnh đề WHERE (tt)
Độ ưu tiên
– Viết trước thực hiện trước
– Trong ngoặc thực hiện trước
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE (TENPHG=‘Nghien cuu’ OR TENPHG=‘Quan ly’) AND PHG=MAPHG
Chương 3 - Ngôn ngữ truy vấn SQL
17
Mệnh đề WHERE (tt)
BETWEEN
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG>=2000000 AND LUONG<=3000000
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG BETWEEN 2000000 AND 3000000
NOT BETWEEN
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG NOT BETWEEN 2000000 AND 3000000
Chương 3 - Ngôn ngữ truy vấn SQL
18
Mệnh đề WHERE (tt)
IN
NOT IN
SELECT MANV, TENNV
SELECT MANV, TENNV
FROM NHANVIEN
FROM NHANVIEN
WHERE PHG IN (4,5)
WHERE PHG NOT IN (4,5)
SELECT MANV, TENNV
FROM NHANVIEN
WHERE PHG = 4 OR PHG=5
19
Chương 3 - Ngôn ngữ truy vấn SQL
Mệnh đề WHERE (tt)
LIKE
– Lấy tất cả chuỗi giống với mẫu
SELECT MANV, TENNV
FROM NHANVIEN
WHERE HONV LIKE ‘Nguyen_ _ _ _’
1 Ký tự bất kỳ
SELECT MANV, TENNV
FROM NHANVIEN
WHERE HONV LIKE ‘Nguyen %’
Nhiều ký tự bất kỳ
NOT LIKE
– Lấy tất cả những chuỗi không giống
Chương 3 - Ngôn ngữ truy vấn SQL
20
Mệnh đề WHERE (tt)
NULL
– Sử dụng trong trường hợp:
• Không biết (value unknown)
• Không thể áp dụng (value inapplicable)
• Không tồn tại (value un witheld)
SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NULL
SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NOT NULL
Chương 3 - Ngôn ngữ truy vấn SQL
21
Mệnh đề WHERE (tt)
Không sử dụng WHERE
– Kết quả là phép tích “đề-các”
Chương 3 - Ngôn ngữ truy vấn SQL
22
Mệnh đề FROM
Tên, Bí danh
SELECT TENPHG, DIADIEM
SELECT TENPHG, DIADIEM
FROM PHONGBAN, DDIEM_PHG
FROM PHONGBAN, DDIEM_PHG
WHERE MAPHG=MAPHG
WHERE PhongBan.MAPHG=DDiem_PHG.MAPHG
Bí danh
Chương 3 - Ngôn ngữ truy vấn SQL
23
Mệnh đề ORDER BY
Dùng để hiển thị kết quả truy vấn theo thứ tự
Cú pháp:
SELECT <danh sách cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
ORDER BY <danh sách cột sắp xếp>
– ASC: Sắp xếp tăng (mặc định)
– DESC: Sắp xếp giảm
Chương 3 - Ngôn ngữ truy vấn SQL
24
Mệnh đề ORDER BY (tt)
Ví dụ:
SELECT MANV, MADA
FROM PHANCONG
ORDER BY MANV DESC, MADA
MANV
MADA
999888777
10
999888777
30
888777666
10
888777666
30
333222111
10
333222111
20
333222111
30
Chương 3 - Ngôn ngữ truy vấn SQL
25
Gom nhóm - GROUP BY
Cú pháp:
SELECT <danh sách cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
GROUP BY <danh sách cột gom nhóm>
Mỗi bộ trong nhóm sẽ có cùng giá trị tại các thuộc tính
gom nhóm.
Chú ý:
– Mỗi thuộc tính liệt kê sau SELECT sẽ có 1 giá trị ứng với
mỗi nhóm.
– Tất cả các thuộc tính sau SELECT phải xuất hiện ở sau
mệnh đề GROUP BY (Trừ thuộc tính có giá trị là hàm)
– Có thể có thuộc tính xuất hiện ở GROUP BY nhưng không
xuất hiện ở SELECT
Chương 3 - Ngôn ngữ truy vấn SQL
26
Mệnh đề GROUP BY (tt)
Ví dụ: Cho biết số lượng nhân viên ở mỗi phòng ban
SELECT PHG, COUNT(*) AS ‘So NV’
FROM NHANVIEN
GROUP BY PHG
Hoặc
SELECT T ENPHG, COUNT(*) AS ‘So NV’
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG
GROUP BY TENPHG
27
Chương 3 - Ngôn ngữ truy vấn SQL
Mệnh đề GROUP BY (tt)
Ví dụ: Hãy cho biết mã nhân viên, số lượng đề án và
tổng thời gian mà họ tham gia
MaNV
SELECT MaNV, COUNT(*) AS ‘So DA’,
SUM(THOIGIAN) AS ‘Tong TG’
FROM PHANCONG
GROUP BY MaNV
SELECT NV.MaNV, TENV,
So DA
Tong TG
999888777
10
32.5
999888777
30
10
888777666
10
10
888777666
30
10
333222111
10
35.7
333222111
20
25
333222111
30
5
COUNT(*) AS ‘So DA’,
SUM(THOIGIAN) AS ‘Tong TG’
FROM PHANCONG PC, NHANVIEN NV
WHERE PC.MaNV = NV.MaNV
GROUP BY PC.MaNV, TenNV
MaNV
So DA
Tong TG
999888777
2
42.5
888777666
2
20
333222111
3
65.7
Chương 3 - Ngôn ngữ truy vấn SQL
28
Mệnh đề HAVING
Ví dụ: Hãy tìm những nhân viên tham gia từ 2 đề án
trở lên.
MaNV
So DA
Tong TG
999888777
10
32.5
999888777
30
10
888777666
10
10
888777666
30
10
333222111
10
35.7
333222111
20
25
333222111
30
5
555444333
30
15
Bị loại ra
Chương 3 - Ngôn ngữ truy vấn SQL
29
Mệnh đề HAVING (tt)
Được sử dụng khi cần lọc ra những nhóm thỏa mãn
điều kiện nào đó
Cú pháp:
SELECT <danh sách cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
GROUP BY <danh sách cột gom nhóm>
HAVING <điều kiện chọn nhóm>
Ví dụ:
– Tìm mã những nhân viên tham gia nhiều hơn 2 Đề án
SELECT MaNV, COUNT(*) AS ‘So DA’,
FROM PHANCONG
GROUP BY MaNV
HAVING COUNT (*) > 2
Chương 3 - Ngôn ngữ truy vấn SQL
30
Mệnh đề HAVING (tt)
Cho biết những phòng ban có lương trung bình của
nhân viên lớn hơn 3 triệu
SELECT PHG, AVG(LUONG) AS ‘Luong TB’
FROM NHANVIEN
GROUP BY PHG
HAVING AVG(LUONG) > 3000000
Hoặc
SELECT NV.PHG, PB.TenPB, Avg(NV.Luong) AS "TB Luong"
FROM NhanVien AS NV, PhongBan AS PB
WHERE NV.Phg = PB.MaPB
GROUP BY NV.PHG, PB.TenPB
HAVING AVG(LUONG) > 3000000;
Chương 3 - Ngôn ngữ truy vấn SQL
31
3.3. Các hàm thao tác dữ liệu (tt)
Các hàm tính toán trên bản ghi
–
–
–
–
–
–
–
–
ABS: tính trị tuyệt đối
POWER(x, y): trả về xy
SQRT: Tính căn bậc 2
LOG: Tính Log tự nhiên
EXP: Tính ex
SIGN (x): Kiểm tra dấu của x (trả về -1 | 0 | 1)
ROUND (x, n): làm tròn x tới n số lẻ (Access là RND)
Các hàm lượng giác: SIN, COS, TAN, ASIN, ACOS,…
Chương 3 - Ngôn ngữ truy vấn SQL
32
3.3. Các hàm thao tác dữ liệu (tt)
Các hàm xử lý chuỗi
–
–
–
–
LEN (str) : Cho chiều dài chuỗi ký tự
LEFT (str, n): Lấy n ký tự phía trái của chuỗi str
RIGHT (str, n): Lấy n ký tự phía phải của chuỗi str
MID (str, p, n): Lấy n ký tự của chuỗi str kể từ vị trí p
trong dãy
Chương 3 - Ngôn ngữ truy vấn SQL
33
3.3. Các hàm thao tác dữ liệu (tt)
Các hàm xử lý thời gian
– DATE(): Cho ngày tháng năm hiện tại
– DAY (dd): Cho số thứ tự ngày trong tháng của biểu
thức ngày dd
– MONTH (dd) Cho số thứ tự tháng trong năm của biểu
thức ngày dd
– YEAR (dd) Cho năm của biểu thức ngày dd
– HOUR (tt) Cho giờ trong ngày (0- 23)
– MINUTE (tt) Cho số phút của thời gian tt
– SECONDS (tt) Cho số giây của biểu thức giờ tt.
Chương 3 - Ngôn ngữ truy vấn SQL
34
3.4. Truy vấn từ nhiều bảng
Truy vấn trên nhiều bảng về bản chất giống như truy
vấn trên 1 bảng (đã kết nhiều bảng lại).
Sử dụng các phép kết (join)
– Kết bằng (phép kết nội – inner join)
– Kết ngoài (outter join)
– Truy vấn lồng nhau
Chương 3 - Ngôn ngữ truy vấn SQL
35
3.4. Truy vấn từ nhiều bảng (tt)
Phép kết tự nhiên
SELECT <danh sách cột>
FROM <danh sách các bảng>
WHERE <điều kiện kết nối>
Hoặc
SELECT <danh sách cột>
FROM <bảng 1> INNER JOIN <bảng 2> ON <điều kiện kết nối>
WHERE <điều kiện chọn dòng>
Ví dụ: Đưa ra danh sách nhân viên và tên phòng làm việc
SELECT HoNV, Tenlot, TenNV, TenPB
FROM Nhanvien, PhongBan
WHERE PHG = MaPB
Chương 3 - Ngôn ngữ truy vấn SQL
36
3.4. Truy vấn từ nhiều bảng (tt)
Ví dụ: Tìm mã và họ tên các nhân viên làm việc ở
phòng ‘Kinh doanh’
SELECT MaNV, HoNV +’ ‘ + Tenlot + ‘ ‘ + TenNV AS ‘Ho ten’, TenPB
FROM Nhanvien INNER JOIN PhongBan ON PHG = MaPB
WHERE TenPB LIKE ‘%Kinh doanh’
Hoặc:
SELECT MaNV, HoNV +’ ‘ + Tenlot + ‘ ‘ + TenNV AS ‘Ho ten’, TenPB
FROM Nhanvien, PhongBan
WHERE PHG = MaPB AND TenPB LIKE ‘%Kinh doanh’
Chương 3 - Ngôn ngữ truy vấn SQL
37
3.4. Truy vấn từ nhiều bảng (tt)
Phép kết ngoài
SELECT <danh sách cột>
FROM <bảng 1> LEFT | RIGHT | [OUTTER] JOIN <bảng 2>
ON <điều kiện kết>
WHERE <điều kiện chọn dòng>
Chương 3 - Ngôn ngữ truy vấn SQL
38
3.4. Truy vấn từ nhiều bảng (tt)
Ví dụ: Cho biết nhân viên và tên của phòng ban mà
họ là trưởng phòng (nếu có)
SELECT HoNV, Tenlot, TenNV, TenPB
FROM NhanVien NV LEFT JOIN PhongBan PB
ON NV.MaNV=PhongBan.TrgPhg
Chương 3 - Ngôn ngữ truy vấn SQL
39
3.4. Truy vấn từ nhiều bảng (tt)
Ví dụ: Tìm họ tên nhân viên và tên thân nhân của họ
(nếu có)
SELECT NV.MaNV, HoNV, TenLot, TenNV, TenTN, Quanhe
FROM ThanNhan TN RIGHT JOIN NhanVien NV
ON TN.MaNV = NV.MaNV
Chương 3 - Ngôn ngữ truy vấn SQL
40
3.4. Truy vấn từ nhiều bảng (tt)
Truy vấn lồng nhau
– Một câu truy vấn (SELECT) lồng vào câu truy vấn khác
gọi là truy vấn lồng nhau hay Subquery
– Subquery được bao bởi cặp dấu ngoặc (.......) và có thể
lồng nhau nhiều mức.
– Subquery được lồng vào sau từ khóa WHERE hoặc
HAVING
– Câu truy vấn con thường trả về 1 tập các giá trị
– Nếu có nhiều truy vấn con sau WHERE thì thường
được kết hợp với nhau bởi các phép toán logic
Chương 3 - Ngôn ngữ truy vấn SQL
41
Truy vấn lồng nhau (tt)
Truy vấn cha
SELECT <danh sách cột>
FROM <danh sách bảng>
WHERE <so sánh tập hợp> (
SELECT <danh sách cột>
FROM <danh sách bảng>
WHERE <điều kiện>
)
Truy vấn con
Chương 3 - Ngôn ngữ truy vấn SQL
42
Truy vấn lồng nhau (tt)
Các phép toán tập hợp
–
–
–
–
–
–
IN
NOT IN
ALL
ANY / SOME
EXISTS
NOT EXISTS
Chương 3 - Ngôn ngữ truy vấn SQL
43
Truy vấn lồng nhau (tt)
Có 2 loại truy vấn lồng
– Lồng phân cấp:
• Mệnh đề WHERE của Subquery không tham chiếu đến
các thuộc tính của các bảng trong mệnh đề FROM của
truy vấn cha
• Khi thực hiện truy vấn con được thực hiện trước
– Lồng tương quan:
• Mệnh đề WHERE của Subquery tham chiếu đến ít nhất
1 thuộc tính của bảng trong mệnh đề FROM của truy
vấn cha
• Khi thực hiện, câu truy vấn con được thực nhiều lần –
mỗi lần ứng với 1 bộ của câu truy vấn cha
Chương 3 - Ngôn ngữ truy vấn SQL
44
Ví dụ - Truy vấn lồng phân cấp
Đưa ra mã nhân viên, họ tên nhân viên thuộc phòng
‘Tài chính’ hoặc phòng ‘Kế hoạch’
SELECT MaNV, HoNV, TenLot, TenNV
FROM NHANVIEN
WHERE Phg IN (
SELECT MaPHG
FROM PHONGBAN
WHERE TenPB LIKE ‘%Tài chính’ OR TenPB LIKE ‘%Kế hoạch’
)
Chương 3 - Ngôn ngữ truy vấn SQL
45
Ví dụ - Truy vấn lồng phân cấp (tt)
Hãy tìm những đề án có nhân viên họ ‘Nguyễn’ tham
gia
SELECT MaDA, TenDA
FROM DEAN
WHERE MaDA IN (
SELECT MaDA
FROM PHANCONG PC, NHANVIEN NV
WHERE PC.MaNV = NV.MaNV AND
NV.HoNV LIKE ‘%Nguyễn%’
)
Chương 3 - Ngôn ngữ truy vấn SQL
46
Ví dụ - Truy vấn lồng phân cấp (tt)
Hãy tìm những nhân viên không có thân nhân nào
SELECT *
SELECT *
FROM NHANVIEN
FROM NHANVIEN
WHERE NOT IN (
WHERE MaNV <> ALL (
SELECT MaNV
SELECT MaNV
FROM THANNHAN
FROM THANNHAN
)
)
Chương 3 - Ngôn ngữ truy vấn SQL
47
Ví dụ - Truy vấn lồng phân cấp (tt)
Tìm những nhân viên có lương lớn hơn lương của ít
nhất một nhân viên phòng 4
SELECT *
FROM NHANVIEN
WHERE LUONG > ANY (
SELECT LUONG
FROM NHANVIEN
WHERE PhG = 4
)
Chương 3 - Ngôn ngữ truy vấn SQL
48
Ví dụ - Truy vấn lồng phân cấp (tt)
Tìm những trưởng phòng có tối thiểu 1 thân nhân
SELECT *
FROM NHANVIEN
WHERE MANV IN (SELECT MaNV FROM THANNHAN) AND
MANV IN (SELECT TRPHG FROM PHONGBAN)
Tìm những Nhân viên có lương cao hơn lương của
mọi nhân viên phòng 4
Chương 3 - Ngôn ngữ truy vấn SQL
49
Truy vấn lồng tương quan
– Mệnh đề WHERE của Subquery tham chiếu đến ít
nhất 1 thuộc tính của bảng trong mệnh đề FROM của
truy vấn cha
– Khi thực hiện, câu truy vấn con được thực nhiều lần –
mỗi lần ứng với 1 bộ của câu truy vấn cha
Ví dụ:
– Tìm những trưởng phòng có ít nhất 1 thân nhân
SELECT *
FROM NHANVIEN NV
WHERE EXISTS ( SELECT * FROM THANNHAN TN
WHERE TN.MaNV = NV.MaNV) AND
EXISTS (SELECT TrgPHG FROM PHONGBAN
WHERE TrgPHG = NV.MaNV)
Chương 3 - Ngôn ngữ truy vấn SQL
50