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ách bên trái
• RTRIM(str) : Trả về chuỗi không có dấu cách 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.
• SUBSTRING(str, start, n): Trả về chuỗi con n ký tự của 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
17 trang |
Chia sẻ: vietpd | Lượt xem: 1799 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Bài giảng Truy vấn dữ liệu, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1Chương 4:
TRUY VẤN DỮ LIỆU
Giáo viên: Tạ Thúc Nhu
Khoa CNTT trường ĐH Lạc Hồng
HỆ QUẢN TRỊ CSDL
SQL SERVER
Mã hóa2
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
Mã hóa3
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: x0)
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
Mã hóa4
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ách bên trái
• RTRIM(str) : Trả về chuỗi không có dấu cách 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.
• SUBSTRING(str, start, n): Trả về chuỗi con n ký tự của
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
2Mã hóa5
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
Mã hóa6
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ỉ đinh trong date, kiểu số.
7. DATENAME(Mã_TP, date) : Trả về thành
phần chỉ đinh 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
MSMillisecond
SSecond
MIMinute
HHHour
WWeekday
WWWeekOfYear
DDayOfMonth
YDayOfYear
MMonth
QQuarter
YYYear
Mã_TPThành phần
Mã hóa7
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
Mã hóa8
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
3Mã hóa9
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
• 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ả: 12345.68
Print Convert(VarChar, @a, 1)
• Kết quả: 12,345.68
Print Convert(VarChar, @a, 2)
• Kết quả: 12345.6890
Mã hóa10
Style cho kiểu Datetime và SmallDatetime
mm-dd-yyyy11010
mon dd yyyy hh:mi:ss:mmmAM (or PM)1099
hh:mm:ss1088
mon dd, yyyy1077
dd mon yyyy1066
dd-mm-yyyy1055
dd.mm.yyyy1044
dd/mm/yyyy1033
yyyy.mm.dd1022
mm/dd/yyyy1011
mon dd yyyy hh:mi AM (or PM)1000
Dạng hiển thịNăm 4 chữ sốNăm 2 chữ số
Mã hóa11
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 T-
SQL cuối cùng. Trả về số 0 nếu không có lỗi.
Mã hóa12
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ả.
Ví dụ: Trả về thứ trong tuần
Select (Case Datepart( W, GetDate())
When 1 Then 'Chu Nhat'
When 2 Then 'Thu Hai‘
When 3 Then 'Thu Ba‘
When 4 Then 'Thu Tu‘
When 5 Then 'Thu Nam‘
When 6 Then 'Thu Sau‘
Else 'Thu Bay'
End) AS Thu
CASE biểu_thức
WHEN giá_trị_1 THEN kết_quả_1
WHEN giá_trị_2 THEN kết_quả_2
[ ...n ]
[ELSE kết_quả_khác ]
END
4Mã hóa13
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ả.
Ví dụ: Trả về số ngày trong tháng
Select (Case
When Month(GetDate())
In (1,3,5,7,8,10,12) Then 31
When Month(GetDate())
In (4,6,9,11) Then 30
When Year(GetDate()) % 4 = 0
Then 29
Else 28
End) AS SoNgay
CASE
WHEN btlogic_1 THEN kq1
WHEN btlogic_2 THEN kq2
[ ...n ]
[ELSE ]
END
Mã hóa14
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:
FromWhereGroup ByHavingSelectOrderCompute
Mã hóa15
CBA
FED
A B C FED
FROM
A B C FED
WHERE
A C FE
SELECT
Mã hóa16
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
FROM B1 LEFT JOIN B2 ON
FROM B1 RIGHT JOIN B2 ON
FROM B1 FULL JOIN B2 ON
5Mã hóa17
PHÉP TÍCH CARTESIAN:
X
=>
Mã hóa18
PHÉP KẾT INNER JOIN
MaNVQL=MaNV
Mã hóa19
PHÉP KẾT TRÁI (LEFT JOIN)
MaNVQL=MaNV
Mã hóa20
PHÉP KẾT PHẢI (RIGHT JOIN)
MaNVQL=MaNV
6Mã hóa21
PHÉP KẾT ĐẦY ĐỦ (FULL JOIN)
MaNVQL=MaNV
Mã hóa22
Ví dụ:
FROM KHUVUC As b1 INNER JOIN NHANVIEN As b2
ON b1.MANVQL = b2.MANV
Mã hóa23
2- Mệnh đề WHERE:
WHERE
• Dùng thực hiện phép chọn trên bảng kết xuất từ mệnh đề
FROM.
• được thiết lập bởi các phép toán so
sánh, phép toán luận lý trên các dữ liệu lưu trữ trên các cột
Mã hóa24
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 ““
Ký tự đơn bất kỳ không nằm trong tập chỉ định ([^a-f] hay [^abcdef] ).[^…]
Ký tự đơn bất kỳ trong tập được chỉ định (ví dụ [a-f]) hay [abcdef])[…]
Ký tự đơn bất kỳ-
Chuỗi ký tự bất kỳ gồm không hoặc nhiều ký tự%
ý nghĩa đại diệnKý tự
7Mã hóa25
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 =
Mã hóa26
Mã hóa27
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 () : 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 ?
• TOP () PERCENT : chỉ hiện n% dòng đầu tiên.
Câu hỏi: Danh sách 10% mặt hàng đầu tiên trong table MatHang ?
Mã hóa28
Tạo Table chứa dữ liệu truy vấn
SELECT INTO
Yêu cầu: Tạo bảng ‘HoaDonLuu’ chứa danh sách các hóa đơn
của năm cũ.
8Mã hóa29
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
Mã hóa30
5- Mệnh đề GROUP BY:
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.
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
Mã hóa31
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?
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 ?
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 ?
Mã hóa32
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
9Mã hóa33
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
Mã hóa34
GROUP BY WITH CUBE
• Tổng hợp trên tất cả mẫu tin, đồng thời tổng hợp chéo theo từng nhóm
con
Câu hỏi: Cho biết số mặt hàng cung ứng của từng nhà cung cấp; số mặt hàng
của từng loại hàng; số mặt hàng cung ứng của từng nhà cung cấp trên từng
loại hàng; số mặt hàng hiện có trong bảng MatHang
Mã hóa35
GROUP BY WITH ROLLUP
• Tổng hợp trên tất cả mẫu tin
• Đồng thời tổng hợp theo từng nhóm con của ,
mỗi nhóm con được bắt đầu từ khóa đầu tiên, không bỏ qua cột nào
Câu hỏi: Cho biết số mặt hàng cung ứng của từng nhà cung cấp; số mặt hàng
cung ứng của từng nhà cung cấp trên từng loại hàng; số mặt hàng hiện có
trong bảng MatHang
Mã hóa36
6- Mệnh đề HAVING
HAVING
• Dùng chọn các nhóm thỏa mãn
Câu hỏi: Cho biết các hóa đơn có tiền hóa đơn > 20000
10
Mã hóa37
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.
Mã hóa38
Ví dụ: Liệt kê danh sách nhân viên, đồng thời thêm bảng
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)
Mã hóa39
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.
Mã hóa40
Ví dụ: Cho biết Mã khu vực, họ tên, lương cơ bản của nhân
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ì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
11
Mã hóa41
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.
Mã hóa42
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?
Mã hóa43
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
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
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
Mã hóa44
12
Mã hóa45
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
Mã hóa46
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
Mã hóa47
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.
Mã hóa48
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
13
Mã hóa49
Ví dụ: không dùng
Ví dụ: Xếp thứ tự mặt hàng theo đơn giá và thêm cột STT cho
từng mặt hàng.
Mã hóa50
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
Mã hóa51
Câu hỏi: Xếp hạng doanh thu của từng mặt hàng như sau
Mã hóa52
Cách 1: Dùng Subquery
SELECT RANK() OVER(ORDER BY DoanhThu DESC) AS Hang,
MatHang.MaMH, TenMH, DoanhThu
FROM MatHang INNER JOIN
(SELECT MaMH, DoanhThu = SUM(SL*DGBan)
FROM CTHD GROUP BY MaMH) AS TONGHOP
ON MatHang.MaMH = TONGHOP.MaMH
14
Mã hóa53
Cách 2: Khai báo biểu thức bảng
WITH TongHop
AS ( SELECT MaMH, DoanhThu = SUM(SL*DGBan)
FROM CTHD GROUP BY MaMH
)
/* Truy vấn biểu thức bảng */
SELECT RANK() OVER(ORDER BY DoanhThu DESC) AS
Hang, TongHop.MaMH, TenMH, DoanhThu
FROM MatHang INNER JOIN TongHop
ON MatHang.MaMH = TongHop.MaMH
Mã hóa54
Câu hỏi: Hãy chọn ra các mặt hàng được xếp hạng doanh thu
từ 4 đến 6
Mã hóa55
3- Hàm DENSE_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 giá trị
xếp hạng của dòng trước cộng thêm 1.
Ví dụ: Xếp hạng các mặt hàng theo đơn
giá trong từng loại hàng
Mã hóa56
4- Hàm NTILE(n)
• Chia đều các mẫu tin trong mỗi nhóm thành N nhóm con.
• Gán số thứ tự nhóm con cho các mẫu tin trong cùng nhóm con đó, bắt đầu từ
1
Ví dụ: Phân các mặt hàng trong từng
loại hàng làm 2 nhóm và đánh số thự tự
mỗi nhóm
15
Mã hóa57
IV- TOÁN TỬ PIVOT
• Dùng tạo một bảng tham chiếu giá trị theo 2 chiều dòng và
cột từ một bảng nguồn khác.
• Cấu trúc bảng nguồn phải có 3 cột: Cột chứa tiêu đề dòng
(Row_header), cột chứa tiêu đề cột (pivot_column) và cột
chứa giá trị tham chiếu (value_column).
Mã hóa58
Cú pháp:
table_source PIVOT( aggregate_function ( value_column )
FOR pivot_column IN ( )
) table_alias
Ví dụ: Tạo bảng Crosstab với tiêu đề dòng là MaLH, tiêu đề cột
là Năm và giá trị tham chiếu là DT của loại hàng trong năm
từ bảng DTLHNAM.
Mã hóa59
Ví dụ:
• MatHang(MaMH, TenMH, DVT, MaLH)
• HoaDon(SoHD, NgayHD, MaKH, MaNV)
• CTHD(SoHD, MaMH, SL, DGBan)
Hãy tạo bảng Crosstab với tiêu đề dòng là MaLH, tiêu đề cột là
các năm 2005, 2006, 2007 và giá trị tham chiếu là tiền bán
của từng loại hàng trong các năm đó.
Mã hóa60
V- TOÁN TỬ UNPIVOT
• Dùng tạo một bảng tham chiếu một chiều từ bảng tham
chiếu 2 chiều dòng và cột
• Cú pháp:
table_source UNPIVOT ( value_column
FOR pivot_column IN ( )
) table_alias
16
Mã hóa61
Ví dụ:
• Giả sử đã có bảng pvDTLHNAM(MaLH, [2005], [2006]) tham
chiếu 2 chiều doanh thu từng năm của từng loại hàng. Ta
tạo bảng tham chiếu 1 chiều như sau
SELECT MALH, NAM, DT
FROM PVDTLHNAM UNPIVOT( DT
FOR NAM IN ([2005],[2006]) ) AS PV
Mã hóa62
VI- PHÉP TOÁN TẬP HỢP:
Gồm các phép toán:
• Hợp (Union)
• Giao (Intersect)
• Hiệu (Except)
trên 2 bảng dữ liệu có cùng cấu trúc
Mã hóa63
Cú pháp:
SELECT
FROM
[WHERE ]
[GROUP BY ]
[HAVING ]
{ UNION | INTERSECT | EXCEPT } [ ALL ]
SELECT
FROM
[WHERE ]
[GROUP BY ]
[HAVING ]
[ ORDER BY [ ASC | DESC ] ]
Mã hóa64
Chú ý:
• Các mệnh đề Select phải có cùng số cột, các cột tương ứng
phải cùng kiểu dữ liệu, không cần cùng tên.
• Bảng kết quả có tên cột được tạo từ Select đầu tiên.
• Mệnh đề ORDER BY là của phép toán tập hợp
• Từ khóa ALL : dùng chỉ định hiển thị cả những dòng trùng
dữ liệu. Nếu không có từ khóa ALL thì chỉ hiện các dòng
phân biệt.
17
Mã hóa65
Ví dụ phép Hợp
KHACHHANG
zC3
yB2
xA1
DCKHTenKHMaKH
NHACUNGCAP
uD2
xA1
DCKHTenKHMaKH
KETQUA
C3
D2
B2
A1
TenDoiTacID
A1
C3
KETQUA
D2
B2
A1
TenDoiTacID
Select ID = MaKH, TenDoiTac = TenKH
From KhachHang
Union
Select MaNCC, TenNCC
From NhaCungCap
Order By ID
Mã hóa66
Ví dụ phép Giao
KHACHHANG
zC3
yB2
xA1
DCKHTenKHMaKH
NHACUNGCAP
uD2
xA1
DCKHTenKHMaKH
KETQUA
A1
TenDoiTacID
Select ID = MaKH, TenDoiTac = TenKH
From KhachHang
Intersect
Select MaNCC, TenNCC
From NhaCungCap
Order By ID
Mã hóa67
Ví dụ phép Hiệu
KHACHHANG
zC3
yB2
xA1
DCKHTenKHMaKH
NHACUNGCAP
uD2
xA1
DCKHTenKHMaKH
C3
KETQUA
B2
TenDoiTacID
Select ID = MaKH, TenDoiTac = TenKH
From KhachHang
Except
Select MaNCC, TenNCC
From NhaCungCap
Order By ID
Mã hóa68
CSDL Thể Thao Đội
CLB
MsCLB
DcCLB
Doi
MsCLB
MsDoi
MsLT
Phai
DoiTD
MsTD
MsDoi
MsCLB
KQTD
Phong
MsPh
DcPh
SoSan
TD
MsTD
MsPh
NgayGioTD
VDVDOI
MsVDV
MsDoi
VDV
MsVDV
TenVDV
DcVDV
MsCLB
Phai
MsLT
LuaTuoi
MsLT
TGTDLT