MỤC LỤC
BUỔI 1: GIỚI THIỆU CHUNG................................................................................................................3
1.
Đối tượng áp dụng:....................................................................................................................3
2.
Mục đích:......................................................................................................................................3
3.
Thống nhất cách thức làm việc:..............................................................................................3
4.
Giới thiệu về phiên bản SQL Server:.....................................................................................3
5.
Lưu ý khi cài đặt SQL Server:..................................................................................................3
6.
Giới thiệu về giao diện:.............................................................................................................3
7.
Cách thức viết câu lệnh:...........................................................................................................4
8.
Thiết kế CSDL với cấu trúc.......................................................................................................5
BUỔI 2: CÁC HÀM TRONG SQL..........................................................................................................7
1.
Câu lệnh EXECUTE(‘Chuỗi’).....................................................................................................7
2.
Hàm Toán học:............................................................................................................................7
3.
Hàm chuỗi:...................................................................................................................................7
4.
Bài tập:..........................................................................................................................................8
BUỔI 3: HÀM NGÀY THÁNG...............................................................................................................10
1.
Hàm ngày tháng:.......................................................................................................................10
2.
Bài tập..........................................................................................................................................10
BUỔI 4: KẾT NỐI DỮ LIỆU..................................................................................................................12
1.
Câu lệnh truy vấn......................................................................................................................12
2.
Kết nối dữ liệu giữa các bảng...............................................................................................12
3.
Bài tập..........................................................................................................................................13
BUỔI 5: CÁC HÀM TẬP HỢP VÀ GROUP BY VÀ ORDER BY.....................................................14
1.
Hàm tập hợp:.............................................................................................................................14
2.
Thứ tự xử lý câu lệnh:.............................................................................................................14
3.
Bài tập..........................................................................................................................................15
BUỔI 6: LỆNH KẾT HỢP BẢNG VÀ BẢNG TẠM............................................................................16
1.
Lênh Union.................................................................................................................................16
2.
Bảng tạm:...................................................................................................................................16
3.
Bài tập..........................................................................................................................................16
BUỔI 7: CÁC HÀM CHUYỂN KIỂU VÀ KIỂM TRA..........................................................................18
1.
Hàm chuyển kiểu và kiểm tra.................................................................................................18
2.
Bài tập..........................................................................................................................................18
BUỔI 8: KIỂM TRA TỒN TẠI VÀ HÀM DELETE, TRUNCATE, PIVOT........................................19
1.
Kiểm tra tồn tại của bảng của field.......................................................................................19
2.
Sự khác nhau giữa DELETE và TRUNCATE:....................................................................19
3.
PIVOT...........................................................................................................................................19
4.
Bài tập..........................................................................................................................................20
BUỔI 9: HÀM RANKING.......................................................................................................................21
1.
Hàm RANKING:.........................................................................................................................21
2.
Lệnh vòng lặp............................................................................................................................21
3.
Bài tập..........................................................................................................................................21
BUỔI 1: GIỚI THIỆU CHUNG
1. Đối tượng áp dụng:
-
Những sinh viên năm cuối, sắp ra trường được tuyển chọn thực tập tại công ty.
-
Đã được đào tạo về Cơ Sở Dữ Liệu SQL Server.
2. Mục đích:
-
Giúp Sinh viên nắm vững hơn về kiến thức cơ bản.
-
Tiếp cận các bài toán và thuật toán thực tế.
3. Thống nhất cách thức làm việc:
-
Xin nghỉ phải xin phép (Điện thoại, Email)
-
Khi làm bài xong gửi đính kém theo file và đặt tên theo quy tắc: Họ và tên + Tên Trường ĐH.
-
Khi giao bài các bạn phải hoàn thành đúng theo thời gian được giao, tiếp cận kỹ năng đặt kế
hoach và hoàn thành kế hoạch.
-
Trong quá trính chữa bài: Các bạn SV phải show bài của mình trên máy chiếu và trình bày cách
thức giải quyết các bài toán được giao để học kỹ năng thuyết trình.
-
Đánh giá trong quá trình thực tập (thực hiện vào buổi cuối cùng).
-
Đặt ra quy định về thời gian học và thời gian Nộp bài. Nếu sai phạm có thể có hình thức phạt tùy
theo từng giáo viên và từng lớp.
4. Giới thiệu về phiên bản SQL Server:
-
Enterprise
-
Standard
-
Developer
-
Express
5. Lưu ý khi cài đặt SQL Server:
-
Tìm hiểu các yêu cầu của các phiên bản SQL dự định cài đặt
-
Đặt tên Named Instance:
-
Mục đích cài đặt: Nếu cài đặt với mơ hình lớn cần phải tìm hiểu thêm (AlwaysOn, Link server,
….).
6. Giới thiệu về giao diện:
-
Các Database Hệ thống:
Master: chứa thông tin về hệ thống SQL Server: Các tài khoản đăng nhập, cấu hình hệ
thống, thơng tin về các cơ sở dữ liệu đã tạo, các thủ tục hệ thống, các thủ tục do người dùng
định nghĩa…Ta phải quản trị Database này cẩn thận, khi sửa đổi hệ thống thì cần Backup
database Master.
Tempdb database chứa các đối tượng tạm thời như Global và Local Temporary Table.
Tempdb tự động khởi tạo lại khi SQL Server được khởi động lại.
Msdb: Chứa thông tin về những bản backup của Database, thông tin về SQL Agent, SQL
Server Jobs, các cảnh báo lỗi và một vài thông tin về replication như Log Shipping
Model database: đây là một Database template khi ta tạo các Database mới. Khi ta tạo mới
một cơ sở dữ liệu thì SQL Server lấy tất cả các mẫu (bao gồm Tables, Views,…) từ model
database.
-
Security: Thông tin về user đăng nhập SQL, Các Roles, Chứng chỉ.
-
Server Objects:
-
Replication: Tính năng nâng cao của SQL để đồng bộ dữ liệu (Tìm hiểu ngồi)
-
Always On High Avilability: Tính năng nâng cao của SQL hỗ trợ chạy SQL 24/7 giảm thiểu rủi
ro (Tìm hiểu ngoài)
-
Management
Ý nghĩa các Object trong 1 Database:
Tables
Views
Procedured
Functions
Trigger
...
7. Cách thức viết câu lệnh:
-
Nguyên tắc người viết code: “Tinh tế trong từng câu lệnh”, luôn luôn phải hiểu “Viết ra đoạn code
để cho người khác đọc và hiểu được” do đó:
-
Trình bày trong khn màn hình ngang máy tính
Sử dụng tab khi lùi dịng vào phía trong
Trình bày phải có dấu cách sau dấu “,”
Trình bày theo khối lệnh, gọn gàng, cách dịng trong khối lệnh cho dễ quan sát
Các từ khóa viết hoa: SELECT …FROM
Lưu ý đến Performance của đoạn lệnh:
Kiểm tra chỉ mục trên tất cả các field trên mệnh đề WHERE và JOIN trong câu lệnh SQL
Giới hạn kích thước của của bảng dữ liệu làm việc: Kiểm tra các bảng được sử dụng trong
câu SELECT để có thể áp dụng lọc qua WHERE
Chỉ chọn các field mà trong báo cáo cần tránh thừa thơng tin.
Giới hạn kích thước của của bảng dữ liệu làm việc: Kiểm tra các bảng được sử dụng trong
câu SELECT để có thể áp dụng lọc qua WHERE
-
Loại bỏ các phần tính tốn trong mệnh đề WHERE và JOIN
Đặt Index với các Field hay được truy vấn.
Đầu mã thủ tục, hàm phải có thơng tin chung:
Người tạo
Ngày khởi tạo
Mô tả chung
-
Mỗi lần đoạn mã được sửa đổi phải được ghi chú (Comment) rõ ràng:
Người sửa đổi
Ngày sửa đổi
Nội dung chỉnh sửa
-
Các đoạn lệnh có thuật tốn phức tạp cần có ghi chú rõ ràng:
-
Các câu ghi chú cần rõ ràng, ngắn gọn, đủ nghĩa, khơng dài dịng.
8. Thiết kế CSDL với cấu trúc
-
Lưu ý tên trường và tên bảng đặt đúng để dễ chấm bài
-
Tạo một database có tên: SvThucTap bằng cách viết lệnh SQL
-
Tạo các bảng sau bằng cách viết lệnh SQL.
Customer: Danh mục đối tượng
Id
Int
Khóa chính, tự tăng
Code
Varchar(24)
Duy nhất
Name
Nvarchar(128)
Type
Int
0: Khách lẻ; 1: Đối tượng; 2: Cơng ty
IsActive
Int
0: Đình chỉ; 1: Hoạt động
StartDate
Date
Cho phép NULL
EndDate
Date
Cho phép NULL
Warehouse: Danh mục kho
Id
Int
Khóa chính, tự tăng
Code
Varchar(24)
Duy nhất
Name
Nvarchar(128)
IsActive
Int
Item: Danh mục vật tư
0: Đình chỉ; 1: Hoạt động
Id
Int
Khóa chính, tự tăng
Code
Varchar(24)
Duy nhất
Name
Nvarchar(128)
Unit
Nvarchar(24)
Type
Int
0:dịch vụ; 1: vật tư; 2:sản phẩm
IsActive
Int
0: Đình chỉ; 1: Hoạt động
OpenWarehouse: Tồn kho đầu kỳ
Id
Int
WarehouseCode
Varchar(24)
ItemCode
Varchar(24)
Quantity
Numeric(18, 5)
Amount
Numeric(18, 2)
IsActive
Int
Khóa chính, tự tăng
0: Đình chỉ; 1: Hoạt động
Doc: Chứng từ / đầu phiếu
Id
Int
Khóa chính, tự tăng
DocId
Varchar(16)
Duy nhất, dùng để liên kết với bàng DocDetail
DocDate
Date
DocNo
Nvarchar(24)
Type
Int
1: Nhập; 2: Xuất
CustomerCode
Varchar(24)
WarehouseCode
Varchar(24)
Description
Nvarchar(128)
IsActive
Int
0: Đình chỉ; 1: Hoạt động
DocDetail: Chứng từ / chi tiết phiếu
-
Id
Int
Khóa chính, tự tăng
DocId
Varchar(16)
Dùng để liên kết với bàng Doc
RowId
Varchar(16)
Duy nhất
ItemCode
Varchar(24)
Quantity
Numeric(18, 5)
UnitCost
Numeric(18, 5)
Amount
Numeric(18, 2)
IsActive
Int
0: Đình chỉ; 1: Hoạt động
Bài làm lưu theo cấu trúc như sau: [MaLop]_[BuoiXX]_[HoTen]
VD: 1912HVNH_Buoi01_BinhLT, 1912HVNH_Buoi03_DuyenPTT
Trường hợp 1 buổi dạy nhiều ngày, thêm đuôi A, B vào sau buổi như sau
1912HVNH_Buoi03A_DuyenPTT, 1912HVNH_Buoi03B_DuyenPTT
BUỔI 2: CÁC HÀM TRONG SQL
1. Câu lệnh EXECUTE(‘Chuỗi’)
-
Cấu trúc: EXEC(‘SELECT * FROM DMVT’)
-
Nguyên tắc biến câu lệnh Query SQL thành chuỗi trong câu lệnh Execute():
Thêm 2 dấu nháy đơn vào đằng trước và đằng sau câu lệnh.
Với mỗi dấu nháy đơn ở câu lệnh Query SQL thông thường khi vào chuỗi để sử dụng trong
Câu lệnh EXECUTE thì sẽ thêm 1 dấu nháy nữa Ví dụ: SELECT * FROM DMVT WHERE
Ma_Vt = ‘A01’ EXEC(‘SELECT * FROM DMVT WHERE Ma_Vt = ‘’A01’’’)
Trường hợp muốn cộng ký tự đặc biệt vào chuỗi thì dung hàm CHAR(Mã KeyAscii). Ví dụ
CHAR(13) Ký tự Enter, CHAR(39) ký tự nháy đơn.
/>
-
Tìm hiểu thêm EXECUTE sp_executesql
Buoi01_Execute.sql
2. Hàm Toán học:
Hàm
Diễn Giải
POWER(X,Y)
Giá trị của X lũy thừa Y
ROUND(X,n)
Số X làm trịn, n chữ số tính từ dấu thập phân
SQUARE(X)
Bình phương giá trị X
SQRT(X)
Căn bậc 2 giá trị X
ABS (X)
Lấy giá trị tuyệt đối X
FLOOR (X)
Làm tròn xuống phần nguyên giá trị X
CEILING (X)
Làm tròn lên phần nguyên giá trị X
A%B
Lấy số dư phép chia A/B
SIGN(X)
1- Số dương, 0- Số 0; -1 Số âm
RAND()
Trả về số ngẫu nhiên
3. Hàm chuỗi:
Hàm
Diễn Giải
"Chuỗi 1" + "Chuỗi 2"
Nối chuỗi bằng tốn tử cộng
SPACE(n)
Trả về chuỗi có n khoảng trắng
LOWER(Chuỗi kỹ tự)
Chuyển chuỗi thành chữ thường
UPPER(Chuỗi ký tự)
Chuyển thành chữ hoa
LTRIM(Chuỗi ký tự)
Trả về dữ liệu không có khoảng trắng bên trái
RTRIM(Chuỗi ký tự)
Trả về dữ liệu khơng có khoảng trắng bên phải
LEFT(Chuỗi ký tự, n)
Trả về một chuỗi n ký tự tính từ bên trái
RIGHT(Chuỗi ký tự, n)
Trả về một chuỗi n ký tự tính từ bên phải
SUBSTRING(Chuỗi ký tự, n1,
n2)
Trả về một chuỗi bắt đầu từ vị trí n1 lấy n2 ký tự
REPLACE(Chuỗi 1, Chuỗi 2,
Chuỗi 3)
Thay thế chuỗi 2 bằng chuỗi 3 ở chuỗi 1
CHARINDEX (Chuỗi 1, Chuỗi 2
[,Từ vị trí]
Trả về vị trí tìm thấy Chuỗi 1 trong Chuỗi 2 [Tính từ vị trí]
STUFF(Chuỗi 1, vị trí, chiều
Chèn Chuỗi 2 vào Chuỗi 1 từ "vị trí" và xóa bỏ số ký tự bằng
dài, Chuỗi 2)
"chiều dài" Chuỗi 1
Trả về giá trị độ dài chuỗi 1, khơng bao gồm dấu cách phía bên
LEN("Chuỗi 1")
phải
BUỔI 3: HÀM NGÀY THÁNG
1. Hàm ngày tháng:
Hàm
Diễn Giải
GETDATE()
Trả về ngày giờ hiện hành
CURRENT_TIMESTAMP
Trả về ngày giờ hiện hành
DATEADD(Datepart, n, Ngày)
Thêm n (tăng/giảm) Datepart vào Ngày
DATEDIFF(DatePart, Ngày 1, Ngày
2)
Trả về số DatePart giữa Ngày 1 và Ngày 2
DATEPART(DatePart, Ngày)
Trả về giá trị DatePart của Ngày
DATENAME(DatePart, Ngày)
Trả về giá trị DatePart của Ngày nhưng là kiểu chuỗi
DAY(Ngày 1)
Trả về giá trị ngày của Ngày 1
MONTH(Ngày 1)
Trả về giá trị tháng của Ngày 1
YEAR(Ngày 1)
Trả về giá trị năm của Ngày 1
Trong đó, giá trị của DatePart được liệt kê như sau:
DatePar
t
Giá trị
Diễn Giải
DD
1-31
Ngày trong tháng
MM
1-12
Tháng trong năm
QQ
1-4
Quý trong năm
DW
1-7(Sun-Sat)
Thứ trong tuần
YY
1753 - 9999
Năm
BUỔI 4: KẾT NỐI DỮ LIỆU
1. Câu lệnh truy vấn
SELECT: Những trường khơng nào có hàm đi kèm thì phải có ở dưới mệnh đề GROUP BY.
FROM: Lấy dữ liệu từ bảng nào
WHERE: Mệnh đề đề điều kiện để lọc dữ liệu
GROUP BY: Sau khi xử lý WHERE. (Sẽ có buổi chi tiết về phần này)
HAVING: Điều kiện sau khi đã GROUP BY (Sẽ có buổi chi tiết về phần này)
ORDER BY: Sắp xếp kết quả sau khi đã xử lý các mệnh đề trên. (Sẽ có buổi chi tiết về phần này)
Biểu thức điều kiện đi kèm WHERE
Hàm
Kết quả
BETWEEN Giá trị 1 AND Giá trị 2
AND, OR
Kết hợp điều kiện hoặc là loại trừ điều kiện.
% Đại diện cho nhiều ký tự đằng trước hoặc sau. Ký tự ‘_’ đại
LIKE kết hợp với ‘%’ hoặc ‘ _’
diện 1 ký tự
IS NULL
Không dung giá trị kiểm tra = NULL mà phải dùng IS NULL
Không dung giá trị kiểm tra <> NULL mà phải dùng IS NOT
IS NOT NULL
NULL
2. Kết nối dữ liệu giữa các bảng
Nôi dung
Ghi chú
INNER JOIN: Lấy thông tin chung nhau giữa bảng A và bảng B
LEFT JOIN: Lấy tồn bộ thơng tin bên trái và dữ liệu bên phải có trong bên trái
RIGHT JOIN: Lấy tồn bộ thơng tin bên phải và dữ liệu bên trái có trong bên
phải
FULL JOIN: Lấy tồn bộ thơng tin 2 bên (đầy đủ các trường của 2 bảng)
Kết nối kiểu FROM Table1, Table2: Giống như INNER JOIN
CROSS APPLY và OUTER APPLY: Giống INNER JOIN và LEFT nhưng có thể
Cẩn thận, ít dùng
liên kết với 1 hàm
CASE WHEN … THEN … .ELSE … END
CASE … WHEN … THEN .. ELSE .. END
Ví dụ minh họa
Buoi04_JOIN.sql
BUỔI 5: CÁC HÀM TẬP HỢP VÀ GROUP BY VÀ ORDER BY
1. Hàm tập hợp:
Hàm
Kết quả
COUNT(*)
Trả về số dòng được chọn
MAX(Tên cột)
Trả về giá trị lớn nhất trong Cột
MIN(Tên cột)
Trả về giá trị nhỏ nhất trong Cột
AVG(Tên cột)
Trả về trung bình cộng của các giá trị trong Cột
SUM(Tên cột)
Trả về tổng của các giá trị trong cột
SELECT DISTINCT
Trả về tập hợp giá trị là duy nhất
2. Thứ tự xử lý câu lệnh:
SELECT: Những trường khơng nào có hàm đi kèm thì phải có ở dưới mệnh đề GROUP BY.
FROM: Lấy dữ liệu từ bảng nào
WHERE: Mệnh đề đề điều kiện để lọc dữ liệu
GROUP BY: Sau khi xử lý WHERE.
HAVING: Điều kiện sau khi đã GROUP BY
ORDER BY: Sắp xếp kết quả sau khi đã xử lý các mệnh đề trên.
Mệnh đề:
ROLLUP (dùng với mệnh đề GROUP BY): Chèn dòng tổng cho từng dòng chi tiết của
trường đầu tiên và dòng tổng cộng
SELECT Ma1, Ma2, SUM(SL)
FROM Table
WHERE Ma1 LIKE 'A%'
GROUP BY Ma1, Ma2
WITH ROLLUP
Mệnh đề: CUBE (dùng với mệnh để GROUP BY): Kết quả trả về giống ROLLUP nhưng thêm tồn
bộ dịng tổng cộng của từng trường.
Mệnh đề sắp xếp: ORDER BY (ASC: Tăng dần (mặc định), DESC: Giảm dần)
Mệnh đề: SELECT TOP n, SELECT TOP WITH TIES.
BUỔI 6: LỆNH KẾT HỢP BẢNG VÀ BẢNG TẠM
1. Lênh Union
Nội dung
Ghi chú
UNION: Tập hợp loại trừ dữ liệu giữa các bảng giống nhau
Câu lệnh chậm
UNION ALL: Lấy toàn bộ dữ liệu các bảng (Sẽ lấy độ rộng lớn nhất của trường
trong bảng kết nối)
2. Bảng tạm:
-
Là bảng có tên có ký tự # ở đầu ví dụ: #BangKeChungTu, #SochitietTK…
-
Bảng tạm có 2 loại: Bảng tạm 1 # và bảng tạm 2 # (##).
Bảng tạm có 1 ký tự # ở đầu là bảng được tạo ra khi chạy câu lệnh CREATE TABLE và mất
đi khi SESSION mất đi.
Bảng tạm có 2 ký tự # là bảng tạm tạo ra khi chạy câu lệnh CREATE TABLE và mất đi khi bị
DROP TABLE
Cách viết câu lệnh của bảng tạm cũng giống như với bảng thường tuy nhiên trước khi tạo
bảng cần viết câu lệnh kiểm tra tồn tại của bảng để nếu có thì xóa đi:
IF OBJECT_ID(‘tempdb..#TenBangTam’) IS NOT NULL DROP TABLE #TenBangTam.
-
Ứng dụng của bảng tạm dùng rất nhiều trong thực tế giúp việc xử lý trung gian dữ liệu được
thuận lợi hơn.
-
Câu lệnh: INSERT INTO Tên bảng (Ds trường) SELECT và INSERT INTO Tên bảng (Ds trường)
…. VALUES(….)
Buoi06_Union.sql
Buoi06_BangTam.sq
l
BUỔI 7: CÁC HÀM CHUYỂN KIỂU VÀ KIỂM TRA
1. Hàm chuyển kiểu và kiểm tra
Hàm
Kết quả
CAST (<Biểu thức> AS
<Kiểu dữ liệu>)
Chuyển đổi dữ liệu. Ứng dụng các hàm này để chuyển đổi kiểu hoặc
tạo ra 1 cột trong câu lệnh SELECT CAST (‘’ AS NVARHAR(16)) AS
TenCot
Chuyển đổi dữ liệu theo định dạng (hay sử dụng cho dữ liệu kiểu
CONVERT(
dữ
ngày)
VD:
Chuyển
kiểu
ngày
sang
chuỗi:
liệu>, <Biểu thức> [,
CONVERT(VARCHAR(10),GETDATE(),110)
<Định dạng>])
Ứng dụng các hàm này để chuyển đổi kiểu hoặc tạo ra 1 cột trong câu
lệnh SELECT CAST (‘’ AS NVARHAR(16)) AS TenCot
STR(<Số>,
> [,<Số lẻ>]):
Chuyển dữ liệu số sang kiểu chuỗi
Định dạng giá trị số hoặc ngày giờ.
SELECT FORMAT(123456789, '##-##-#####');
DECLARE @d
FORMAT(value, format, SELECT FORMAT
English
culture)
DATETIME
= '12/01/2018';
(@d, 'd', 'en-US') AS 'US
Result',
FORMAT
(@d, 'd', 'no') AS 'Norwegian
Result',
FORMAT
(@d, 'd', 'zu') AS 'Zulu Result';
DATEFROMPARTS( ye
Thông qua giá trị năm, tháng, ngày, trả về kiểu ngày.
ar, month, day )
SELECT DATEFROMPARTS(2020, 5, 6)
ISNULL()
Kiểm tra giá trị là null hay khơng thì trả về giá trị mặc định
BUỔI 8: KIỂM TRA TỒN TẠI VÀ HÀM DELETE, TRUNCATE, PIVOT.
1. Kiểm tra tồn tại của bảng của field
IF EXISTS(SELECT...)
-
IF EXISTS(SELECT * FROM Table WHERE…): Nên sử dụng.
-
IF EXISTS(SELECT TOP 1 FROM Table WHERE….): Không hiệu quả.
-
IF EXISTS(SELECT Count(*) FROM Table WHERE…) > 0: Không hiệu quả.
2. Sự khác nhau giữa DELETE và TRUNCATE:
-
DELETE: Bản chất bản ghi chưa bị xóa khỏi CSDL (nó sẽ bị đè nếu bộ nhớ hết). Ta có thể kiểm
tra sau khi DELETE bộ nhớ khơng thay đổi. Vì lý do này nên chương trình sẽ Index, ràng buộc lại
(nếu có)
-
Sử dụng DELETE có thể sử dụng WHERE để xóa một phần dữ liệu -> Chậm
Nếu bảng có chứa kiểu dữ liệu IDENTITY thì khi thêm bản ghi mới dữ liệu vẫn được+1
TRUNCATE: Bản chất xóa dữ liệu hồn tồn khỏi CSDL mà không quan tâm ràng buộc, Index…
-> Tốc độ sẽ nhanh hơn
Sử dụng TRUNCATE: Xóa tồn bộ bảng (khơng sử dụng mệnh đề WHERE)
Nếu bảng có chứa kiểu dữ liệu IDENTITY thì khi thêm bản ghi mới dữ liệu sẽ đánh lại từ số:
1.
3. PIVOT, UNPIVOT
PIVOT cho phép phân tích bảng chéo (cross tabulation) chuyển dữ liệu từ bảng này sang bảng khác, tức
là lấy kết quả tổng hợp rồi chuyển từ dòng thành cột.
SELECT cot_dautien AS <bidanh_cot_dautien>,
[giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n]
FROM
(<bang_nguon>) AS <bidanh_bang_nguon>
PIVOT
(
ham_tong (<cot_tong>)
FOR <cot_chuyen>
IN ([giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n])
) AS <bidanh_bang_chuyen>;
UNPIVOT: Ngược lại so với PIVOT, tự tìm hiểu.
IF OBJECT_ID('Tempdb..#Tmp') IS
SELECT 1 AS ProductId, 'CUS001'
INTO #Tmp
UNION ALL
SELECT 2 AS ProductId, 'CUS004'
UNION ALL
SELECT 3 AS ProductId, 'CUS003'
UNION ALL
SELECT 4 AS ProductId, 'CUS001'
UNION ALL
SELECT 5 AS ProductId, 'CUS002'
UNION ALL
SELECT 4 AS ProductId, 'CUS003'
UNION ALL
NOT NULL DROP TABLE #Tmp
AS CustomerCode, 2 AS Quantity, 100000 AS Amount
AS CustomerCode, 1 AS Quantity, 200000 AS Amount
AS CustomerCode, 5 AS Quantity, 1000000 AS Amount
AS CustomerCode, 6 AS Quantity, 500000 AS Amount
AS CustomerCode, 2 AS Quantity, 100000 AS Amount
AS CustomerCode, 2 AS Quantity, 300000 AS Amount
SELECT 1 AS ProductId, 'CUS003' AS CustomerCode, 3 AS Quantity, 400000 AS Amount
SELECT * FROM #Tmp ORDER BY ProductId, CustomerCode
SELECT ProductId, pvt.CUS001 AS Col1, pvt.CUS002 AS Col2, pvt.CUS003 AS Col3,
pvt.CUS004 AS Col4
FROM
(SELECT ProductId, CustomerCode, Amount
FROM #Tmp) AS t1
PIVOT
(
SUM (AMOUNT) FOR CustomerCode IN (CUS001, CUS002, CUS003, CUS004)
) AS pvt
ORDER BY ProductId
DROP TABLE #Tmp
BUỔI 9: HÀM RANKING
1. Hàm RANKING:
-
ROW_NUMBER ( ) OVER ( [ <Mệnh đề PARTITION BY> ] <Mệnh đề ORDER BY>): Thường
sử dụng đánh số sắp xếp theo điều kiện (có thể có phân nhóm đánh số lại từ 1)
ORDER BY: sắp xếp theo tuần tự
PARTITION BY: nhóm theo điều kiện
VD: Muốn đánh số tự động 1 Table theo nhóm bộ phận có số lượng giảm dần
Row_Number() OVER(PARTITION BY Ma_Bp ORDER BY So_Luong DESC) As Sap_Xep
-
RANK ( ) OVER ( [<Mệnh đề PARTITION BY>] <Mệnh đề ORDER BY>): Thường sử dụng
đánh số giống nhau nếu giá trị giống nhau và giá trị khác nhau sẽ tuần tự theo tổng số bản
ghi. VD: Có 5 bản ghi; giá trị vị trí thứ 2 và 3 giống nhau thì cách đánh số có kiểu (1 -> 2 -> 2
->4 ->5)
-
ORDER BY: sắp xếp theo tuần tự
PARTITION BY: nhóm theo điều kiện
DENSE_RANK() OVER ( [<Mệnh đề PARTITION BY>] <Mệnh đề ORDER BY>): Thường sử
dụng đánh số giống nhau nếu giá trị giống nhau và giá trị khác nhau sẽ tuần tự theo đánh số.
VD: Có 5 bản ghi; giá trị vị trí thứ 2 và 3 giống nhau thì cách đánh số có kiểu (1 -> 2 -> 2 ->3
->4)
-
ORDER BY: sắp xếp theo tuần tự
PARTITION BY: nhóm theo điều kiện
NTILE(n) OVER ( [<Mệnh đề PARTITION BY>] <Mệnh đề ORDER BY>): chia thành n nhóm
được đánh dấu từ 1-> n. Có thể áp dụng cho việc lấy các bản ghi có giá trị khoảng trung bình
VD: SELECT Ma_Dt FROM (SELECT Ma_Dt, So_Luong, NTILE(3) OVER (ORDER BY
So_luong) AS SL_TB FROM...) WHERE SL_TB = 2
ORDER BY: sắp xếp theo tuần tự
PARTITION BY: nhóm theo điều kiện
SELECT *
,ROW_NUMBER() OVER(ORDER BY NgayCt) AS ROW_NUMBER
,ROW_NUMBER() OVER(PARTITION BY MaDt ORDER BY NgayCt) AS
ROW_NUMBER_Partition
,RANK() OVER(ORDER BY MaDt) RANK
,DENSE_RANK() OVER(ORDER BY MaDt) AS DENSE_RANK
,NTILE(4) OVER(ORDER BY MaDt) AS NTILE
FROM Ct
2. Lệnh vòng lặp
-
WHILE <điều kiện> BEGIN <biểu thức> END: Kiểm tra vòng lặp thỏa mãn điều kiện sẽ
thực hiện. Nên dùng.
-
CURSOR: Kiểm tra từng bản ghi kiêu con trỏ. Dùng cẩn thận vì tốn bộ nhớ.
-
GOTO: Di chuyển con trỏ. Hạn chế dùng vì thay đổi trình tự từ trên xuống dưới.
LOOP.sql