Ví dụ Cho biết MANV và TENNV làm việc ở phòng ‘Nghien cuu’ Chương 3 - Ngôn ngữ truy vấn SQL 15 SELECT MANV, TENNV FROM NHANVIEN, PHONGBAN WHERE PHG=MAPHG AND TENPGH=‘ Nghien cuu ’ Mệnh đ
Trang 16 Các lệnh liên quan tới cấu trúc
7 Các lệnh giao quyền truy cập CSDL
8 Bài tập
Trang 2ngôn ngữ SEQUEL (Structured English QUEry
Language), ngôn ngữ được thiết kế tại tập đoàn IBMnhằ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
Trang 33.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
• 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)
Trang 4• 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
Trang 5Mệnh đề SELECT
Trang 6WHERE 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
Trang 7Mệnh đề SELECT (tt)
Mở rộng:
Chương 3 - Ngôn ngữ truy vấn SQL 13
SELECT MANV, LUONG*1.1 AS ‘LUONG10%’
WHEREPHG=5 AND PHAI=‘ Nam ’
SELECT DISTINCT LUONG
FROMNHANVIEN
WHERE PHG=5 AND PHAI=‘ Nam ’
Trang 8Ví dụ
Cho biết MANV và TENNV làm việc ở phòng ‘Nghien cuu’
Chương 3 - Ngôn ngữ truy vấn SQL 15
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG AND TENPGH=‘ Nghien cuu ’
Mệnh đề WHERE
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG AND TENPHG=‘ Nghien cuu ’
Biểu thức luận lý
Trang 9Mệ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
Chương 3 - Ngôn ngữ truy vấn SQL 17
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE ( TENPHG=‘ Nghien cuu ’ OR TENPHG=‘ Quan ly ’) AND PHG=MAPHG
WHERE LUONG>=2000000 AND LUONG<=3000000
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG BETWEEN 2000000 AND 3000000
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG NOT BETWEEN 2000000 AND 3000000
Trang 10– Lấy tất cả những chuỗi không giống
SELECT MANV, TENNV
FROM NHANVIEN
WHERE HONV LIKE ‘ Nguyen_ _ _ _’
SELECT MANV, TENNV
FROM NHANVIEN
WHERE HONV LIKE ‘Nguyen %’
1 Ký tự bất kỳ
Nhiều ký tự bất kỳ
Trang 11Mệ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)
Chương 3 - Ngôn ngữ truy vấn SQL 21
SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NULL
SELECT MANV, TENNV
Trang 12Mệnh đề FROM
Tên, Bí danh
Chương 3 - Ngôn ngữ truy vấn SQL 23
SELECT TENPHG, DIADIEM
FROM PHONGBAN, DDIEM_PHG
WHERE MAPHG=MAPHG
SELECT TENPHG, DIADIEM
FROM PHONGBAN, DDIEM_PHG
Trang 13Mệnh đề ORDER BY (tt)
Ví dụ:
Chương 3 - Ngôn ngữ truy vấn SQL 25
SELECT MANV, MADA
– 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
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>
Trang 14Mệnh đề GROUP BY (tt)
Ví dụ: Cho biết số lượng nhân viên ở mỗi phòng ban
Chương 3 - Ngôn ngữ truy vấn SQL 27
SELECT PHG, COUNT(*) AS ‘So NV’
FROM NHANVIEN
GROUP BY PHG
Hoặc
SELECT T ENPHG, COUNT(*) AS ‘So NV’
FROM NHANVIEN, PHONGBAN
SELECT MaNV, COUNT(*) AS ‘ So DA’,
SUM (THOIGIAN) AS ‘Tong TG’
FROM PHANCONG
GROUP BY MaNV
SELECT NV.MaNV, TENV,
COUNT(*) AS ‘So DA’,
SUM (THOIGIAN) AS ‘Tong TG’
FROM PHANCONG PC, NHANVIEN NV
WHERE PC.MaNV = NV.MaNV
GROUP BY PC MaNV, TenNV
Trang 15WHERE<điều kiện>
GROUP BY <danh sách cột gom nhóm>
HAVING<điều kiện chọn nhóm>
SELECT MaNV, COUNT(*) AS ‘ So DA’, FROM PHANCONG
GROUP BY MaNV
HAVING COUNT (*) > 2
Trang 16Mệ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
Chương 3 - Ngôn ngữ truy vấn SQL 31
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;
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
– EXP: Tính ex
– SIGN (x): Kiểm tra dấu của x (trả về -1 | 0 | 1)
– Các hàm lượng giác: SIN, COS, TAN, ASIN, ACOS,…
Trang 173.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
– 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
thức ngày dd
thức ngày dd
Trang 18– Kết bằng (phép kết nội – inner join)
– Kết ngoài (outter join)
WHERE<điều kiện kết nối>
SELECT HoNV, Tenlot, TenNV, TenPB
FROM Nhanvien, PhongBan
WHERE PHG = MaPB
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>
Trang 193.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’
Chương 3 - Ngôn ngữ truy vấn SQL 37
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’
Trang 203.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ó)
Chương 3 - Ngôn ngữ truy vấn SQL 39
SELECT HoNV, Tenlot, TenNV, TenPB
FROM NhanVien NV LEFT JOIN PhongBan PB
ON NV.MaNV=PhongBan.TrgPhg
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
Trang 21– 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
Trang 22• 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
Trang 23Ví 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’
Chương 3 - Ngôn ngữ truy vấn SQL 45
SELECTMaNV, HoNV, TenLot, TenNV
FROM PHANCONG PC, NHANVIEN NV
WHERE PC.MaNV = NV.MaNV AND
NV.HoNV LIKE ‘%Nguyễn%’
)
Trang 24Ví 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
Chương 3 - Ngôn ngữ truy vấn SQL 47
Trang 25Ví 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
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
SELECT *
FROM NHANVIEN
WHERE MANV IN (SELECTMaNV FROMTHANNHAN) AND
MANV IN (SELECTTRPHG FROM PHONGBAN)
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*
FROMNHANVIEN NV
WHEREEXISTS (SELECT * FROMTHANNHAN TN
WHERE TN.MaNV = NV.MaNV) AND
EXISTS (SELECT TrgPHG FROM PHONGBAN
WHERE TrgPHG = NV.MaNV)
Trang 26Ví dụ - Truy vấn lồng lương quan (tt)
Tìm những nhân viên không có thân nhân nào
Chương 3 - Ngôn ngữ truy vấn SQL 51
Ví dụ - Truy vấn lồng lương quan (tt)
Tìm những nhân viên có lương cao hơn lương trung bình của phòng
Trang 27Ví dụ - Truy vấn lồng lương quan (tt)
Tìm những nhân viên có lương bằng lương cao hơn lương của ít nhất 1 nhân viên thuộc phòng ‘Tài chính’
Chương 3 - Ngôn ngữ truy vấn SQL 53
SELECT *
FROM NHANVIEN NV1
WHERE EXISTS (
SELECT *
FROMNHANVIEN NV2, PHONGBAN PB
WHERE NV2.Phg = PB.MaPB AND
PB.TenPB LIKE ‘%Tài chính%’ AND
NV1.Luong > NV2.Luong )
Nhận xét IN và EXISTS
IN
– <tên cột> IN <câu truy vấn con>
– Thuộc tính ở mệnh đề SELECT câu truy vấn con phải
có cùng kiểu dữ liệu với thuộc tính ở mệnh đề WHERE trong câu truy vấn cha
– Những câu truy vấn có = ANY hoặc IN đều có thể
chuyển thành câu truy vấn dùng EXISTS
Trang 28Ví dụ: Tìm các mã đề án có nhân viên họ ‘Nguyễn’
tham gia hoặc trưởng phòng chủ trì đề án có họ
‘Nguyễn’
SELECT MaDA
FROM PHANCONG PC, NHANVIEN NV
WHERE (PC.MaNV = NV.MaNV) AND (HoNV = ‘Nguyễn’)
UNION (
SELECTMaDA
FROM NHANVIEN NV, PHONGBAN PB, DEAN DA
WHERE (NV.MaNV=PB.TrgPhg) AND (DA.Phong= PB.MaPB)
AND (NV.HoNV = ‘Nguyễn’) )
Trang 29Tạo mới 1 quan hệ (bảng) với nội dung từ CSDL
Chương 3 - Ngôn ngữ truy vấn SQL 57
3.5.1 Thêm dòng vào bảng
Cú pháp
Ví dụ:
INSERT INTO <tên bảng> ( <danh sách các thuộc tính>)
VALUES (<danh sách các giá trị>)
Trang 30• Thuộc tính NOT NULL
Chương 3 - Ngôn ngữ truy vấn SQL 59
3.5.1 Thêm dòng vào bảng (tt)
Thêm nhiều dòng
Ví dụ:
INSERT INTO <tên bảng> ( <danh sách các thuộc tính>)
<câu truy vấn con>
Trang 313.5.2 Sửa dòng trong bảng
Cú pháp
Ví dụ: Tăng lương 30% cho những người là ‘nữ’
Chương 3 - Ngôn ngữ truy vấn SQL 61
UPDATE <tên bảng>
SET <tên thuộc tính> = <giá trị mới>,
<tên thuộc tính> = <giá trị mới>,
• Không cho chỉnh sửa
• Sửa luôn dòng có giá trị tham chiếu đến (CASCADE)
Trang 323.5.3 Xóa dòng trong bảng
Cú pháp
Ví dụ:
Chương 3 - Ngôn ngữ truy vấn SQL 63
DELETE FROM <tên bảng>
WHERE <điều kiện>
3.5.3 Xóa dòng trong bảng (tt)
Ví dụ: Xóa đi những nhân viên làm ở phòng ‘Dự án’
DELETE FROM NHANVIEN
WHERE PHG IN (
SELECT MaPB
FROM PHONGBAN
WHERE TenPB = ‘Phòng Dự án’ )
Trang 333.5.3 Xóa dòng trong bảng (tt)
Nhận xét
– Số dòng bị xóa phụ thuộc vào điều kiện sau WHERE
– Nếu không chỉ rõ điều kiện sau WHERE tất cả các
dòng trong bảng sẽ bị xóa
– Lệnh DELETE FROM có thể gây ra vi phạm RBTV
• Không cho xóa
• Xóa luôn những dòng có giá trị đang tham chiếu đến
• Đặt Null cho những giá trị tham chiếu
Chương 3 - Ngôn ngữ truy vấn SQL 65
3.5.3 Xóa dòng trong bảng (tt)
Trang 343.5.4 Tạo bảng từ CSDL
Cú pháp:
Chương 3 - Ngôn ngữ truy vấn SQL 67
SELECT <danh sách cột/biểu thức>
FROM <tên bảng nguồn>
SELECT PB.TenPB, AVG(NV.Luong) AS TBLuong
INTO TABLE TBLUONG_PHONGBAN
WHERE NV.PHG = PB.MaPB
GROUP BY PHG, TenPB
Trang 353.6 Các lệnh liên quan cấu trúc CSDL
Các kiểu dữ liệu trong SQL
Chương 3 - Ngôn ngữ truy vấn SQL 69
Tên kiểu Ý nghĩa
Char (w) Kiểu ký tự độ rộng cố định (w)
Varchar(w) Kiểu ký tự có độ rộng thay đổi 0 ÷ w
Integer Kiểu số nguyên
Byte Kiểu số nguyên nhỏ (0÷255)
Numberic (w,s) Số thực rộng w vị trí (cả dấu chấm) có s chữ số thập
phân Real, Double Số thực dấu phẩy động
Float (n) Số thực dấu phẩy động có ít nhất n chữ số
Date Kiểu ngày tháng
Time Kiểu thời gian (giờ/phút/giây)
Logical Kiểu logic (True/False)
3.6.1 Lệnh tạo bảng CREATE TABLE
Trang 403.6.2 Lệnh sửa bảng (tt)
Ví dụ - thay đổi cấu trúc
Chương 3 - Ngôn ngữ truy vấn SQL 79
3.6.2 Lệnh sửa bảng (tt)
Ví dụ - thay đổi RBTV
Trang 433.8 Bài tập
(Tài liệu, trang 59 – 62)
Chương 3 - Ngôn ngữ truy vấn SQL 85