HCSDL
1
NN
NN
CHƯƠNG
CHƯƠNG
2
2
SQL
(Structured Query Language)
HCSDL 2
NN
NN
Gi
Gi
ớ
ớ
i thi
i thi
ệ
ệ
u chung
u chung
Là ngôn ngữ chuẩn cho các CSDL quan hệ
Chuẩn ANSI SQL được công bố vào năm 1989,
1992 và 1999
Đặc điểm của SQL:
Ngôn ngữ tựa tiếng Anh
Ngôn ngữ phi thủ tục
Gồm 3 nhóm lệnh:
DDL (Data Definition Language)
DML (Data Manipulation Language)
DCL (Data Control Language)
2
HCSDL 3
NN
NN
DDL
DDL
(
(
D
D
ata
ata
D
D
efinition
efinition
L
L
anguage)
anguage)
DDL là ngôn ngữ định nghĩa dữ liệu gồm các
lệnh
CREATE/ALTER/DROP DATABASE
CREATE/ALTER/DROP TABLE
3
HCSDL 4
NN
NN
DML
DML
(
(
D
D
ata
ata
M
M
anipulation
anipulation
L
L
anguage)
anguage)
DML là ngôn ngữ thao tác dữ liệu
Gồm các lệnh:
SELECT
INSERT, UPDATE, DELETE, TRUNCATE
4
HCSDL 5
NN
NN
DCL
DCL
(
(
D
D
ata
ata
C
C
ontrol
ontrol
L
L
anguage)
anguage)
DCL là ngôn ngữ điều khiển dữ liệu
Gồm các lệnh
GRANT/REVOKE/ADD
COMMIT/ROLLBACK
5
HCSDL 6
NN
NN
Truy v
Truy v
ấ
ấ
n d
n d
ữ
ữ
li
li
ệ
ệ
u (Data query)
u (Data query)
Cú pháp chung của lệnh SELECT
SELECT
select_list
[ INTO
new_table
]
FROM
table_source
[WHERE
search_condition
]
[GROUP BY
group_by_expression
[ HAVING
search_condition
]]
[ORDER BY
order_expression
[ ASC | DESC ]]
6
HCSDL 7
NN
NN
Câu l
Câu l
ệ
ệ
nh truy v
nh truy v
ấ
ấ
n đơn
n đơn
giả
giả
n
n
Ví dụ: liệt kê tất cả giáo sư khoa IT
SELECT P.Name
FROM PROFESSOR P
WHERE P.DeptID =‘CS’
P được gọi là biến bộ (tuple variable). Với
câu lệnh đơn giản không cần phải dùng
biến bộ này
Biểu thức đại số quan hệ tương đương??
7
''
(( ))
Name DeptID CS
P
ROFESSOR
π
σ
=
HCSDL 8
NN
NN
Chi
Chi
ế
ế
n lư
n lư
ợ
ợ
c chung
c chung
để
để
đ
đ
á
á
nh gi
nh gi
á
á
câu truy
câu truy
v
v
ấ
ấ
n đơn gi
n đơn gi
ả
ả
n
n
Bước 1: mệnh đề FROM được đánh giá
trước Æ tạo ra 1 bảng là kết quả tích
Cartesian của các bảng trong mệnh đề
FROM
Bước 2: mệnh đề WHERE được đánh giá
Æ Tạo ra 1 bảng mới từ bảng của bước 1
và chỉ chứa các hàng thỏa điều kiện
WHERE
Bước 3: mệnh đề SELECT được đánh giá
-Æ tạo ra 1 bảng mới từ bảng của bước 2
nhưng chỉ chứa các cột có trong mệnh đề
SELECT
8
HCSDL 9
NN
NN
M
M
ệ
ệ
nh đ
nh đ
ề
ề
SELECT
SELECT
Để đưa ra danh sách các cột cần xem
Cú pháp:
SELECT [ ALL | DISTINCT ][ TOP
n
[ PERCENT ]
[ WITH TIES ] ] < select_list >
<select_list > ::=
{*
|{
table_name
|
view_name
|
table_alias
}.*
| {
column_name
|
expression
}
[[ AS ]
column_alias
]
|
column_alias
=
expression
} [ ,
n
]
9
HCSDL 10
NN
NN
M
M
ệ
ệ
nh đ
nh đ
ề
ề
SELECT
SELECT
ALL (DEFAULT): hiển thị tất cả các bản
ghi kể cả các hàng trùng nhau.
DISTINCT: chỉ hiển thị các hàng duy nhất
không trùng nhau trong bảng kết quả.
Ví dụ: liệt kê tất cả các thành phố mà
hiện thời các khách hàng đang sống
SELECT DISTINCT City , Region
FROM Customers
10
HCSDL 11
NN
NN
M
M
ệ
ệ
nh đ
nh đ
ề
ề
SELECT
SELECT
TOP
n
[PERCENT]: chỉ có n hàng đầu tiên hay
n% của các hàng của bảng kết quả được xuất .
WITH TIES: cho phép 1 số hàng được thêm vào
bảng kết quả gốc nếu các hàng này có cùng giá
trị trong cột ORDER BY với hàng cuối cùng của n
hàng đầu tiên được xác định.
Ví dụ: liệt kê 3 hoá đơn có cước phí cao nhất
SELECT top 3 with ties OrderID, Freight
FROM Orders
Order by Freight DESC
Nếu hàng thứ tư có cùng cước phí (freight) với
hàng thứ ba trong bảng kết quả thì sao???
11
HCSDL 12
NN
NN
M
M
ệ
ệ
nh đ
nh đ
ề
ề
SELECT
SELECT
Ví dụ 1:
SELECT OrderID, ProductID,
Amount = UnitPrice*Quantity* (1- Discount)
FROM [Order Details]
12
HCSDL 13
NN
NN
C
C
á
á
c h
c h
à
à
m t
m t
ậ
ậ
p h
p h
ợ
ợ
p (Aggregate function)
p (Aggregate function)
Tên h
Tên h
à
à
m
m
Ý ngh
Ý ngh
ĩ
ĩ
a
a
SUM
SUM
T
T
í
í
nh t
nh t
ổ
ổ
ng c
ng c
á
á
c s
c s
ố
ố
MIN
MIN
Tr
Tr
ả
ả
v
v
ề
ề
gi
gi
á
á
tr
tr
ị
ị
nh
nh
ỏ
ỏ
nh
nh
ấ
ấ
t
t
MAX
MAX
Tr
Tr
ả
ả
v
v
ề
ề
gi
gi
á
á
tr
tr
ị
ị
l
l
ớ
ớ
n nh
n nh
ấ
ấ
t
t
AVG
AVG
T
T
í
í
nh gi
nh gi
á
á
tr
tr
ị
ị
trung b
trung b
ì
ì
nh
nh
COUNT
COUNT
Đ
Đ
ế
ế
m s
m s
ố
ố
ph
ph
ầ
ầ
n t
n t
ử
ử
(not null)
(not null)
13
Được dùng để tổng kết các giá trị của 1 cột hay 1
nhóm cột bên trong 1 bảng và cho kết quả là 1 giá trị
đơn
HCSDL 14
NN
NN
V
V
í
í
d
d
ụ
ụ
c
c
á
á
c h
c h
à
à
m g
m g
ộ
ộ
p trong l
p trong l
ệ
ệ
nh select
nh select
SELECT sum (Freight) FROM dbo.Orders
Î Tính tổng cước phí chuyên chở của tất cả hóa
đơn
SELECT count (OrderID) from dbo.Orders
Î Đếm số hoá đơn
SELECT SUM (UnitPrice*Quantity*(1-Discount))
FROM dbo.[Order Details]
Î Tính doanh số bán hàng
14
HCSDL 15
NN
NN
M
M
ệ
ệ
nh đ
nh đ
ề
ề
WHERE
WHERE
Chứa điều kiện lọc dữ liệu cần trả về
Cú pháp: WHERE <search_condition>
Ví dụ:
SELECT CustomerID, CompanyName
FROM Northwind.dbo.Customers
WHERE Region = 'WA'
Dùng like , is null, is not null, between and ,
!=, >, <….
15
HCSDL 16
NN
NN
M
M
ệ
ệ
nh đ
nh đ
ề
ề
ORDER BY
ORDER BY
Xác định thứ tự của bộ kết quả
Cú pháp
[ ORDER BY {
order_by_expression
[ ASC |
DESC ] } [ ,
n
] ]
ASC (ascending) : xếp theo thứ tự tăng
DESC (descending): xếp theo thứ tự giảm
16
HCSDL 17
NN
NN
Nh
Nh
ó
ó
m d
m d
ữ
ữ
li
li
ệ
ệ
u trong b
u trong b
ả
ả
ng k
ng k
ế
ế
t qu
t qu
ả
ả
Những mệnh đề dùng để nhóm dữ trong
bảng kết quả:
GROUP BY: tổng hợp bảng kết quả theo
nhóm bằng cách dùng các hàm gộp
COMPUTE và COMPUTE BY: mệnh đề
COMPUTE trong lệnh SELECT được dùng để
phát ra các hàng tổng hợp bằng cách dùng
hàm gộp. Mệnh đề COMPUTE BY được dùng
để tổng hợp thêm các hàng kết quả theo cột
17
HCSDL 18
NN
NN
M
M
ệ
ệ
nh đ
nh đ
ề
ề
GROUP BY
GROUP BY
Cú pháp:
[ GROUP BY [ ALL ]
group_by_expression
[
,
n
]
ALL: bảng kết quả sẽ chứa tất cả các nhóm kể cả
những nhóm không thỏa mãn điều kiện lọc trong
trong mệnh đề WHERE, những nhóm không thoả
điều kiện sẽ có giá trị null.
group_by_expression: biểu thức dùng để xác định
cột được nhóm (tên cột)
18
HCSDL 19
NN
NN
V
V
í
í
d
d
ụ
ụ
1
1
SELECT Type, Advance = SUM (Advance)
FROM Titles
WHERE Type IN ('business', 'mod_cook',
'trad_cook')
GROUP BY Type
Type Advance
business 25125.0000
mod_cook 15000.0000
trad_cook 19000.0000
(3 row(s) affected)
19
HCSDL 20
NN
NN
V
V
í
í
d
d
ụ
ụ
2
2
SELECT Type, Advance = SUM (Advance)
FROM Titles
WHERE Type IN ('business', 'mod_cook', 'trad_cook')
GROUP BY ALL Type
Type Advance
business 25125.0000
mod_cook 15000.0000
popular_comp NULL
psychology NULL
trad_cook 19000.0000
UNDECIDED NULL
(6 row(s) affected)
20
HCSDL 21
NN
NN
GROUP BY v
GROUP BY v
à
à
HAVING
HAVING
Có thể hạn chế các nhóm trong bảng kết
quả bằng mệnh đề HAVING.
Chỉ sau khi dữ liệu đã được nhóm và tổng
hợp , điều kiện trong mệnh đề HAVING
mới được áp dụng.
Không thể dùng 1 cột mà nó không tham
gia vào hàm gộp của mệnh đề SELECT
hay của mệnh đề GROUP BY.
SELECT pub_id, AVG(price) FROM titles
GROUP BY pub_id HAVING (AVG(price) >
10)
21
HCSDL 22
NN
NN
S
S
ử
ử
d
d
ụ
ụ
ng WHERE v
ng WHERE v
à
à
HAVING
HAVING
Mệnh đề HAVING giống như mệnh đề WHERE
nhưng chỉ áp dụng cho cả nhóm trong khi mệnh
đề WHERE áp dụng cho từng hàng.
Một truy vấn có thể chứa cả mệnh đề WHERE và
mệnh đề HAVING.
Mệnh đề WHERE được áp dụng trước cho các
hàng trong bảng được truy vấn. Chỉ những hàng
nào thoả mãn điều kiện của mệnh đề WHERE mới
được nhóm dữ liệu.
Sau đómệnh đề HAVING sẽ được áp dụng cho các
nhóm. Chỉ những nhóm thỏa mãn điều kiện
HAVING mới được xuất ra bảng kết quả.
22
HCSDL 23
NN
NN
V
V
í
í
d
d
ụ
ụ
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG (price) > 10
23
HCSDL 24
NN
NN
SELECT INTO
SELECT INTO
Lệnh SELECT với mệnh đề INTO được dùng dể lưu trữ
kết quả truy vấn vào 1 bảng mới mà không cần phải
định nghĩa trước bảng.
Cú pháp
SELECT columns_list
INTO new_table_name
FROM table_name1, table_name2,………,
table_namen
WHERE condition1, condition2,……….,
conditionn
Ví dụ
SELECT Title_Id, Title INTO NewTitles
FROM Titles WHERE Price > $15
24
HCSDL 25
NN
NN
M
M
ệ
ệ
nh đ
nh đ
ề
ề
JOIN (k
JOIN (k
ế
ế
t n
t n
ố
ố
i c
i c
á
á
c b
c b
ả
ả
ng)
ng)
Mệnh đề join dùng để khôi phục dữ liệu từ nhiều
hơn 1 bảng
Cú pháp
SELECT column_name [,n ]
FROM table_name table_alias
[CROSS|INNER|[LEFT | RIGHT]OUTER]
JOIN table_name table_alias
[ON table_name.ref_column_name
join_operator
table_name.ref_column_name]
[WHERE search_condition]
25