ƯƠ
CH
NG IV
Ấ Ữ Ệ
TRUY V N D LI U
ươ
ả
ạ
ạ Gi ng viên: Ph m M nh C ng
1
Ộ
N I DUNG
ộ ố
I M t s hàm TSQL:
ữ ệ
ể
ấ
II Phát bi u truy v n d li u
ạ
ế III các hàm x p lo i (ranking)
2
ộ ố
ự
ử ử
ờ ị
ể
I M t s hàm TSQL: 1. Hàm toán h cọ ỗ 2. Hàm x lý chu i ký t 3. Hàm x lý ngày tháng và th i gian ể ổ 4. Hàm chuy n đ i ki u giá tr ệ ố 5. Hàm h th ng 6. Hàm CASE
3
1 Hàm toán h cọ
ệ ố ủ
ị
1. ABS(x) : Tr tuy t đ i c a x
ủ
ậ
2. SQRT(x) : Căn b c hai c a x
3. SQUARE( x) : tính x2
4. POWER( y, x ) : tính yx
ấ
ấ
ủ ố 5. SIGN( x ) : L y d u c a s x (1: x<0; 0: x=0; 1: x>0)
ớ
ố ẻ
6. ROUND( x, n ) : Làm tròn t
i n s l
.
ố
ỏ
ấ
7. CEILING( x ) : S nguyên nh nh t >= x
ố
ớ
ấ
8. FLOOR( x ) : S nguyên l n nh t <= x
4
ử
ỗ
ự
2 Hàm x lý chu i ký t
:
ả ề ố ự ỗ • LEN(str) : Tr v s ký t trong chu i str
ả ề ữ ườ ỗ • LOWER( str ) : Tr v chu i ch th ng
ữ ỗ ả ề • UPPER(str) : Tr v chu i ch hoa
ả ề ỗ ấ ắ • LTRIM(str) : Tr v chu i không có d u c t bên trái
ả ề ỗ ấ ắ ả • RTRIM(str) : Tr v chu i không có d u c t bên ph i
ấ ự • LEFT(str, n): L y n ký t ủ phía trái c a dãy str.
ấ ự • RIGHT(str, n): L y n ký t ả ủ phía ph i c a dãy str.
ả ề ỗ ự ủ c a • SUBSTRING(str, start, n): Tr v chu i con n ký t
ể ừ ị ỗ chu i str k t v trí start.
ủ ế ằ ị • CHARINDEX(str1, str2): v trí c a str1 trong str2, b ng 0 n u không tìm
th yấ
5
ử
ờ
3 Hàm x lý ngày tháng và th i gian
ờ ủ
ệ ố
1. GETDATE( ): Ngày gi
c a h th ng Microsoft SQL Server
2. DAY( date_exp ) : Trích ngày trong tháng.
3. MONTH ( date_exp ) : Trích Tháng.
4. YEAR ( date_exp ) : Trích Năm.
Chú ý
ố ể
ứ ự
ằ
• H ng s ki u ngày có th t
: ‘m/d/yyyy’ | ‘yyyy/m/d’
ố
ị
ạ
ứ ự
ằ
ố
• Mu n đ nh l
i th t
ghi ngày tháng năm trong h ng s
ử ụ
ể
ệ
ki u ngày s d ng l nh:
SET DATEFORMAT
6
ử
ờ
3 Hàm x lý ngày tháng và th i gian (tt)
ả ề ầ 6. DATEPART(Mã_TP, date) : tr v thành ỉ ph n ch
ể ị ố đ nh trong date, ki u s .
ả ề ầ 7. DATENAME(Mã_TP, date) : Tr v thành ỉ ph n ch
ỗ ể ị đ nh trong ngày, ki u chu i.
ả ề ộ 8. DATEADD(Mã_TP, n, date): Tr v m t ngày gi ờ
ớ ố ộ ầ (date + n), v i n là s nguyên ỉ thu c thành ph n ch
đ nhị
9. DATEDIFF(Mã_TP, date_1, date_2):
ả ầ Kho ng cách (date_2 date_1) theo ỉ thành ph n ch
đ nhị
select * from HoaDon where Datepart(yy,NgayHD)='1994' 7
Ví dụ
1.Hôm nay là ngày 27/08/2010. Ta có:
SELECT DATEPART(month,GETDATE())
-> Kết quả trả về là một số nguyên là 8 (tức tháng 8 )
SELECT DATENAME(month,GETDATE()) -> Kết quả trả về là một chuỗi
là August (tức tháng 8 )
2. Hôm nay là ngày 28 tháng 8 năm 2010, bạn muốn thăng lên 1 ngày và 1 tháng. Tức giá trị bạn mong muốn là ngày 29 tháng 9 năm 2010, được viết như sau:
SELECT DATEADD(month,1,DATEADD(day,1,'8/28/2010'))
3. Use Pubs SELECT DATEDIFF (day, pubdate, getdate ()) AS TongSoNgay From titles
8
ổ
ể
ể
ị
4 Hàm chuy n đ i ki u giá tr
ườ ố ể ể ờ ể Th ữ ệ ng dùng chuy n d li u ki u s , ngày gi sang ki u
ỗ ể ể ị chu i đ hi n th ra màn hình
ỗ ố ổ ể ể 1. STR( x [, len [, dec] ]): Chuy n s x sang ki u chu i có t ng
ầ ẻ ớ ề ặ ị ị chi u dài len (m c đ nh 10) v i ph n l ặ dec (m c đ nh 0).
ồ Select MaMH, Str(DonGia, 10, 2) + N' đ ng' From MatHang
2. CAST(exp AS new_data_type)
Select MaMH, Cast(DonGia As nVarchar(10)) + N' đ ng'ồ
From MatHang
3. CONVERT (new_data_type, exp [, style])
Select MaMH, Convert(nVarchar(10), DonGia) + N' đ ng'ồ
From MatHang 9
ể
ặ
Style cho ki u Float ho c Real
ữ ố ế
ố
ượ
ẽ ể
ị ạ
• 0 T i đa 6 ch s ; n u v
t quá s hi n th d ng mũ
ệ
ạ
ữ ố • 1 Hi n d ng mũ có 8 ch s .
ệ
ạ
ữ ố • 2 Hi n d ng mũ có 16 ch s .
Ví d : ụ Declare @a Float
Set @a = 58947.5589745
SELECT Convert(Varchar,@a ,1)
ế
ả
K t qu : 5.8947559e+004
10
ể
Style cho ki u Money và SmallMoney
ữ ố ậ
ấ
• 0 Có 2 ch s th p phân, không d u phân cách hàng ngàn
ữ ố ậ
ấ
• 1 Có 2 ch s th p phân, có d u phân cách hàng ngàn
ẩ
ấ
ữ ố ậ
ả: 12345.68
• 2 Có 4 ch s th p phân; không d u ph y phân cách hàng ngàn. Ví d :ụ Declare @a money Set @a = 12345.67895 Print Convert(VarChar, @a, 0) • K t quế Print Convert(VarChar, @a, 1) • K t quế ả: 12,345.68 Print Convert(VarChar, @a, 2) ả: 12345.6890 • K t quế
11
ể
Style cho ki u Datetime và SmallDatetime
12
ệ ố
ộ ố
5 M t s hàm h th ng
ợ ệ ể ạ ả ề ợ ệ ế ế • ISDATE( exp ): Ki m tra d ng ngày h p l . Tr v 1 n u h p l và 0 n u
không h p l ợ ệ .
ố ợ ệ ể ạ ả ề ợ ệ ế • ISNUMERIC( exp ): Ki m tra d ng s h p l . Tr v 1 n u h p l và 0
ợ ệ ế n u không h p l .
ả ề ế ị • ISNULL(exp, value) : Tr v giá tr value n u exp có giá tr ị NULL, ng c ượ
ị ả ề ị ủ ể ạ ả ề l i tr v giá tr c a exp. Giá tr tr v cùng ớ ki u v i exp.
ả ề ố ự ố ở ệ ể • @@ROWCOUNT: Tr v s dòng th c hi n b i phát bi u cu i cùng.
ả ề ỗ ủ ố ế ể • @@ERROR : Tr v mã l i (integer) n u có c a phát bi u TSQL cu i
ả ề ố ế ỗ cùng. Tr v s 0 n u không có l i.
13
ọ ự
ị
6 Hàm CASE: Ch n l a giá tr
ị ể
ể
ớ
ị
ị
ứ Cú pháp 1: So sánh giá tr bi u th c v i giá tr sau WHEN đ xác đ nh ả ế k t qu .
14
ọ ự
ị
ứ
ệ
ể
Hàm CASE : Ch n l a giá tr Cú pháp 2: Ki m tra t ng bi u th c đi u ki n ề ừ
ể
ị
ể ế
ả đ xác đ nh k t qu .
15
ữ ệ
ể
ấ
II Phát bi u truy v n d li u
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 ]]
[COMPUTE aggregate_function_list [ BY expression]
ứ ự ự
ệ
Th t
th c hi n:
From>Where>Group By > Having>Select>Order>Compute
16
17
ệ
ữ ệ
ầ
ấ
ả
ỉ
ị
ề 1 M nh đ FROM ứ – Ch đ nh b ng ch a d li u c n truy v n.
Cú pháp: FROM table_source [ [ AS ] label ]…
ả
ữ ệ – B ng d li u có th là
ể : Table, View, SubQuery, Function.
ế ố
ằ
ả
ấ
ề – K t n i m u tin trên nhi u b ng b ng các phép toán :
1. Phép tích Cartesian:
FROM B1, B2,…
FROM B1 CROSS JOIN B2
2. Phép k t:ế
ề
ế
ệ
FROM B1 INNER JOIN B2 ON <đi u ki n k t>
ề
ế
ệ
FROM B1 LEFT JOIN B2 ON <đi u ki n k t>
ế
ề
ệ
FROM B1 RIGHT JOIN B2 ON <đi u ki n k t>
ệ
ề
ế
FROM B1 FULL JOIN B2 ON <đi u ki n k t>
18
PHÉP TÍCH CARTESIAN:
19
Ế
PHÉP K T INNER JOIN
20
Ế
PHÉP K T TRÁI (LEFT JOIN)
21
Ế
Ả PHÉP K T PH I (RIGHT JOIN)
22
Ủ
Ầ
Ế
PHÉP K T Đ Y Đ (FULL JOIN)
23
Ví d :ụ
24
ệ
ề 2 M nh đ WHERE:
ọ
ề
ệ
ộ>
WHERE <đi u ki n ch n b
ự
ọ
ệ
ế
ả
• Dùng th c hi n phép ch n trên b ng k t xu t t
ấ ừ ệ đề FROM
m nh
ọ
ề
ượ
ế ậ
ộ> đ
c thi
ở t l p b i các
phép toán so sánh,
ệ • <đi u ki n ch n b
ữ ệ ư
ữ
phép toán lu n lậ ý trên các d li u l u tr trên các c t
ộ .
25
:
Ngoài ra còn có các các toán t
sauử
• Kiểm tra gía trị rỗng:
• Thuộc miền giá trị:
• Thuộc tập giá trị:
• Kiểm tra chuỗi thuộc mẫu dữ liệu:
26
ệ
ề 3 M nh đ SELECT
SELECT { | }[AS ], …
• Dùng thực hiện phép chiếu, chỉ định các cột cần có trên bảng kết quả truy vấn.
• Đối với các thuộc tính trùng tên trên 2 bảng thì phải chỉ rõ muốn lấy thuộc tính của bảng
nào bằng cách ghi : {|}..
• Dấu * : chọn hết các cột của các bảng nguồn
•
• Cột
27
28
ớ ạ
ể
ầ
Gi
ị i h n các dòng c n hi n th :
SELECT [DISTINCT] [TOP( n ) [ PERCENT ]
• DISTINCT : Chỉ hiện những dòng có dữ liệu phân biệt.
Câu hỏi: Cho biết mã số và tên các mặt hàng đã bán ?
• TOP (< n >) : chỉ hiện n dòng đầu tiên.
Câu hỏi: Danh sách 3 mặt hàng đầu tiên trong table
MatHang ?
29
ữ ệ
ứ
ấ
ạ
T o Table ch a d li u truy v n
Tạo Table chứa dữ liệu truy vấn
SELECT
SELECT * INTO HoaDonLuu from HoaDon
Yêu cầu: Tạo bảng ‘HoaDonLuu’ chứa danh sách các hóa đơn của năm cũ.
30
ệ
ề 4 M nh đ ORDER BY
ORDER BY {
• Sắp xếp các bộ theo thứ tự tăng hay giảm theo các giá trị của
Ví dụ: Tính tiền bán từng mặt hàng trong CTHD sắp thứ tự theo SoHD, và Tiền bán
• Kết hợp ORDER BY với TOP (
Để lấy thêm các dòng kế tiếp có cùng giá trị sắp xếp.
Ví dụ: Liệt kê mặt hàng có đơn giá lớn nhất
31
ệ
ề
5 M nh đ GROUP BY:
• Dùng gom các mẫu tin thành từng nhóm và kết hợp với các hàm tổng hợp để tổng hợp dữ liệu trên
từng nhóm.
GROUP BY
Các hàm tổng hợp theo nhóm:
• SUM([DISTINCT]
• AVG([DISTINCT]
• MAX(
• MIN(
• COUNT([DISTINCT]
NULL.
• COUNT(*): Đếm số dòng trong từng nhóm, kể cả những dòng có tất cả các thuộc tính đều NULL
32
Câu h iỏ
1. Cho biết trong từng loại hàng có bao nhiêu mặt hàng, đơn giá lớn nhất và nhỏ nhất? SELECT MaLH, COUNT(MaMH) AS SoMatHang, MAX(DonGia) AS DonGiaLN, MIN(DonGia) AS DonGiaNN FROM MatHang GROUP BY MaLH
2. Cho biết nhà cung cấp cung ứng các loại hàng nào, số mặt hàng trong từng loại là bao nhiêu ? SELECT MaNCC, MaLH, COUNT(MaMH) AS SoMatHang FROM MatHang GROUP BY MaNCC, MaLH
3. Cho biết trong bảng MatHang có bao nhiêu loại hàng, bao nhiêu mặt hàng, đơn giá lớn nhất là bao
nhiêu ? SELECT MaLH, COUNT(MaLH) AS SoLoaiHang, COUNT(MaMH) AS SoMatHang, MAX(DonGia) AS DonGiaLN FROM MatHang GROUP BY MaLH
33
Chú ý
• Mệnh đề GROUP BY phải chứa tất cả các cột không sử dụng trong các
hàm tổng hợp có trong mệnh đề SELECT.
Câu hỏi: Tính tiền hóa đơn theo đơn giá gốc của mặt hàng
select b2.SoHD, sum(b1.DonGia*b2.SL) as ThanhTien From CTHD as b2 inner join MatHang as b1 on b2.MaMH = b1.MaMH Group by b2.SoHD
34
GROUP BY ALL
• Trả về tất cả các nhóm, kể cả những nhóm không có mẫu tin nào thỏa mãn điều kiện của mệnh đề WHERE.
Câu hỏi: Cho biết số mặt hàng có đơn giá> 20 trong từng loại hàng
select MaLH,count(MaMH) as SLH from MatHang where DonGia>20 group by MaLH
35
ệ
ề 6 M nh đ HAVING
HAVING <điều kiện chọn nhóm>
• Dùng chọn các nhóm thỏa mãn <điều kiện chọn nhóm>
Câu hỏi: Cho biết các hóa đơn có tiền hóa đơn > 500
36
ệ
ề 7 M nh đ COMPUTE:
COMPUTE HàmTổngHợp(
• Tạo thêm bảng thứ 2 có một dòng chứa các giá trị tổng hợp trên các
mẫu tin của các hàm trong COMPUTE.
• Các
Select.
37
ệ
ồ
ờ
t kê danh sách nhân viên, đ ng th i thêm b ng
ươ
Ví d : ụ Li ch a sứ
ố nhân viên và l
ng
ả . ủ trung bình c a nhân viên
Select MaKV, MaNV, Ho, Ten, LuongCB From NhanVien Compute Count(MaNV), AVG(LuongCB)
38
ệ
ề
8 M nh đ COMPUTE ... BY:
ORDER BY
COMPUTE
BY
• Kết hợp với mệnh đề ORDER BY, tạo thêm các bảng chứa dòng tổng hợp
của từng nhóm mẫu tin dựa vào các
BY.
• Các
theo thứ tự từ trái qua phải, bắt đầu từ cột đầu tiên và không bỏ qua bất kỳ
cột nào.
39
ơ ả
ự
ủ
ng c b n c a nhân
ươ ứ
ọ ả
ố ừ
ủ
Ví d : ụ Cho bi ã khu v c, h tên, l ồ viên, đ ng th i t o thêm các b ng ch a s nhân viên và ươ l ng trung b
t Mế ờ ạ ự ình c a các nhân viên trong t ng khu v c
Select MaKV, Ho, Ten, LuongCB From NhanVien Order By MaKV Compute Count(MaKV), AVG(LuongCB) By MaKV
40
ồ
9 Các câu truy v n ấ l ng nhau
• Trong nhiều trường hợp chúng ta cần phải tìm kiếm thông tin qua
nhiều bước truy vấn: kết quả truy vấn của bước trước được sử dụng
trong phát biểu truy vấn tiếp theo…
• Trường hợp này có thể được giải quyết bằng các cách sau:
– Cách 1: Sử dụng trực tiếp phát biểu truy vấn của bước trước bên trong
phát biểu truy vấn của bước sau. Phát biểu truy vấn trung gian đó được gọi
là Subquery. Câu hỏi con, phải được bao trong cặp dấu ngoặc tròn.
– Cách 2: Gán tên kết quả truy vấn của bước trước và sử dụng tên này
trong phát biểu truy vấn của bước sau.
41
ử ụ
ề
ệ
S d ng Subquery trong m nh đ FROM:
FROM (
SELECT SoHD
FROM (SELECT TOP(1) MaMH FROM MatHang
ORDER BY DonGia DESC) as MH_Max, CTHD
WHERE CTHD.MaMH = MH_Max.MaMH
42
ệ
ề
ử ụ S d ng
Subquery trong m nh đ WHERE
• Các phép toán trên Subquery:
1. [NOT] IN ()
Câu hỏi: Mã số, tên các nhân viên không là nhân viên quản lý
2. ALL ()
Câu hỏi: Mã số và tên các mặt hàng có đơn giá lớn nhất SELECT MaMH, TenMH, DonGia FROM MatHang WHERE DonGia >= ALL (SELECT DonGia FROM MatHang AS MatHang )
3. ANY ()
Câu hỏi: Mã số và tên các mặt hàng có đơn giá không là đơn giá lớn nhất SELECT MaMH, TenMH, DonGia FROM MatHang WHERE DonGia < ANY (SELECT TOP (1) DonGia FROM MatHang AS MatHang_1 ORDER BY DonGia DESC)
4. [NOT] EXISTS() : Trả về True nếu subquery có mẫu tin.
Câu hỏi: Mã số và tên các mặt hàng bán trong tháng SELECT * FROM MATHANG AS a WHERE EXISTS(SELECT DISTINCT MAMH FROM CTHD as b where a.MAMH=b.MAMH)
43
44
ứ
ể
ả
Bi u th c b ng (Common table expression)
WITH expression_name [ ( column_name [ ,...n ] ) ]
AS ( SELECT statement )
• Gán tên cho bảng kết quả của một phát biểu Select để sử dụng trong
phát biểu SELECT, INSERT, UPDATE, hay DELETE kế tiếp.
• expression_name: Tên của biểu thức bảng
• column_name: tên các cột trong biểu thức bảng.
• Phát biểu Select không chứa các phát biểu:
– COMPUTE hoặc COMPUTE BY
– ORDER BY (ngoại trừ có sử dụng mệnh đề TOP)
– INTO
45
ử ụ
ứ
ả
ể S d ng bi u th c b ng
Câu hỏi: Liệt kê số hóa đơn có ghi các mặt hàng có đơn giá lớn nhất?
WITH MH_Max
AS (SELECT TOP(1) MaMH FROM MatHang ORDER BY DonGia DESC)
SELECT SoHD
FROM CTHD INNER JOIN MH_Max
ON CTHD.MaMH = MH_Max.MaMH
46
Ạ
Ế
III CÁC HÀM X P LO I (RANKING)
• Tạo cột chứa giá trị xếp loại (Ranking) cho mỗi dòng trong
từng nhóm mẫu tin, dựa trên mệnh đề OVER.
ranking_function
OVER( [
•
Dùng phân chia bảng dữ liệu trả về từ mệnh đề FROM thành nhiều
nhóm mẫu tin dựa trên giá trị các
•
để nhận giá trị hàm Ranking.
47
1 Hàm ROW_NUMBER()
Trả về số thứ tự, kiểu BigInt, của mỗi dòng trong mỗi nhóm mẫu tin. Bắt đầu từ 1 cho mỗi nhóm.
Xếp thứ tự mặt hàng theo đơn giá trong từng loại hàng và thêm cột đánh số thứ tự cho các mặt hàng trong từng loại hàng
SELECT MatHang.MaMH, TenMH,DONGIA,MALH, ROW_NUMBER() OVER(PARTITION BY MALH ORDER BY DONGIA ASC) AS STT FROM MatHang
48
ụ
Ví d : không dùng
SELECT MatHang.MaMH, TenMH,DONGIA,MALH,ROW_NUMBER()
OVER(ORDER BY MALH ASC) AS STT
FROM MatHang
49
2 Hàm RANK()
• Trả về giá trị xếp hạng, kiểu BigInt của mỗi dòng trong mỗi nhóm mẫu tin.
• Với mỗi nhóm, giá trị xếp hạng bắt đầu từ 1, giá trị xếp hạng của dòng sau sẽ
bằng giá trị của dòng trước nếu cùng giá trị sắp xếp ngược lại thì bằng số thứ
tự mẫu tin trong nhóm
Ví dụ: Xếp hạng các mặt hàng theo đơn giá trong từng loại hàng
SELECT MatHang.MaMH, TenMH,DONGIA,MALH, RANK() OVER(partition by MALH ORDER BY DONGIA ASC) AS HANG FROM MatHang
50
Ả Ơ C M N
51

