Tải bản đầy đủ (.docx) (18 trang)

Giáo trình đào tạo SQL Server cơ bản (Các câu lệnh SELECT, JOIN, các hàm, UNION, PIVOT TABLE)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (189.19 KB, 18 trang )

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



×