Chương
Chương
4. NGÔN NG
4. NGÔN NG
Ữ
Ữ
SQL
SQL
GV: Trần Ngân Bình
4. 2
N
N
ộ
ộ
i Dung
i Dung
Giới thiệu ngôn ngữ SQL
Truy vấn dữ liệu bằng lệnh SELECT
Cậpnhật dữ liệu (INSERT – Thêm, DELETE – Xóa,
UPDATE – Sửa)
4. 3
M
M
ụ
ụ
c tiêu c
c tiêu c
ủ
ủ
a SQL
a SQL
Một cách lý tưởng, ngôn ngữ CSDL phải cho phép
người dùng:
) Tạo CSDL và cấu trúc quan hệ
) Thực hiện việc xen, sửa, xóa dữ liệu trên các quan hệ.
) Thực hiện các câu truy vấn đơn giản và phức tạp.
Phải thực hiện các công việc này với công sức bỏ ra
là nhỏ nhất và cú pháp lệnh phải dễ học.
Có thể sử dụng như nhau trên các HQTCSDL khác
nhau (~ tuân theo chuẩn nào đó).
4. 4
L
L
ị
ị
ch s
ch s
ử
ử
ph
ph
á
á
t tri
t tri
ể
ể
n c
n c
ủ
ủ
a SQL
a SQL
Năm 1974, D. Chamberlin (IBM San Jose Lab) định
nghĩa ngôn ngữ SEQUEL (Structured English Query
Language).
Một phiên bản sửa chữa, SEQUEL/2, đã được đưa ra
vào năm 1976 nhưng sau đó đổi tên thành SQL vì lý
do pháp lý.
Sau đóIBM tạo ra một bản mẫu HQTCSDL gọi là
System R, dựa trên SEQUEL/2.
Tuy nhiên gốc rễ của SQL là từ ngôn ngữ SQUARE
(Specifying Queries as Relational Expressions), là
ngôn ngữ đã có trước dự án System R.
Vào cuối 70s, ORACLE xuất hiện và được xem là
HQTCSDL thương mại đầu tiên dựa trên SQL.
4. 5
L
L
ị
ị
ch s
ch s
ử
ử
ph
ph
á
á
t tri
t tri
ể
ể
n c
n c
ủ
ủ
a SQL
a SQL
Năm 1987, ANSI và ISO công bố chuẩn đầu tiên cho
SQL.
Năm 1989, ISO công bố thêm phần phụ lục định
nghĩa một ‘Nét cải tiến cho toàn vẹn’.
Năm 1992, phiên bản chỉnh sửa đầu tiên của chuẩn
này có mặt, mang tên SQL2 hay SQL-92.
Năm 1999, SQL:1999 được phát hành với các chuẩn
hỗ trợ cho quản lý dữ liệu hướng đối tượng.
Vào cuối năm 2003, SQL:2003 ra đời.
4. 6
Ngôn Ng
Ngôn Ng
ữ
ữ
SQL
SQL
SQL là một ngôn ngữ phi thủ tục với hai thành phần
chính:
) DDL (Data Definition Language) dùng để định nghĩa cấu trúc
của CSDL. ANSI chia DDL gồm 2 phần:
DDL gồm các lệnh để định nghĩa cấu trúc của CSDL:
CREATE TABLE, CREATE VIEW, ALTER TABLE,…
DCL (Data Control Language) gồm các lệnh để điều khiển
quyền truy cập trên dữ liệu: GRANT, REVOKE,…
) DML (Data Manipulation Language) để truy xuất và cập nhật
dữ liệu: INSERT, UPDATE, DELETE, SELECT, …
4. 7
Câu l
Câu l
ệ
ệ
nh SQL
nh SQL
Hầu hết các phần trong câu lệnh SQL là không phân biệt chữ
hoa chữ thường, trừ các ký tự trong chuỗi dữ liệu.
Tuy câu lệnh SQL có hình thức tự do nhưng để dễ đọc, ta nên:
) Viết mỗi mệnh đề của lệnh trên một dòng riêng
) Viết bắt đầu một mệnh đề thẳng hàng với các mệnh đề khác
) Nếu một mệnh đề có nhiều vế thì nên viết mỗi vế trên một dòng và
thục vào trong mệnh đề đó.
Ví dụ:
SELECT Hten_nv, Cviec
FROM Nhan_vien
WHERE Phai = ‘nam’
AND (Ma_phong=30 OR Ma_phong=40)
Câu lệnh SQL gồm 2 thành phần: Từ khóa và từ do người dùng
định nghĩa (tên bảng, tên cột, )
4. 8
C
C
ú
ú
ph
ph
á
á
p câu l
p câu l
ệ
ệ
nh SQL
nh SQL
Cú pháp của lệnh SQL được giới thiệu
theo dạng mở rộng của ký hiệu BNF:
)Chữ hoa đại diện cho từ khóa.
)Chữ thường đại diện cho các từ của người
dùng định nghĩa
)Dấu | chỉ sự lựa chọn.
)Dấu { chỉ phần tử bắt buộc phải có.
)Dấu [ chỉ phần tử tùy chọn (không bắt buộc).
)Dấu chỉ thành phần có thể lặp lại từ 0 đến nhiều lần.
4. 9
CSDL v
CSDL v
í
í
d
d
ụ
ụ
1. PHONG (MA_PHONG, TEN_PHONG, TRUONG_PHONG )
Mỗi phòng có một mã duy nhất, một tên phòng, trưởng phòng là mã nhân
viên của trưởng phòng.
2. NHANVIEN (MA_NV, HTEN_NV, PHAI, CVIEC, LUONG, PHU_CAP,
MA_PHONG)
Nhân viên có một mã duy nhất, một họ tên, phái, công việc, lương, phụ cấp
và thuộc một phòng nào đó.
3. TĐO_NN (MA_NV, NGOAINGU, BANG_CAP)
Một nhân viên có thể biết nhiều ngoại ngữ,mỗi ngoại ngữ có thể có các
bằng cấp khác nhau.
4. 10
Truy
Truy
v
v
ấ
ấ
n
n
đơn
đơn
gi
gi
ả
ả
n
n
Truy vấnDL từ mộtbảng, có thểđịnh thứ tự xuấthiện
các cột
SELECT [ DISTINCT | ALL]
{ * | <tên cột 1> [,<tên cột 2> [, ] ] }
FROM <tên bảng>
) DISTINCT: Chỉ hiển thị những dòng phân biệt.
) ALL: hiển thị tất cả (chế độ mặc định)
) Lưu ý: Khác với phép chiếu của ĐSQH, các dòng trùng nhau
của bảng kết quả không tự động bị loại bỏ.
) Dấu hoa thị (*) thay thế tất cả các cột trong bảng.
Thứ tự các mệnh đề không được thay đổi.
SELECT và FROM là hai mệnh đề duy nhất bắt buộc
phải có.
4. 11
Truy
Truy
v
v
ấ
ấ
n
n
đơn
đơn
gi
gi
ả
ả
n
n
–
–
v
v
í
í
d
d
ụ
ụ
Hiểnthị toàn bộ nội dung củabảng
NHAN_VIEN:
SELECT * FROM Nhan_vien
Hiểnthị danh sách gồmhọ tên nhân viên và
phái:
SELECT HTen_nv, Phai
FROM Nhan_vien
Hiểnthị danh sách các mứclương có thể có của
nhân viên:
SELECT DISTINCT Luong
FROM Nhan_vien
4. 12
S
S
ắ
ắ
p
p
x
x
ế
ế
p
p
k
k
ế
ế
t qu
t qu
ả
ả
Sắpxếpkếtquả theo một hay nhiềucột:
) Sử dụng mệnh đề ORDER BY ở cuốilệnh SELECT:
ORDER BY <Tên Cột | STT Cột> [ASC| DESC]
[,<Tên Cột| STT Cột> [ASC| DESC],…]
ASC là chế độ sắp xếp mặc định
Ví dụ: Sắpxếpkếtquả theo mã phòng tăng dần, và
lương giảmdần.
SELECT *
FROM Nhan_vien
ORDER BY Ma_phong, Luong DESC
4. 13
Ch
Ch
ọ
ọ
n
n
c
c
á
á
c
c
dòng
dòng
trong
trong
b
b
ả
ả
ng (1)
ng (1)
Sử dụng mệnh đề WHERE sau MĐ FROM để chọn các dòng
thỏa điều kiện
WHERE <Điều kiện chọn 1> [ AND | OR <ĐK chọn 2> [ ] ]
Dạng ĐK 1: So sánh giá trị thuộc tính với 1 giá trị cụ thể:
<Cột 1> so sánh <giá trị>
) Ví dụ: Hiển thị tất cả các thông tin của nhân viên Lê Quỳnh Như
SELECT * FROM Nhan_vien
WHERE Hten_nv = ‘Lê Quỳnh Như’
) Ví dụ: Hiển thị tên và tên công việc của các nhân viên nam đang
làm việc trong các phòng 30, 40
SELECT Hten_nv, CVIEC
FROM Nhan_vien
WHERE Phai = ‘Nam’ AND
(Ma_phong=30 OR Ma_phong=40)
4. 14
Ch
Ch
ọ
ọ
n c
n c
á
á
c dòng trong b
c dòng trong b
ả
ả
ng (2)
ng (2)
Dạng ĐK 2: So sánh giá trị của các thuộc tính với nhau:
<Cột 1> so sánh <Cột 2>
) Ví dụ: Tìm những nhân viên có lương bằng hai lần phụ cấp:
SELECT Hten_nv, Luong, Phu_cap
FROM Nhan_vien
WHERE Luong = Phu_cap * 2
Dạng ĐK 3: So sánh giá trị thuộc tính với hằng có kiểu
tương thích:
<Cột> so sánh <Hằng>
) Ví dụ: Hiển thị họ tên các NV nam có công việc là thư ký
SELECT Hten_nv
FROM Nhan_vien
WHERE Phai = 'Nam' AND UPPER(cviec) = ‘THU KY’
4. 15
Ch
Ch
ọ
ọ
n c
n c
á
á
c dòng trong b
c dòng trong b
ả
ả
ng (3)
ng (3)
Dạng ĐK 4: So sánh cột với một tập gồm nhiều giá trị:
<Cột> [NOT] IN (<Danh sách các giá trị>)
) Ví dụ:Hiển thị họ tên các NV làm việc trong các phòng 10, 30
và 50.
SELECT Hten_nv
FROM Nhan_vien
WHERE Ma_phong IN ( 10, 30, 50 )
Dạng ĐK 5: Tìm kiếm theo phạm vi:
<Cột> [NOT] BETWEEN <Giá trị đầu> AND <Giá trị cuối>
) Ví dụ: Hiển thị họ tên các NV có mức lương từ 3500 đến
4500
SELECT Hten_nv, Luong
FROM Nhan_vien
WHERE Luong BETWEEN 3500 AND 4500
4. 16
C
C
á
á
c
c
d
d
ạ
ạ
ng
ng
đi
đi
ề
ề
u
u
ki
ki
ệ
ệ
n
n
ch
ch
ọ
ọ
n
n
(4)
(4)
Dạng ĐK 6: Tìm kiếm theo mẫu dạng chuỗi:
<Cột> [NOT] LIKE <Chuỗi>
_ : đại diện cho một ký tự bất kỳ
% : đại diện cho một chuỗi ký tự bất kỳ
) Ví dụ: Hiển họ thị tên của các NV có tên lót là ‘Văn’
SELECT Hten_nv, Ma_phong FROM Nhan_vien
WHERE Hten_nv LIKE ‘% Van %’
) Ví dụ: Hiển thị các NV có tên vần ‘ao’ như Bao, Hao, Thao,
SELECT * FROM Nhan_vien
WHERE Hten_nv LIKE ‘% %_ao’
Dạng ĐK 7: Tìm kiếm theo trị trống NULL
<Cột> IS [NOT] NULL
) Ví dụ: Hiển thị các NV Không được hưởng phụ cấp
SELECT * FROM Nhan_vien Where Phu_cap IS NULL
4. 17
C
C
á
á
c
c
h
h
à
à
m
m
k
k
ế
ế
t
t
t
t
ậ
ậ
p
p
Các hàm kết tập (Aggregate Functions) còn đượcgọi
là hàm cột (Field Functions):
) AVG (<biểuthứcsố có bao hàm cộtkiểusố>)
) SUM (<biểuthứcsố có bao hàm cộtkiểusố>)
) MIN (<BT số, chuỗi hay ngày có bao hàm cộtkiểutương
ứng>)
) MAX (<BT số, chuỗi hay ngày có bao hàm cộtkiểutương
ứng>)
) COUNT (<BT bấtkỳ> | *)
4. 18
C
C
á
á
c
c
h
h
à
à
m
m
k
k
ế
ế
t
t
t
t
ậ
ậ
p
p
–
–
c
c
á
á
ch d
ch d
ù
ù
ng
ng
Hàm kết tập được dùng trong mệnh đề SELECT như
sau:
SELECT tên-hàm (<Biểu Thức>) [AS <Tên cột
mới>]
[,tên-hàm (<Biểu thức>) [, ]]
FROM tên bảng
Lưuý: Trongmệnh đề select củadạng này, các tên
cộtphải được đặt trong hàm kếttập.
Từ khóa AS cho phép đặtlạitên cộtchocáccộtkết
quả
) Ví dụ: Có bao nhiêu NV trong hồ sơ nhân viên
SELECT COUNT(*) AS Tong_So_NV
FROM Nhan_vien
4. 19
C
C
á
á
c
c
h
h
à
à
m
m
k
k
ế
ế
t
t
t
t
ậ
ậ
p
p
–
–
V
V
í
í
d
d
ụ
ụ
Cho biếtmứclương cao nhất, thấpnhất và trung bình
SELECT MAX( Luong), MIN( Luong), AVG( Luong)
FROM Nhan_vien
Tính tổng lương phải trả cho phòng 40
SELECT SUM (Luong) FROM Nhan_vien
WHERE Ma_phong=40
Cho biết tổng số thư ký nữ và lương trung bình của họ
SELECT COUNT(*), AVG (Luong) FROM Nhan_vien
WHERE Phai = 'Nu' AND Cviec = ‘Thu Ky’
Cho biết phụ cấp thấp nhất của các công việc quản lý
SELECT MIN (Phu_cap) As PCAP_THAPNHT
FROM Nhan_vien WHERE Cviec LIKE ‘Quan Ly %‘
4. 20
T
T
í
í
nh to
nh to
á
á
n v
n v
ớ
ớ
i SQL
i SQL
Các toán tử này được dùng với dữ liệu loại số và bao gồm toán
tử cộng (+), trừ (-), nhân (*), chia (/).
Các toán tử này chỉ có thể được dùng trong các mệnh đề:
SELECT, HAVING và WHERE.
Ví dụ: Hiển thị họ tên, lương, phụ cấp và thu nhập hàng năm của
tất cả nhân viên, sắp xếp theo thu nhập trong năm giảm dần.
SELECT Hten_nv, Luong, Phu_cap,
(Luong + Phu_cap)*12 As Thu_nhap
FROM Nhan_vien
ORDER BY 4 DESC
Ví dụ: Hiển thị tất cả nhân viên có phụ cấp nhiều hơn 15% mức
lương.
SELECT Hten_nv, Luong, Phu_cap FROM Nhan_vien
WHERE Phu_cap > 0.15 *Luong
4. 21
Truy v
Truy v
ấ
ấ
n con (1)
n con (1)
Trong trường hợp điều kiện chọn ở mệnh đề WHERE
cần truy cập thông tin ở các bảng khác với bảng đang
truy vấn để kiểm tra điều kiện
Ta có thể sử dụng một câu select khác lồng trong
điều kiện ở mệnh đề WHERE. Select này được gọi là
SELECT CON hay truy vấncon
4. 22
Truy v
Truy v
ấ
ấ
n con (1)
n con (1)
Cáctruyvấncon sẽ nằm trong mệnh đề WHERE của
truy vấn chính.
SELECT <Tên các cột>
FROM <Tên bảng>
WHERE <điềukiệnchứa select con>
( SELECT <Tên các cột>
FROM <Tên bảng> [WHERE
<Điềukiện>] )
[AND | OR <điềukiệnchứa select con>
( SELECT <Tên các cột>
FROM <Tên bảng> [WHERE
<Điềukiện>] )
[ ] ]
Truy vấn
con 1
Truy vấn
con 2
Truy vấn
chính
(truy vấn
cha)
4. 23
C
C
á
á
c d
c d
ạ
ạ
ng đi
ng đi
ề
ề
u ki
u ki
ệ
ệ
n ch
n ch
ứ
ứ
a Select con (1)
a Select con (1)
Dạng 1: <Tên cột> <so sánh> (<select con>): ĐK đúng khi giá
trị của cột so sánh đúng với giá trị trả về từ select con
) Ví dụ: Hiển thị họ tên nhân viên có lương cao nhất
SELECT Hten_nv FROM Nhan_vien
WHERE Luong =
( SELECT MAX (Luong) FROM Nhan_vien )
Dạng 2: <Tên cột> <so sánh> ALL (<select con>): ĐK đúng khi
giá trị củacột so sánh đúng với tấtcả các giá trị trả về từ
select con.
) Ví dụ: Hiển thị họ tên nhân viên có lương cao hơn tất cả các
nhân viên của phòng 30
SELECT Hten_nv FROM Nhan_vien
WHERE Luong > ALL
( SELECT Luong FROM Nhan_vien
WHERE Ma_phong =30 )
4. 24
C
C
á
á
c d
c d
ạ
ạ
ng đi
ng đi
ề
ề
u ki
u ki
ệ
ệ
n ch
n ch
ứ
ứ
a Select con (2)
a Select con (2)
Dạng 3: <Tên cột> <so sánh> ANY|SOME (<select con>): ĐK
đúng khi giá trị của cột so sánh đúng với bất kỳ một giá
trị nào trả về
từ select con.
) Ví dụ: Hiển thị họ tên trưởng phòng của tất cả các phòng
SELECT HTEN_NV FROM NHAN_VIEN
WHERE MA_NV = ANY
( SELECT TRUONG_PHONG FROM PHONG )
Dạng 4: <Tên cột> [NOT] IN (<select con>): ĐK đúng khi giá trị
của cột nằm trong tập hợp các giá trị trả về của select con.
) Ví dụ: Hiển thị họ tên trưởng phòng của tất cả các phòng
SELECT HTEN_NV FROM NHAN_VIEN
WHERE MA_NV IN
( SELECT TRUONG_PHONG FROM PHONG )
4. 25
C
C
á
á
c d
c d
ạ
ạ
ng đi
ng đi
ề
ề
u ki
u ki
ệ
ệ
n ch
n ch
ứ
ứ
a Select con (3)
a Select con (3)
Dạng 5: [NOT] EXISTS (<select con>): Đk đúng khi kết quả
trả về của select con khác rỗng.
) Ví dụ: Hiển thị họ tên những nhân viên có công việc và lương
bằng với 1 nhân viên khác.
SELECT HTEN_NV FROM NHAN_VIEN AS A
WHERE EXISTS
( SELECT * FROM NHAN_VIEN AS B
WHERE A.Cviec = B.Cviec AND A.Luong = B.Luong
AND A.Ma_NV <> B. Ma_NV)