ƯƠ

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 T­SQL:

ữ ệ

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 T­SQL: 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:

IS [NOT] NULL

• Thuộc miền giá trị:

[NOT] BETWEEN AND

• Thuộc tập giá trị:

[NOT] IN (, , …)

• Kiểm tra chuỗi thuộc mẫu dữ liệu:

[NOT] LIKE “

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

.* : chọn hết các cột thuộc

• Cột : [ [AS] ] hay =

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 INTO

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 { [ASC | DESC] [ , ...n] }

• 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 ( ) [PERCENT] WITH TIES

Để 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] ): Tính tổng giá trị biểu thức số trên các dòng

• AVG([DISTINCT] ): Tính trung bình cộng trên các dòng

• MAX(): Chọn ra giá trị lớn nhất trên các dòng thuộc nhóm

• MIN(): Chọn ra giá trị thấp nhất trên các dòng thuộc nhóm

• COUNT([DISTINCT] ): Đếm số dòng trong từng nhóm mà có giá trị khác

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( ) [ ,...n ]

• 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 trong mệnh đề COMPUTE phải xuất hiện trong mệnh đề

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 [ ASC | DESC ] [ ,...n ]

COMPUTE ( ) [ ,...n ]

BY [ ,...n ]

• 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 gom nhóm trong mệnh đề

BY.

• Các trong BY là tập con của các trong ORDER BY,

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 () AS … 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?

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( [ ] ) AS column_label

::= PARTITION BY [, .. n]

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 .

: Xác định thứ tự các dòng trong từng nhóm

để 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