01/03/2011
TRUNG TÂM DÀO TẠO CÁC VẤN ĐỀ KINH TẾ HIỆN ĐẠI
TRƯỜNG ĐẠI HỌC CHU VĂN AN
DATABASE
CƠ SỞ DỮ LIỆU
GV: Đỗ Thị Kim Thành
Email:
Web:
Chương VI
NGÔN NGỮ TRUY VẤN SQL
GV: ĐỖ THỊ KIM THÀNH
2
1
01/03/2011
GIỚI THIỆU
Ngơn ngữ khai báo
•
Cài đặt dựa trên ĐSQH
Chuẩn hóa cho các hệ quản trị CSDL quan hệ
•
•
Được phát triển bởi IBM (1970s)
Các phiên bản chuẩn ANSI/ISO
–
SQL – 86 (SQL1)
–
SQL – 92 (SQL2)
–
SQL – 99 (SQL3)
–
SQL – 2000, 2005, 2008
Nhiều phiên bản cài đặt
•
•
SQL Server
Oracle
3
GV: ĐỠ THỊ KIM THÀNH
GIỚI THIỆU
SQL hỗ trợ
Ngôn ngữ định nghĩa dữ liệu (DDL)
•
•
•
Ngơn ngữ thao tác dữ liệu (DML)
•
•
Mức quan niệm: CREATE SCHEMA, TABLE,…
Mức ngoài: CREATE VIEW, GRANT,…
Mức trong: CREATE INDEX, CLUSTER,…
Truy vấn: SELECT
Cập nhật: INSERT, DELETE, UPDATE
Ngơn ngữ khai báo
•
•
•
GV: ĐỠ THỊ KIM THÀNH
Ràng buộc tồn vẹn
Phân quyền và bảo mật
Điều khiển giao tác
4
2
01/03/2011
TRUY VẤN DỮ LIỆU
Truy vấn dữ liệu là ngôn ngữ rút trích dữ liệu thỏa một
số điều kiện nào đó
Dựa trên các phép tốn đại số quan hệ + một số mở rộng
Hỗ trợ các truy vấn:
• Cơ bản: chọn, chiếu, kết
• Tập hợp, so sánh tập hợp và truy vấn lồng
• Hàm kết hợp và gom nhóm
• Một số kiểu truy vấn khác
Ngôn ngữ truy vấn dữ liệu SQL là ngơn ngữ chuẩn, có
cấu trúc dùng để truy vấn và thao tác trên CSDL quan
hệ.
GV: ĐỖ THỊ KIM THÀNH
5
CẤU TRÚC
Câu truy vấn tổng quát:
SELECT [ DISTINCT ] danh_sách_cột | hàm
FROM danh sách các quan hệ (hay bảng, table)
[WHERE điều_kiện]
[GROUP BY danh_sách_cột_gom_nhóm]
[HAVING điều_kiện_trên_nhóm]
[ORDER BY cột1 ASC | DESC, cột2 ASC | DESC,… ]
GV: ĐỖ THỊ KIM THÀNH
6
3
01/03/2011
CÁC TỐN TỬ VÀ PHÉP TỐN
Tốn tử so sánh:
•
•
•
•
•
•
•
=,>,<,>=,<=,<>
BETWEEN
IS NULL, IS NOT NULL
LIKE (%,_)
IN, NOT IN
EXISTS, NOT EXISTS
SOME, ALL, ANY
Toán tử logic: AND, OR
Các phép toán: +, - ,* , /
7
GV: ĐỖ THỊ KIM THÀNH
CÁC HÀM CƠ BẢN
5 hàm cơ bản:
•
COUNT( )
•
SUM( )
•
MAX( )
•
MIN( )
•
AVG( )
Các hàm xử lý ngày tháng năm
• Ngày: DAY( )
• Tháng: MONTH( )
• Năm: YEAR( )
GV: ĐỠ THỊ KIM THÀNH
8
4
01/03/2011
PHÂN LOẠI CÂU SELECT
SELECT đơn giản
SELECT có mệnh đề ORDER BY
SELECT lồng (câu SELECT lồng câu SELECT khác)
SELECT gom nhóm (GROUP BY)
SELECT gom nhóm (GROUP BY) có điều kiện HAVING
GV: ĐỠ THỊ KIM THÀNH
9
TRUY VẤN CƠ BẢN
Cú pháp:
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 được hiển thị trong kết quả truy vấn
<danh sách các bảng>: tên các bảng (quan hệ) liên quan đến câu truy vấn
<điều kiện>
•
•
•
Biểu thức logic xác định dịng nào sẽ được rút trích
Nối các biểu thức: dùng toán tử logic
Các phép toán và toán tử so sánh
GV: ĐỖ THỊ KIM THÀNH
10
5
01/03/2011
TRUY VẤN CƠ BẢN (tt)
SQL và ĐSQH
π
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
σ
L
SELECT
FROM
R
WHERE
GV: ĐỖ THỊ KIM THÀNH
πL (σC(R))
C
11
CSDL MẪU
Cho lược đồ CSDL “quản lý đề án công ty” như sau
NHANVIEN (MANV, HONV, TENLOT, TENNV, NS, DC,
PHAI, LUONG, MA_NQL, PHG)
PHONGBAN (MAPHG, TENPHG, TRPHG, NG_NHANCHUC)
PHANCONG (MA_NVIEN, SODA, THOIGIAN)
THANNHAN (MA_NVIEN, TENTN, PHAI, NS, QUANHE)
DEAN (MADA, TENDA, DDIEM_DA, PHONG)
DIADIEM_PHG (MAPHG, DIADIEM)
GV: ĐỖ THỊ KIM THÀNH
12
6
01/03/2011
VÍ DỤ
SELECT *
Lấy tất cả các cột của
quan hệ kết quả
FROM NHANVIEN
WHERE PHG=5
MANV
HONV
TENLOT
TENNV
NS
DC
PHAI
LUONG
MA_NQL
PHG
123
Nguyễn
Thanh
Tùng
8/12/1985
NVC, Q5
Nam
40000
745
5
189
Nguyễn
Mạnh
Hùng
15/9/1962
VT
Nam
38000
123
5
248
Lê
Thị
Hoa
4/9/1978
TN
Nữ
36000
123
5
σPHG=5 (NHANVIEN)
13
GV: ĐỖ THỊ KIM THÀNH
MỆNH ĐỀ SELECT
SELECT MANV, HOTEN, TENLOT, TENNV
FROM NHANVIEN
WHERE PHG=5 AND PHAI=„Nam‟
π
MANV
HONV
TENLOT
TENNV
123
Nguyễn
Thanh
Tùng
189
Nguyễn
Mạnh
Hùng
MANV,HONV,TENLOT,TENNV
GV: ĐỖ THỊ KIM THÀNH
(σPHG=5^PHAI=„Nam‟ (NHANVIEN))
14
7
01/03/2011
MỆNH ĐỀ SELECT (TT)
Tên bí danh
SELECT MANV, HONV AS HO, TENLOT AS „TEN LOT‟, TENNV AS TEN
FROM NHANVIEN
WHERE PHG=5 AND PHAI=„Nam‟
MANV
HO
TEN LOT
TEN
123
Nguyễn
Thanh
Tùng
189
Nguyễn
Mạnh
Hùng
ρMANV, HO, TEN LOT, TEN (πMANV, HONV, TENLOT, TENNV
(σPHG=5 ^ PHAI=„Nam‟ (NHANVIEN)))
15
GV: ĐỖ THỊ KIM THÀNH
MỆNH ĐỀ SELECT (TT)
Mở rộng
SELECT MANV, HONV+ „‟+ TENLOT + „‟ +TENNV AS HOTEN
FROM NHANVIEN
WHERE PHG=5 AND PHAI=„Nam‟
MANV
HOTEN
123
Nguyễn Thanh Tùng
189
Nguyễn Mạnh Hùng
ρMANV,HOTEN (πMANV,HONV+TENLOT+TENNV
(σPHG=5^PHAI=„Nam‟ (NHANVIEN)))
GV: ĐỖ THỊ KIM THÀNH
16
8
01/03/2011
MỆNH ĐỀ SELECT (TT)
Loại bỏ các dòng trùng nhau
SELECT DISTINCT
LUONG LUONG
FROM NHANVIEN
WHERE PHG=5 AND PHAI=„Nam‟
LUONG
LUONG
30000
30000
-Tốn chi phí
25000
25000
38000
30000
38000
17
GV: ĐỠ THỊ KIM THÀNH
VÍ DỤ
Cho biết MANV và TENNV làm việc ở phịng „Nghien cứu‟
NHANVIEN (MANV, HONV, TENLOT, TENNV, NS, DC, PHAI, LUONG, MA_NQL, PHG)
PHONGBAN (MAPHG, TENPHG, TRPHG, NG_NHANCHUC)
R1 NHANVIEN
KQ π
MANV,TENNV
PHG=MAPHG
PHONGBAN
(σTENPHG=„Nghien cuu‟ (R1))
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE TENPHG=„Nghien cuu‟ AND PHG=MAPHG
GV: ĐỖ THỊ KIM THÀNH
18
9
01/03/2011
Mệnh đề WHERE
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE TENPHG=„Nghien cuu‟ AND PHG=MAPHG
TRUE
Biểu thức luận lý
TRUE
TRUE
19
GV: ĐỖ THỊ KIM THÀNH
Mệnh đề WHERE (TT)
BETWEEN
Hãy cho biết MANV và TENNV có lương trong khoảng tử
20000 đến 30000
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG > 20000 AND LUONG < 30000
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG BETWEEN 20000 AND 30000
GV: ĐỖ THỊ KIM THÀNH
20
10
01/03/2011
Mệnh đề WHERE (TT)
NOT BETWEEN
Hãy cho biết MANV và TENNV có lương khơng nằm trong
khoảng tử 20000 đến 30000
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG NOTBETWEEN 20000 AND 30000
21
GV: ĐỖ THỊ KIM THÀNH
Mệnh đề WHERE (TT)
LIKE
Hãy cho biết MANV và TENNV có địa chỉ trong đó có từ
Nguyễn
SELECT MANV, TENNV
FROM NHANVIEN
WHERE DC LIKE „Nguyễn_ _ _ _‟
SELECT MANV, TENNV
Ký tự bất kỳ
FROM NHANVIEN
WHERE DC LIKE „Nguyễn %‟
GV: ĐỖ THỊ KIM THÀNH
Chuỗi bất kỳ
22
11
01/03/2011
Mệnh đề WHERE (TT)
NOTLIKE
Hãy cho biết MANV và TENNV có họ (HONV) Nguyễn
SELECT MANV, TENNV
FROM NHANVIEN
WHERE HONV LIKE „Nguyễn‟
Hãy cho biết MANV và TENNV không phải họ Nguyễn
SELECT MANV, TENNV
FROM NHANVIEN
WHERE HOVN NOT LIKE „Nguyễn‟
23
GV: ĐỖ THỊ KIM THÀNH
Mệnh đề WHERE (TT)
Ngày giờ
Hãy cho biết MANV và TENNV có ngày sinh nằm trong
khoảng tử 1955-12-08 đến 1966-07-19
SELECT MANV, TENNV
FROM NHANVIEN
WHERE NS BETWEEN „1955-12-08‟ AND „1966-07-19‟
„1955-12-08‟
YYYY-MM-DD
„17:30:00‟
„12/08/1955‟
MM/DD/YYYY
„05:30 PM‟
„December 8, 1955‟
„1955-12-08 17:30:00‟
GV: ĐỖ THỊ KIM THÀNH
24
12
01/03/2011
Mệnh đề WHERE (TT)
NULL
Sử dụng trong truờng hợp
•
•
•
Khơng biết (value unknown)
Không thể áp dụng (value inapplicable)
Không tồn tại (value withheld)
Những biểu thức tính tốn có liên quan đến giá trị NULL sẽ
cho ra kết quả là NULL
•
•
•
x có giá trị là NULL
x + 3 cho ra kết quả là NULL
x + 3 là 1 biểu thức không hợp lệ trong SQL
Những biểu thức so sánh có liên quan đến giá trị NULL sẽ
cho ra kết quả là UNKNOWN
•
•
x = 3 cho ra kết quả là UNKNOWN
x = 3 là 1 so sánh không hợp lệ trong SQL
25
GV: ĐỖ THỊ KIM THÀNH
Mệnh đề WHERE (TT)
NULL
Hãy cho biết MANV và TENNV khơng có người quản lý
SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NULL
Hãy cho biết MANV và TENNV có người quản lý
SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NOT NULL
GV: ĐỖ THỊ KIM THÀNH
26
13
01/03/2011
Mệnh đề FROM
Tên bí danh
PHONGBAN(TENPHG, MAPHG,TRPHG, NG_NHANCHUC)
DIADIEM_PHG(MAPHG, DIADIEM)
Hãy cho biết địa điểm, tên phòng của từng phòngban
SELECT TENPHG, DIADIEM
FROM PHONGBAN, DIADIEM_PHG
WHERE MAPHG = MAPHG
SELECT TENPHG, DIADIEM
FROM PHONGBAN AS PB, DIADIEM_PHG AS DD
WHERE PB.MAPHG = DD.MAPHG
GV: ĐỖ THỊ KIM THÀNH
27
BETWEEN, ORDER BY, IS NULL
Câu hỏi 13: Sử dụng =,>,>=,…
Danh sách các nhân viên sinh trong khoảng từ năm
1978 đến 1983?
SELECT
FROM
WHERE
GV: ĐỖ THỊ KIM THÀNH
MANV, HONV, TENLOT, TENNV
NHANVIEN
YEAR(NS)>=1978
AND
YEAR(NS)<=1983
28
14
01/03/2011
BETWEEN, ORDER BY, IS NULL
Câu hỏi 14: Sử dụng BETWEEN, ORDER BY.
Danh sách các nhân viên sinh trong khoảng từ năm
1978 đến 1983? Sắp xếp theo mức lương giảm dần.
SELECT
FROM
WHERE
ORDER BY
*
NHANVIEN
YEAR(NS) BETWEEN 1978 AND 1983
LUONG DESC
29
GV: ĐỖ THỊ KIM THÀNH
SO SÁNH IN & NOT IN
Câu hỏi 15: Sử dụng IN (so sánh với một tập hợp
giá trị cụ thể).
Cho biết họ tên nhân viên thuộc phịng „NC‟ hoặc
phịng „DH‟?
SELECT
FROM
WHERE
GV: ĐỠ THỊ KIM THÀNH
DISTINCT HOTEN
NHANVIEN
MAPHG IN („NC‟,‟DH‟)
30
15
01/03/2011
SO SÁNH IN & NOT IN
Câu hỏi 16: Sử dụng IN (so sánh với một tập hợp
giá trị chọn từ câu SELECT khác).
Cho biết họ tên nhân viên thuộc phòng „NC‟ hoặc
phịng „DH‟?
SELECT
FROM
WHERE
GV: ĐỠ THỊ KIM THÀNH
HONV, TENLOT, TENNV
NHANVIEN
MAPH IN
(SELECT
MAPHG
FROM
PHONGBAN
WHERE
MAPHG=„NC‟ OR MAPHG=„DH‟)
31
SO SÁNH IN & NOT IN
Câu hỏi 17: : Sử dụng NOT IN.
Cho biết mã số, họ tên, ngày tháng năm sinh của những
nhân viên không tham gia đề án nào?
Gợi ý cho mệnh đề NOT IN: thực hiện câu truy vấn “tìm nhân
viên có tham gia đề án (dựa vào bảng PhanCong)”, sau đó
lấy phần bù
SELECT
FROM
WHERE
GV: ĐỠ THỊ KIM THÀNH
MANV, HOTEN, NS
NHANVIEN
MANV NOT IN
(SELECT MANV
FROM PHANCONG)
32
16
01/03/2011
SO SÁNH IN & NOT IN
Câu hỏi 18: Cho biết tên phịng ban khơng chủ trì các
đề án triển khai năm 2005?
Gợi ý: thực hiện câu truy vấn “tìm phịng ban chủ trì
các đề án triển khai năm 2005”, sau đó lấy phần bù.
SELECT
FROM
WHERE
GV: ĐỠ THỊ KIM THÀNH
TENPH
PHONGBAN
MAPHG NOT IN
(SELECT
DISTINCT PHONG
FROM
DEAN
WHERE
NAMTHUCHIEN=2005)
33
HÀM COUNT,SUM,MAX,MIN,AVG
1. Sử dụng các hàm COUNT, SUM, MIN, MAX, AVG
trên 1 nhóm lớn (trên tồn bộ quan hệ):
Câu hỏi 19: Tính số nhân viên của cơng ty
SELECT
FROM
GV: ĐỠ THỊ KIM THÀNH
COUNT(MANV) AS SONV
NHANVIEN
34
17
01/03/2011
HÀM COUNT,SUM,MAX,MIN,AVG
1. Sử dụng các hàm COUNT, SUM, MIN, MAX, AVG
trên 1 nhóm lớn (trên tồn bộ quan hệ):
Câu hỏi 20: Tính số lượng nhân viên quản lý trực tiếp
nhân viên khác
SELECT
FROM
GV: ĐỖ THỊ KIM THÀNH
COUNT (DISTINCT MA_NQL)
NHANVIEN
35
HÀM COUNT,SUM,MAX,MIN,AVG
1. Sử dụng các hàm COUNT, SUM, MIN, MAX, AVG
trên 1 nhóm lớn (trên tồn bộ quan hệ):
Câu hỏi 21: Tìm mức lương lớn nhất, mức lương trung
bình, tổng lương của cơng ty
SELECT
FROM
GV: ĐỖ THỊ KIM THÀNH
MAX(LUONG), AVG(LUONG), SUM(LUONG)
NHANVIEN
36
18
01/03/2011
HÀM COUNT,SUM,MAX,MIN,AVG
1. Sử dụng các hàm COUNT, SUM, MIN, MAX, AVG
trên 1 nhóm lớn (trên tồn bộ quan hệ):
Câu hỏi 22: Cho biết nhân viên có mức lương lớn nhất
SELECT
FROM
WHERE
GV: ĐỖ THỊ KIM THÀNH
HOTEN
NHANVIEN
LUONG = (SELECT MAX (LUONG)
FROM NHANVIEN )
37
MỆNH ĐỀ GROUP BY
Câu hỏi 23: Cho biết nhân viên có mức lương trên mức
lương trung bình của cơng ty.
SELECT
FROM
WHERE
GV: ĐỠ THỊ KIM THÀNH
HOTEN
NHANVIEN
LUONG > (SELECT
FROM
AVG(LUONG)
NHANVIEN )
38
19
01/03/2011
MỆNH ĐỀ GROUP BY
2. Sử dụng các hàm COUNT, SUM, MIN, MAX, AVG
trên từng nhóm nhỏ: mệnh đề GROUP BY
–
–
Chia các dịng thành các nhóm nhỏ dựa trên tập
thuộc tính chia nhóm.
Thực hiện các phép tốn trên nhóm như:
COUNT : thực hiện phép đếm
SUM : tính tổng
MIN : lấy giá trị nhỏ nhất
MAX : lấy giá trị lớn nhất
AVG : lấy giá trị trung bình
39
GV: ĐỠ THỊ KIM THÀNH
MỆNH ĐỀ GROUP BY
nhóm
Quan hệ NV
Q
a
a
b
b
c
c
c
c
c
d
d
d
Chia các dịng thành các
nhóm dựa trên tập thuộc
tính chia nhóm
S
10
2
9
5
10
8
6
4
10
16
18
50
Q
Count(S)
a
2
b
c
d
2
5
Các thuộc tính GROUP BY: Q
GV: ĐỠ THỊ KIM THÀNH
Tương tự cho các
hàm SUM, MIN,
MAX, AVG
3
Câu SQL:
Select Q, count(S)
From NV
Group by Q
40
20
01/03/2011
MỆNH ĐỀ GROUP BY
2. Sử dụng các hàm COUNT, SUM, MIN, MAX, AVG
trên từng nhóm nhỏ: mệnh đề GROUP BY
Câu hỏi 23: Cho biết số lượng nhân viên theo từng
phái?
Do cột phái có 2 giá trị “nam” và “nữ”, trường hợp này ta
chia bảng NHANVIEN thành 2 nhóm nhỏ. Thuộc tính chia
nhóm là thuộc tính “Phai”.
SELECT
PHAI, COUNT(MANV) AS SONV
FROM
GROUP BY
NHANVIEN
PHAI
41
GV: ĐỖ THỊ KIM THÀNH
MỆNH ĐỀ GROUP BY
2. Sử dụng các hàm COUNT, SUM, MIN, MAX, AVG
trên từng nhóm nhỏ: mệnh đề GROUP BY
Câu hỏi 24: Cho biết số lượng nhân viên theo từng
phịng?
Do cột MAPHG có 3 giá trị “NC” và “DH” và “QL”, trường
hợp này ta chia bảng nhân viên thành 3 nhóm nhỏ. Thuộc
tính chia nhóm là thuộc tính “MAPHG”.
SELECT
MAPHG, COUNT(MANV)
FROM
NHANVIEN
GROUP BY
MAPHG
GV: ĐỠ THỊ KIM THÀNH
42
21
01/03/2011
MỆNH ĐỀ HAVING
Lọc kết quả theo điều kiện, sau khi đã gom
nhóm
Điều kiện của HAVING là điều kiện về các
hàm tính tốn trên nhóm (Count, Sum, Min,
Max, AVG) và các thuộc tính trong danh
sách GROUP BY.
43
GV: ĐỠ THỊ KIM THÀNH
MỆNH ĐỀ GROUP BY
Câu hỏi 25: Cho biết những nhân viên tham gia từ 2
đề án trở lên?
SELECT
FROM
GROUP BY
HAVING
GV: ĐỖ THỊ KIM THÀNH
MANV, COUNT(MADA) AS SODATG
PHANCONG
MANV
COUNT(MADA) >=2
44
22
01/03/2011
MỆNH ĐỀ GROUP BY
Câu hỏi 26: Cho biết số nhân viên có mã phịng ban
có trên 4 nhân viên?
SELECT
FROM
GROUP BY
HAVING
GV: ĐỖ THỊ KIM THÀNH
MAPHG, COUNT(MANV)
NHANVIEN
MAPHG
COUNT(MANV) > 4
45
23