SQL - Structured Query Language
Giới thiệu
Truy vấn dữ liệu
Cập nhật dữ liệu
Giới thiệu
Ngôn ngữ khai báo
Cài đặt dựa trên ĐSQH
Chuẩn hoá cho các HQTCSDL quan hệ
Được phát triển bởi IBM (1970s)
Các version Standard ANSI/ISO
SQL-86 (SQL1)
SQL-92 (SQL2)
SQL-99 (SQL3)
Nhiều phiên bản cài đặt
SQL Server
Oracle
3/6/2008
Ôn thi Cao học 2008
2
1
Giới thiệu (tt)
tt)
SQL hỗ trợ
Ngôn ngữ Định nghĩa dữ liệu (DDL)
Mức Quan niệm : CREATE SCHEMA, TABLE,...
Mức ngoài : CREATE VIEW, GRANT,…
Mức trong : CREATE INDEX, CLUSTER,...
Ngôn ngữ Thao tác dữ liệu (DML)
Truy vấn : SELECT
Cập nhật : INSERT, DELETE, UPDATE
Ngơn ngữ khai báo
Ràng buộc tồn vẹn
Phân quyền và bảo mật
Điều khiển giao tác
3/6/2008
Ôn thi Cao học 2008
3
Định nghĩa dữ liệu
Là ngôn ngữ mô tả
Lược đồ cho mỗi quan hệ
Miền giá trị tương ứng của từng thuộc tính
Ràng buộc tồn vẹn
Chỉ mục trên mỗi quan hệ
Gồm
CREATE TABLE (tạo bảng)
DROP TABLE (xóa bảng)
ALTER TABLE (sửa bảng)
CREATE DOMAIN (tạo miền giá trị)
CREATE DATABASE
…
3/6/2008
Ôn thi Cao học 2008
4
2
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 toán đại số quan hệ + một số mở rộng
Bảng là bag ≠ quan hệ là set
Cho phép 1 bảng có nhiều dịng trùng nhau
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
3/6/2008
Ôn thi Cao học 2008
5
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 liên quan đến câu truy vấn
<điều kiện>
Biểu thức boolean xác định dịng nào sẽ được rút trích
Nối các biểu thức: AND, OR, và NOT
Phép toán: < , > , ≤ , ≥ , ≠ , =, LIKE và BETWEEN
3/6/2008
Ôn thi Cao học 2008
6
3
Truy vấn cơ bản (tt)
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>
SELECT L
π σ
FROM R C (R))
L(
WHERE C
3/6/2008
Ôn thi Cao học 2008
7
CSDL mẫu
NHANVIEN(HONV,TENLOT,TENNV,MANV,NGSINH,DCHI,PHAI,LUONG,MA_NQL,PHG)
PHONGBAN(TENPHG,MAPHG,TRPHG,NG_NHANCHUC)
PHANCONG(MA_NVIEN,SODA,THOIGIAN)
THANNHAN(MA_NVIEN,TENTN,PHAI,NGSINH,QUANHE)
DEAN(TENDA,MADA,DDIEM_DA,PHONG)
DIADIEM_PHG(MAPHG,DIADIEM)
3/6/2008
Ôn thi Cao học 2008
8
4
Ví dụ
Lấy tất cả các cột của
quan hệ kết quả
SELECT *
FROM NHANVIEN
WHERE PHG=5
MANV
HONV
TENLOT
333445555
Nguyen
987987987
Nguyen
TENNV
NGSINH
DCHI
Thanh
Tung
12/08/1955
638 NVC Q5
Manh
Hung
09/15/1962
Ba Ria VT
σ
PHG=5
3/6/2008
LUONG
MA_NQL
Nam
40000
888665555
5
Nam
38000
333445555
5
PHAI
PHG
(NHANVIEN)
Ôn thi Cao học 2008
9
Mệnh đề SELECT
SELECT MANV, HONV, TENLOT, TENNV
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
MANV
3/6/2008
TENLOT
Nguyen
Thanh
Tung
987987987
π
HONV
333445555
Nguyen
Manh
Hung
MANV,HONV,TENLOT,TENNV(
σ
TENNV
PHG=5 ∧ PHAI=‘Nam’
Ôn thi Cao học 2008
(NHANVIEN))
10
5
Mệnh đề SELECT (tt)
(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
Nguyen
Thanh
Tung
987987987
Nguyen
Manh
Hung
π
(
MANV,HO,TEN LOT,TEN
TEN LOT
333445555
ρ
HO
TEN
σ
MANV,HONV,TENLOT,TENNV(
3/6/2008
PHG=5∧PHAI=‘Nam’(NHANVIEN)))
Ôn thi Cao học 2008
11
Mệnh đề SELECT (tt)
(tt)
Mở rộng
SELECT MANV, HONV + ‘ ’ + TENLOT + ‘ ’ + TENNV AS ‘HO TEN’
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
MANV
HO TEN
333445555
ρ
π
MANV,HO TEN(
3/6/2008
Nguyen Thanh Tung
987987987
Nguyen Manh Hung
σ
MANV,HONV+TENLOT+TENNV(
Ôn thi Cao học 2008
PHG=5∧PHAI=‘Nam’(NHANVIEN)))
12
6
Mệnh đề SELECT (tt)
(tt)
Mở rộng
SELECT MANV, LUONG*1.1 AS ‘LUONG10%’
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
MANV
333445555
33000
987987987
ρ
LUONG10%
27500
π
MANV,LUONG10%(
σ
MANV,LUONG*1.1(
3/6/2008
PHG=5∧PHAI=‘Nam’(NHANVIEN)))
Ôn thi Cao học 2008
13
Mệnh đề SELECT (tt)
(tt)
Loại bỏ các dòng trùng nhau
SELECT LUONG
DISTINCT LUONG
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
LUONG
30000
- Tốn chi phí
25000
- Người dùng muốn thấy
38000
25000
38000
3/6/2008
Ơn thi Cao học 2008
14
7
Ví dụ
Cho biết MANV và TENNV làm việc ở phịng ‘Nghien cuu’
NHANVIEN(HONV,TENLOT,TENNV,MANV,NGSINH,DCHI,PHAI,LUONG,MA_NQL,PHG)
PHONGBAN(TENPHG,MAPHG,TRPHG,NG_NHANCHUC)
← NHANVIEN
PHG=MAPHG PHONGBAN
KQ ← πMANV, TENNV (σTENPHG=‘Nghien cuu’(R1))
R1
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE TENPHG=‘Nghien cuu’ AND
3/6/2008
PHG=MAPHG
Ôn thi Cao học 2008
15
Mệnh đề WHERE
SELECT MANV, TENNV
Biểu thức luận lý
FROM NHANVIEN, PHONGBAN
WHERE TENPHG=‘Nghien cuu’ AND PHG=MAPHG
TRUE
3/6/2008
TRUE
Ôn thi Cao học 2008
16
8
Mệnh đề WHERE (tt)
(tt)
BETWEEN
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG>20000 AND LUONG<30000
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG BETWEEN 20000 AND 30000
3/6/2008
Ôn thi Cao học 2008
17
Mệnh đề WHERE (tt)
(tt)
NOT BETWEEN
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG NOT BETWEEN 20000 AND 30000
3/6/2008
Ôn thi Cao học 2008
18
9
Mệnh đề WHERE (tt)
(tt)
LIKE
SELECT MANV, TENNV
FROM NHANVIEN
WHERE DCHI LIKE ‘Nguyen _ _ _ _’
Ký tự bất kỳ
SELECT MANV, TENNV
FROM NHANVIEN
WHERE DCHI LIKE ‘Nguyen %’
Chuỗi bất kỳ
3/6/2008
Ôn thi Cao học 2008
19
Mệnh đề WHERE (tt)
(tt)
NOT LIKE
SELECT MANV, TENNV
FROM NHANVIEN
WHERE HONV LIKE ‘Nguyen’
SELECT MANV, TENNV
FROM NHANVIEN
WHERE HONV NOT NOT LIKE ‘Nguyen’
3/6/2008
Ôn thi Cao học 2008
20
10
Mệnh đề WHERE (tt)
(tt)
ESCAPE
SELECT MANV, TENNV
FROM NHANVIEN
WHERE DCHI LIKE ‘% Nguyens_%’ ESCAPE ‘s’
‘Nguyen_’
3/6/2008
Ôn thi Cao học 2008
21
Mệnh đề WHERE (tt)
(tt)
Ngày giờ
SELECT MANV, TENNV
FROM NHANVIEN
WHERE NGSINH 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’
HH:MI:SS
‘December 8, 1955’
‘1955-12-08 17:30:00’
3/6/2008
Ôn thi Cao học 2008
22
11
Mệnh đề WHERE (tt)
(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 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à một 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à một so sánh khơng hợp lệ trong SQL
3/6/2008
Ơn thi Cao học 2008
23
Mệnh đề WHERE (tt)
(tt)
NULL
SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NULL
SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NOT NULL
3/6/2008
Ôn thi Cao học 2008
24
12
Mệnh đề FROM
Không sử dụng mệnh đề WHERE
SELECT MANV, MAPHG
FROM NHANVIEN, PHONGBAN
WHERE TRUE
MANV
333445555
MAPHG
1
333445555
4
333445555
5
987987987
1
987987987
4
987987987
5
…
…
3/6/2008
Ôn thi Cao học 2008
25
Mệnh đề FROM (tt)
(tt)
Tên bí danh
PHONGBAN(TENPHG,MAPHG,TRPHG,NG_NHANCHUC)
DIADIEM_PHG(MAPHG,DIADIEM)
SELECT TENPHG, DIADIEM
FROM PHONGBAN,AS PB, DDIEM_PHG AS DD
PHONGBAN DDIEM_PHG
WHERE MAPHG=MAPHG
PB.MAPHG=DD.MAPHG
NHANVIEN(HONV,TENLOT,TENNV,MANV,NGSINH,DCHI,PHAI,LUONG,MA_NQL,PHG)
THANNHAN(MA_NVIEN,TENTN,PHAI,NGSINH,QUANHE)
NV.NGSINH, TENTN, TN.NGSINH
SELECT TENNV, NGSINH, TENTN, NGSINH
NHANVIEN THANNHAN
FROM NHANVIEN,NV, THANNHAN TN
WHERE MANV=MA_NVIEN
3/6/2008
Ôn thi Cao học 2008
26
13
Ví dụ 1
Với những đề án ở ‘Ha Noi’, cho biết mã đề án, mã phịng ban chủ trì
đề án, họ tên trưởng phòng cùng với ngày sinh và địa chỉ của người ấy
NHANVIEN(HONV,TENLOT,TENNV,MANV,NGSINH,DCHI,PHAI,LUONG,MA_NQL,PHG)
PHONGBAN(TENPHG,MAPHG,TRPHG,NG_NHANCHUC)
DEAN(TENDA,MADA,DDIEM_DA,PHONG)
R1
← πMADA, PHONG (σDDIEM_DA=‘Hanoi’(DEAN))
R1(MADA, PHONG)
R2
← R1
PHONG=MAPHG
PHONGBAN
R2(MADA,PHONG,TENPHG,MAPHG,TRPHG,NG_NHANCHUC)
KQ
← πHONV, TENNV, NGSINH,DCHI ( R2
TRPHG=MANV
NHANVIEN)
KQ(MADA,PHONG,TENPHG,MAPHG,TRPHG,NG_NHANCHUC,HONV,TENLOT,
TENNV,MANV,NGSINH,DCHI,PHAI,LUONG,MA_NQL,PHG)
3/6/2008
Ơn thi Cao học 2008
27
Ví dụ 1
Với những đề án ở ‘Ha Noi’, cho biết mã đề án, mã phịng ban chủ trì
đề án, họ tên trưởng phòng cùng với ngày sinh và địa chỉ của người ấy
SELECT
DA.PHONG, NV.HONV, NV.TENNV,NV.NGSINH,NV.DCHI
FROM
DEAN AS DA, PHONGBAN AS PB, NHANVIEN AS NV
WHERE
(DDIEM_DA=‘Hanoi’)
AND
3/6/2008
AND
(DA.MAPHG=PB.MAPHG)
NV.MANV=PB.TRPHG
Ôn thi Cao học 2008
28
14
Ví dụ 2
Tìm họ tên của nhân viên phịng số 5 có tham gia vào đề án “Sản phẩm
X” với số giờ làm việc trên 10 giờ
SELECT
HONV, TENNV
FROM
PHANCONG AS PC, DEAN AS DA, NHANVIEN AS NV
WHERE
(NV.PHG=5) AND
(PC.THOIGIAN>10) AND (TENDA= “Sản phẩm X” )
AND
(PC.SODA=DA.MADA)
AND
NV.MANV=PC.MA_NVIEN
3/6/2008
Ôn thi Cao học 2008
29
Mệnh đề ORDER BY
Dùng để hiển thị kết quả câu truy vấn theo một thứ tự nào đó
Cú pháp
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
ORDER BY <danh sách các cột>
ASC: tăng (mặc định)
DESC: giảm
3/6/2008
Ôn thi Cao học 2008
30
15
Mệnh đề ORDER BY (tt)
(tt)
Ví dụ
SELECT MA_NVIEN, SODA
FROM PHANCONG
ORDER BY MA_NVIEN DESC, SODA
MA_NVIEN
SODA
999887777
10
999887777
30
987987987
10
987987987
30
987654321
10
987654321
20
987654321
30
3/6/2008
Ơn thi Cao học 2008
31
Phép tốn tập hợp trong SQL
SQL có cài đặt các phép tốn
Hội (UNION)
Giao (INTERSECT)
Trừ (EXCEPT)
Kết quả trả về là tập hợp
Loại bỏ các bộ trùng nhau
Để giữ lại các bộ trùng nhau
UNION ALL
INTERSECT ALL
EXCEPT ALL
3/6/2008
Ôn thi Cao học 2008
32
16
Phép toán tập hợp trong SQL (tt)
(tt)
Cú pháp
SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện>
UNION [ALL]
SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện>
SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện>
INTERSECT [ALL]
SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện>
SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện>
EXCEPT [ALL]
SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện>
3/6/2008
Ôn thi Cao học 2008
33
Ví dụ 5
Cho biết các mã đề án có
Nhân viên với họ là ‘Nguyen’ tham gia hoặc,
Trưởng phịng chủ trì đề án đó với họ là ‘Nguyen’
SELECT SODA
FROM NHANVIEN, PHANCONG
WHERE MANV=MA_NVIEN AND HONV=‘Nguyen’
UNION
SELECT MADA
FROM NHANVIEN, PHONGBAN, DEAN
WHERE MANV=TRPHG AND MAPHG=PHONG
AND HONV=‘Nguyen’
3/6/2008
Ôn thi Cao học 2008
34
17
Ví dụ 6
Tìm nhân viên có người thân cùng tên và cùng giới tính
SELECT TENNV, PHAI, MANV FROM NHANVIEN
INTERSECT
SELECT TENTN, PHAI, MA_NVIEN FROM THANNHAN
3/6/2008
Ơn thi Cao học 2008
35
Ví dụ 7
Tìm những nhân viên khơng có thân nhân nào
SELECT MANV FROM NHANVIEN
EXCEPT
SELECT MA_NVIEN AS MANV FROM THANNHAN
3/6/2008
Ôn thi Cao học 2008
36
18
Truy vấn lồng
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE TENPHG=‘Nghien cuu’ AND PHG=MAPHG
Câu truy vấn cha
(Outer query)
SELECT MANV,TENNV
FROM NHANVIEN
WHERE PHG IN (
SELECT MAPHG
FROM PHONGBAN
Câu truy vấn con
(Subquery)
WHERE TENPHG =‘Nghien cuu’)
3/6/2008
Ôn thi Cao học 2008
37
Truy vấn lồng
Câu truy vấn cha
(Outer query)
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <so sánh tập hợp> (
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>)
3/6/2008
Ôn thi Cao học 2008
Câu truy vấn con
(Subquery)
38
19
Truy vấn lồng (tt)
tt)
Các câu lệnh SELECT có thể lồng nhau ở nhiều mức
Các câu truy vấn con trong cùng một mệnh đề WHERE được kết
hợp bằng phép nối logic
Câu truy vấn con thường trả về một tập các giá trị
Mệnh đề WHERE của câu truy vấn cha
<biểu thức> <so sánh tập hợp> <truy vấn con>
So sánh tập hợp thường đi cùng với một số toán tử
IN, NOT IN
ALL
ANY hoặc SOME
Kiểm tra sự tồn tại
EXISTS
NOT EXISTS
3/6/2008
Ôn thi Cao học 2008
39
Truy vấn lồng (tt)
tt)
Lồng phân cấp
Mệnh đề WHERE của truy vấn con khơng tham chiếu đến thuộc tính của các
quan hệ trong mệnh đề FROM ở truy vấn cha
Khi thực hiện, câu truy vấn con sẽ được thực hiện trước
Lồng tương quan
Mệnh đề WHERE của truy vấn con tham chiếu ít nhất một thuộc tính của các
quan hệ trong mệnh đề FROM ở truy vấn cha
Khi thực hiện, câu truy vấn con sẽ được thực hiện nhiều lần, mỗi lần tương
ứng với một bộ của truy vấn cha
3/6/2008
Ôn thi Cao học 2008
40
20
Ví dụ - Lồng phân cấp
SELECT MANV, TENNV
FROM NHANVIEN, DIADIEM_PHG
WHERE DIADIEM=‘TP HCM’ AND PHG=MAPHG
SELECT MANV, TENNV
FROM NHANVIEN
(1,
WHERE PHG IN ( 5)
SELECT MAPHG
FROM DIADIEM_PHG
WHERE DIADIEM=‘TP HCM’ )
3/6/2008
Ơn thi Cao học 2008
41
Ví dụ 5
SELECT SODA
FROM NHANVIEN NV, PHANCONG PC
WHERE NV.MANV=PC.MA_NVIEN AND NV.HONV=‘Nguyen’
UNION
SELECT MADA
FROM NHANVIEN NV, PHONGBAN PB, DEAN DA
WHERE NV.MANV=PB.TRPHG AND PB.MAPHG=DA.PHONG
AND NV.HONV=‘Nguyen’
3/6/2008
Ôn thi Cao học 2008
42
21
Ví dụ 5
SELECT DISTINCT TENDA
FROM DEAN
WHERE MADA IN (
SELECT SODA
FROM NHANVIEN, PHANCONG
WHERE MANV=MA_NVIEN AND HONV=‘Nguyen’ )
OR MADA IN (
SELECT MADA
FROM NHANVIEN, PHONGBAN, DEAN
WHERE MANV=TRPHG AND MAPHG=PHONG
AND HONV=‘Nguyen’ )
3/6/2008
Ôn thi Cao học 2008
43
Ví dụ 7
Tìm những nhân viên khơng có thân nhân nào
SELECT *
FROM NHANVIEN
WHERE MANV NOT IN (
SELECT MA_NVIEN
FROM THANNHAN )
SELECT *
FROM NHANVIEN
WHERE MANV <> ALL (
SELECT MA_NVIEN
FROM THANNHAN )
3/6/2008
Ôn thi Cao học 2008
44
22
Ví dụ 8
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 )
SELECT NV1.*
FROM NHANVIEN NV1, NHANVIEN NV2
WHERE NV1.LUONG > NV2.LUONG AND NV2.PHG=4
3/6/2008
Ôn thi Cao học 2008
45
Ví dụ 9
Tìm những nhân viên có lương lớn hơn lương của tất cả nhân viên
phòng 4
SELECT *
FROM NHANVIEN
WHERE LUONG > ALL (
SELECT LUONG
FROM NHANVIEN
WHERE PHG=4 )
3/6/2008
Ôn thi Cao học 2008
46
23
Ví dụ 10
Tìm những trưởng phịng có tối thiểu một thân nhân
SELECT *
FROM NHANVIEN
WHERE MANV IN (SELECT MA_NVIEN FROM THANNHAN)
AND MANV IN (SELECT TRPHG FROM PHONGBAN)
3/6/2008
Ơn thi Cao học 2008
47
Ví dụ - Lồng tương quan
ương
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE TENPHG=‘Nghien cuu’ AND PHG=MAPHG
SELECT MANV, TENNV
FROM NHANVIEN
WHERE EXISTS (
SELECT *
FROM PHONGBAN
WHERE TENPHG=‘Nghien cuu’ AND PHG=MAPHG )
3/6/2008
Ôn thi Cao học 2008
48
24
Ví dụ 6
Tìm nhân viên có người thân cùng tên và cùng giới tính
SELECT *
FROM NHANVIEN NV
WHERE EXISTS (
SELECT *
FROM THANNHAN TN
WHERE NV.MANV=TN.MA_NVIEN
AND NV.TENNV=TN.TENTN
AND NV.PHAI=TN.PHAI )
3/6/2008
Ơn thi Cao học 2008
49
Ví dụ 7
Tìm những nhân viên khơng có thân nhân nào
SELECT *
FROM NHANVIEN
WHERE NOT EXISTS (
SELECT *
FROM THANNHAN
WHERE MANV=MA_NVIEN)
3/6/2008
Ôn thi Cao học 2008
50
25