Cơ sở dữ liệu 1
Chương 6: Ngôn ngữ truy
vấn có cấu trúc (SQL)
Giảng viên: Nguyễn Công Thương
Nội dung
Truy vấn từ một bảng
Mệnh đề SELECT và FROM
Mệnh đề WHERE
Mệnh đề GROUP BY + HAVING
Thứ tự thực thi câu truy vấn
Truy vấn từ nhiều bảng
Kết theta
Kết nội
Kết ngoại
Truy vấn lồng nhau
2
3
Ngôn ngữ truy vấn có cấu trúc
Structured Query Language (SQL)
Tên ban đầu là SEQUEL (Structured English QUEry
Language)
Các thành phần:
DDL: Create, Drop, Alter …
DML: Select, Insert, Delete, Update …
DCL: Grant, Revoke, …
Được sử dụng trong các DBMS thông dụng
Mỗi DBMS có thể có một số khác biệt
Lược đồ CSDL
4
5
Truy vấn từ một bảng
Cấu trúc:
SELECT list_of_expressions
FROM table_name;
VD:
SELECT MaNV, TenNV, NgSinh
FROM NHANVIEN;
Mệnh đề WHERE
Cấu trúc:
SELECT list_of_expressions
FROM table_name
[WHERE row_conditions];
VD: Truy vấn ngày sinh và địa chỉ của những người
có tên ‘Nguyen Bao Hung’:
SELECT NgSinh, DChi
FROM NHANVIEN
WHERE HoNV = ‘Nguyen’ AND Tenlot = ‘Bao’
AND TenNV = ‘Hung’;
6
LIKE và NOT LIKE
Cấu trúc:
[NOT] LIKE ‘string’
Ký tự đại diện
‘_’: Một ký tự bất kỳ
‘%’: Số lượng ký tự bất kỳ
[a-d]: một ký tự trong khoảng
Ví dụ:
SELECT MaNV, TenNV
FROM NHANVIEN
WHERE TenNV LIKE ‘H%’;
7
BETWEEN và NOT BETWEEN
Cấu trúc:
[NOT] BETWEEN min_value AND max_value
Ví dụ: Tìm MaNV, TenNV của những nhân viên có
lương từ 30000 đến 50000
SELECT MaNV, TenNV
FROM NHANVIEN
WHERE Luong BETWEEN 30000 AND 50000;
8
ALL/DISTINCT
SELECT [ALL/DISTINCT] list_of_expressions
FROM table_name
[WHERE row_conditions];
Ví dụ:
SELECT DISTINCT Luong
FROM NHANVIEN;
9
Hàm gộp (Aggregate function)
SELECT list_of_expressions
FROM table_name
[WHERE row_conditions]
Ví dụ:
SELECT COUNT (MaNV), AVG (Luong)
FROM NHANVIEN;
Ví dụ:
SELECT COUNT (MaNV) AS SoLuongNV, AVG
(Luong) AS LuongTB
FROM NHANVIEN;
10
Hàm gộp (Aggregate function)
Ghi chú: hàm COUNT(*) trả về số dòng kết quả
11
Mệnh đề GROUP BY
SELECT list_of_expressions
FROM table_name
[WHERE row_conditions]
[GROUP BY list_of_columns];
Ví dụ:
SELECT Phong, COUNT (MaNV), AVG (Luong)
FROM NHANVIEN
GROUP BY Phong;
12
Mệnh đề HAVING
Điều kiện trên hàm gộp:
SELECT list_of_expressions
FROM table_name
[WHERE row_conditions]
[GROUP BY list_of_columns
[HAVING aggregate_conditions]];
13
Mệnh đề HAVING (2)
Ví dụ: Tìm Phòng có số lượng nhân viên
nhiều hơn 2:
SELECT Phong, COUNT (MaNV) AS SLNV
FROM NHANVIEN
GROUP BY Phong
HAVING COUNT(MaNV) > 2;
14
Một số ràng buộc đối với mệnh
đề GROUP BY và HAVING
Thuộc tính xuất hiện trong mệnh đề SELECT:
Phải được tính hàm gộp, hoặc
Phải có trong mệnh đề GROUP BY
Thuộc tính có trong mệnh đề GROUP BY không bắt
buộc có trong mệnh đề SELECT
Phải có mệnh đề GROUP BY mới được có mệnh đề
HAVING
Phải có ít nhất một hàm gộp trong mệnh đề SELECT
hoặc mệnh đề HAVING
15
Mệnh đề ORDER BY
Sắp xếp kết quả theo một hoặc nhiều cột:
SELECT list_of_expressions
FROM table_name
[WHERE row_conditions]
[GROUP BY list_of_columns
[HAVING aggregate_conditions]]
[ORDER BY list_of_columns [ASC/DESC]];
16
Mệnh đề ORDER BY (2)
Ví dụ
SELECT MaNV, HoNV, Tenlot, TenNV, NgSinh
FROM NHANVIEN
WHERE Phong = 5
ORDER BY TenNV, HoNV, NgSinh DESC;
17
Thứ tự thực thi câu truy vấn
18
Truy vấn nhiều bảng
Kết theta
Kết tự nhiên (kết nội)
Kết ngoại
Truy vấn lồng nhau (truy vấn con)
Truy vấn con có tương quan
19
Kết theta
Cấu trúc:
SELECT list_of_expressions
FROM table_names
[WHERE conditions]
[GROUP BY list_of_columns
[HAVING aggregate_conditions]]
[ORDER BY list_of_columns];
Điều kiện kết đặt trong mệnh đề WHERE
20
Kết theta (2)
Ví dụ: Tìm MaNV, Họ tên và tên phòng ban của tất cả
nhân viên
SELECT MaNV, HoNV, Tenlot, TenNV, TenPB
FROM NHANVIEN, PHONGBAN
WHERE NHANVIEN.Phong=PHONGBAN.MaPB;
Ví dụ: Tìm MaNV, Họ tên và tên phòng ban của những
nhân viên làm việc cho phòng “Nghiên cuu”
SELECT MaNV, HoNV, Tenlot, TenNV, TenPB
FROM NHANVIEN, PHONGBAN
WHERE TenPB = ‘Nghien cuu’
AND NHANVIEN.Phong=PHONGBAN.MaPB;
21
Kết nội (kết tự nhiên)
Cấu trúc:
SELECT list_of_expressions
FROM R INNER JOIN S ON R.A = S.B
[WHERE row_conditions]
[GROUP BY list_of_columns
[HAVING aggregate_conditions]]
[ORDER BY list_of_columns];
22
Kết nội (2)
Ví dụ: Tìm MaNV, Họ tên và tên phòng ban của tất cả
nhân viên
SELECT MaNV, HoNV, Tenlot, TenNV, TenPB
FROM NHANVIEN INNER JOIN PHONGBAN
ON NHANVIEN.Phong=PHONGBAN.MaPB;
Ví dụ: Tìm MaNV, Họ tên và tên phòng ban của những
nhân viên làm việc cho phòng “Nghiên cuu”
SELECT MaNV, HoNV, Tenlot, TenNV, TenPB
FROM NHANVIEN INNER JOIN PHONGBAN
ON NHANVIEN.Phong=PHONGBAN.MaPB
WHERE TenPB=‘Nghien cuu’;
23
Kết ngoại
Cấu trúc:
SELECT list_of_expressions
FROM R LEFT/RIGHT/FULL OUTER JOIN S
ON R.A = S.B
[WHERE row_conditions]
[GROUP BY list_of_columns
[HAVING aggregate_conditions]];
[ORDER BY list_of_columns];
24
Kết ngoại (2)
Ví dụ:
SELECT MaNV, HoNV, Tenlot, TenNV, TenPB
FROM NHANVIEN LEFT OUTER JOIN PHONGBAN
ON NHANVIEN.MaNV=PHONGBAN.TrPhong;
25