Tải bản đầy đủ (.pdf) (43 trang)

Bài giảng cơ sở dữ liệu chương 3 ngôn ngữ truy vấn SQL

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (892.41 KB, 43 trang )

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


×