Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 44

Đỗ Văn Thành – Thanh.dovan9998@gmai.

com

Nội dung
Phần 1: SQL cơ bản......................................................................................................................................5
1. Giới thiệu, Khái niệm...........................................................................................................................5
1.1. SQL...............................................................................................................................................5
1.2. RDBMS..........................................................................................................................................5
1.3. Field (Trường) (Tên các cột)..........................................................................................................5
1.4. Bản ghi (row)................................................................................................................................5
1.5. Cột (Column)................................................................................................................................5
1.6. Toàn vẹn dữ liệu...........................................................................................................................5
1.7. Một số nhóm câu lệnh trong SQL.................................................................................................6
1.8. Schema.........................................................................................................................................6
1.9. n...................................................................................................................................................7
2. Kiểu dữ liệu..........................................................................................................................................7
3. Toán tử................................................................................................................................................9
4. Biểu thức...........................................................................................................................................10
5. Thao tác với Database.......................................................................................................................10
5.1 Create Database..........................................................................................................................10
5.2 Drop Database.............................................................................................................................10
5.3 Chọn Database.............................................................................................................................11
5.4 Kiểm tra tất cả CSDL có sẵn..........................................................................................................11
5.5 n...................................................................................................................................................11
6. Từ khóa GO........................................................................................................................................11
7. Thao tác với bảng (Table)..................................................................................................................11
7.1 Creat table...................................................................................................................................11
7.2 Drop Table...................................................................................................................................11
7.3 TRUNCATE TABLE.........................................................................................................................12
7.4 Lệnh DELETE................................................................................................................................12
7.5 Hiển thị thông tin bảng................................................................................................................12
7.6 Lệnh ALTER..................................................................................................................................12
7.7 Lệnh INSERT.................................................................................................................................13
7.8 Lệnh UPDATE...............................................................................................................................14
8. Truy vấn dữ liệu cơ bản.....................................................................................................................14
8.1 Lệnh SELECT.................................................................................................................................14
8.2 Mệnh đề WHERE.........................................................................................................................14

1
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

8.3 Toán tử AND & OR.......................................................................................................................15


8.4 Mệnh đề LIKE (Tìm kiếm gần đúng).............................................................................................15
8.5 Mệnh đề TOP...............................................................................................................................15
8.6 Mệnh đề Order by.......................................................................................................................16
8.7 Mệnh đề Group by......................................................................................................................16
8.8 Từ khóa Distinct...........................................................................................................................17
8.9 n...................................................................................................................................................17
9. Agreeate Funcion...............................................................................................................................17
9.1 Count().........................................................................................................................................17
9.2 Avg()............................................................................................................................................18
9.3 First()...........................................................................................................................................18
9.4 Last()............................................................................................................................................18
9.5 Min()............................................................................................................................................18
9.6 Max()...........................................................................................................................................18
9.7 Round()........................................................................................................................................18
9.8 Sum()...........................................................................................................................................18
9.9 n...................................................................................................................................................18
10. Một số câu lệnh khác.......................................................................................................................18
10.1 Year().........................................................................................................................................18
10.2 Getdate()...................................................................................................................................18
10.3 Print...........................................................................................................................................18
10.4 n.................................................................................................................................................19
11. String Funcion..................................................................................................................................19
12. N......................................................................................................................................................19
Phần 2: SQL nâng cao................................................................................................................................20
1. Các ràng buộc....................................................................................................................................20
1.1. Not Null......................................................................................................................................20
1.2. Default........................................................................................................................................20
1.3. Unique........................................................................................................................................20
1.4. Primary Key (Khóa chính)............................................................................................................20
1.5. Foreign Key (Khóa ngoại)............................................................................................................21
1.6. Check..........................................................................................................................................23
1.8. Identity.......................................................................................................................................24
1.9. n..................................................................................................................................................24
2. JOIN...................................................................................................................................................24
2
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

2.1. INNER JOIN.................................................................................................................................24


2.2. Half - Outer JOIN.........................................................................................................................25
2.3. Full Outer Join.............................................................................................................................26
2.4. Cros Join ( Cartesian JOIN)..........................................................................................................27
2.5. Self Join.......................................................................................................................................27
2.6. n..................................................................................................................................................27
3. Union, Union All.................................................................................................................................27
4. Select Into..........................................................................................................................................28
5. Insert Into Select................................................................................................................................28
6. Truy vấn lồng (Sub-query).................................................................................................................28
7. View...................................................................................................................................................29
8. Check.................................................................................................................................................29
9. Indexes..............................................................................................................................................30
9.1 Giới thiệu.....................................................................................................................................30
9.2 Clustered Index............................................................................................................................31
9.3 Non- Clustered Index...................................................................................................................31
9.4 n...................................................................................................................................................31
10. Kiểu dữ liệu tự định nghĩa...............................................................................................................31
11. Declare và sử dụng biến..................................................................................................................32
12. T-SQL...............................................................................................................................................33
12.1. If-else trong T-SQL....................................................................................................................33
12.2. Vòng lặp trong T-SQL................................................................................................................33
12.3. Cursor trong T-SQL....................................................................................................................34
12.4. n................................................................................................................................................35
13. Store Procedure trong SQL..............................................................................................................35
14. Store Funcion...................................................................................................................................36
15. Trigger.............................................................................................................................................39
16. Transaction......................................................................................................................................40
16.1 Giới thiệu...................................................................................................................................40
16.2 Commit......................................................................................................................................42
16.3 Rollback.....................................................................................................................................42
16.4 Savepoint...................................................................................................................................42
16.5 Set Transaction..........................................................................................................................43
17. N......................................................................................................................................................43

3
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

4
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Phần 1: SQL cơ bản


1. Giới thiệu, Khái niệm
1.1. SQL
SQL là một ngôn ngữ để tương tác với cơ sở dữ liệu. Nó bao gồm việc tạo ra cơ sở dữ
liệu, xóa, lấy các hàng, sửa đổi các hàng. SQL là một ngôn ngữ chuẩn ANSI (American
National Standards Institute), nhưng có nhiều phiên bản khác nhau của ngôn ngữ SQL
SQL là viết tắt của SEQUEL (Tên lúc đầu) Structured English Query Language có
nghĩa là ngôn ngữ truy vấn tiếng Anh có cấu trúc, là một ngôn ngữ máy tính để lưu trữ,
thao tác và truy xuất dữ liệu được lưu trữ trong một cơ sở dữ liệu quan hệ.
SQL là ngôn ngữ chuẩn cho hệ cơ sở dữ liệu quan hệ. Tất cả các hệ thống quản lý cơ
sở dữ liệu quan hệ (RDMS) như MySQL, MS Access, Oracle, Sybase, Informix, Postgres
và SQL Server đều sử dụng SQL làm ngôn ngữ cơ sở dữ liệu chuẩn.
1.2. RDBMS
RDBMS là viết tắt của Relational Database Management System có nghĩa là hệ quản
trị cơ sỡ dữ liệu quan hệ. RDBMS là cơ sở cho SQL, và cho tất cả các hệ thống cơ sở dữ
liệu hiện đại như MS SQL Server, IBM DB2, Oracle, MySQL và Microsoft Access.
Hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) là một hệ thống quản lý cơ sở dữ
liệu (DBMS) dựa trên mô hình quan hệ được giới thiệu bởi EF Codd.
Dữ liệu trong một RDBMS được lưu trữ trong các đối tượng cơ sở dữ liệu được gọi
là các bảng (table). Bảng này về cơ bản là một bộ sưu tập các mục nhập dữ liệu có liên
quan và nó bao gồm nhiều cột và hàng.
1.3. Field (Trường) (Tên các cột)
Mỗi bảng được chia thành các thực thể nhỏ gọi là các trường (Chính là tên các cột).
1.4. Bản ghi (row)
Một bản ghi cũng được gọi là một hàng dữ liệu là từng mục riêng lẻ tồn tại trong một
bảng.
1.5. Cột (Column)
Một cột là một thực thể thẳng đứng trong một bảng có chứa tất cả các thông tin liên
kết với một trường cụ thể trong một bảng.

5
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

1.6. Toàn vẹn dữ liệu


Thực thể toàn vẹn - Không có hàng trùng lặp trong một bảng.
Domain Integrity: Thực thi kiểm tra tính hợp lệ cho một cột nhất định bằng cách hạn
chế kiểu, định dạng hoặc phạm vi giá trị.
Tính toàn vẹn tham chiếu: Các hàng không thể bị xóa, được sử dụng bởi các bản ghi
khác.
Tính toàn vẹn do người dùng định nghĩa: Thực thi một số quy tắc kinh doanh cụ thể
không rơi vào thực thể, miền hoặc toàn vẹn tham chiếu.
1.7. Một số nhóm câu lệnh trong SQL
DDL(Data Definition Language) – Ngôn ngữ định nghĩa dữ liệu
Lệnh Mô tả
CREATE Tạo ra một bảng, một view của một bảng, hoặc các đối tượng khác
ALTER Sửa đổi một đối tượng CSDL hiện có. VD: 1 bảng,…
DROP Xóa toàn bộ một bảng, một view của một bảng hoặc các đối tượng khác
trong CSDL

DML(Data Manipulation Language) - Ngôn ngữ thao tác dữ liệu


Lệnh Mô tả
SELECT Lấy ra các bản ghi nhất định từ một bảng
INSERT Tạo một bản ghi
UPDATE Chỉnh sửa bản ghi
DELETE Xóa bản ghi

DCL (Data Control Language) - Ngôn ngữ điều khiển dữ liệu


Lệnh Mô tả
GRANT Cung cấp một đặc quyền cho người đùng
REVOKE Lấy lại các đặc quyền được cấp từ người dùng

1.8. Schema

6
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Schema là một khái niệm mới được đưa vào SQL Server từ phiên bản 2005, nó là một
namespace dùng để gom nhóm các table có chung một đặc điểm nào đó đễ dễ dàng quản
lý. Nếu bạn không sử dụng schema trong CSDL thì nó sẽ lấy schema mặc định là dbo.

1.9. n

2. Kiểu dữ liệu
Kiểu số nguyên
Kiểu dữ liệu Giá trị
bigint từ -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807
int -2,147,483,648 đến 2,147,483,647
smallint Từ -32768 đến 32767
tinyint Từ 0 đến 255
bit Số nguyên 0, 1, null
decimal(m,d ) m(tổng số lượng các số) mặc định là 18 nếu không được chỉ định cụ thể
d ( số lượng các số nằm sau dấu phẩy) mặc định là 0 nếu không được chỉ
định cụ thể
numeric m(tổng số lượng các số) mặc định là 18 nếu không được chỉ định cụ thể
d ( số lượng các số nằm sau dấu phẩy) mặc định là 0 nếu không được chỉ
định cụ thể
money từ -922,337,203,685,477.5808 đến 922,337,203,685,477.5807
smallmoney từ - 214,748.3648 đến 214,748.3647

Kiểu dữ liệu số có dấu phẩy động


Kiểu dữ liệu Giá trị
Float(n) Số dấu phẩy động n mặc định là 53 nếu không được chỉ định cụ thể (N là
số lượng của số bit lưu trữ trong một kí hiệu hóa học)
Real Tương đương với FLOAT(24)

Kiểu dữ liệu Date and Time


Kiểu dữ liệu Giá trị
7
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

datetime
(YYYY-MM-DD hh:mm:ss)

smalldatetime
date (Lưu ngày, tháng,
năm)
(YYYY-MM-DD)

time (Lưu giờ hh:mm:ss)

Kiểu dữ liệu chuỗi ký tự


Kiểu dữ liệu Giá trị
char (Cấp phát cứng)
varchar (Cấp phát động, bộ nhớ chỉ được lấy Tối đa 8000 kí tự
khi có dữ liệu bên trong)
text (Lưu văn bản lớn) Tối đa 2G

Kiểu dữ liệu chuỗi ký tự Unicode (Có thể chứa ký tự Unicode như tiếng Việt,…)
Kiểu dữ liệu Giá trị
nchar Tối đa 4000 kí tự
nvarchar Tối đa 4000 kí tự theo số tối đa
ntext Tối đa 1.073.741.823

Kiểu dữ liệu nhị phân


Kiểu dữ liệu Giá trị
binary Tối đa 8000 kí tự
varbinary Tối đa 8000 kí tự hoặc theo số tối đa
image Kích thước tối đa là 2G

8
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Kiểu dữ liệu khác

3. Toán tử
Toán tử số học
Toán tử Mô tả
+
-
*
/ Chia lấy nguyên
%(Modulus) Chia lấy dư

Toán tử so sánh
Toán tử Mô tả
=
!=
<> Giá trị 2 toán hạng không bằng nhau thì điều kiện true
>
<
>=
<=
!<
!>

Toán tử logic
Toán tử Mô tả
ALL So sánh giá trị với tất cả các giá trị trong một tập hợp giá trị khác
AND Cho tồn tại nhiều điều kiện trong mệnh đề WHERE
9
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

ANY So sánh một giá trị với bất kỳ giá trị thích hợp nào trong danh sách theo
điều kiện
BETWEEN Tìm kiếm các giá trị nằm trong khoảng nào đó
EXISTS Tìm một hàng trong một bảng đáp ứng một tiêu chí nhất định
IN So sánh một giá trị với một danh sách các giá trị văn bản đã được chỉ
định
LIKE So sánh một giá trị với các giá trị tương ứng sử dụng toán tử ký tự đại
diện
NOT Đảo ngược lại ý nghĩa của toán tử logic được sử dụng
OR Kết hợp nhiểu điều kiện trong mệnh đề WHERE
IS NULL So sánh một giá trị với giá trị NULL
UNIQUE Tìm tất cả các hàng của một bảng mà không có bản sao

4. Biểu thức
Biểu thức Boolean: Tìm, nạp dữ liệu dựa trên việc kết hợp một giá trị duy nhất
Biểu thức Numeric: Thực hiện bất kỳ phép toán nào trong bất kỳ truy vấn nào
Biểu thức Date: Trả về giá trị ngày hoặc giờ hiện tại của hệ thống
5. Thao tác với Database
Database chính là CSDL. Một cơ sở dữ liệu là một tập hợp tổ chức các dữ liệu. Đây là
bộ sưu tập các lược đồ (Schema), bảng (Tables), truy vấn (Query), báo cáo (Report), và
các đối tượng khác. Hiểu đơn giản đây giống như một file để lưu trữ dữ liệu
5.1 Create Database
Tạo mới một database
Cú pháp:
CREATE DATABASE DatabaseName;
Tên Database (CSDL) phải là duy nhất trong RDBMS
5.2 Drop Database
Dùng để xóa một database
Cú pháp:
10
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

DROP DATABASE DatabaseName;

5.3 Chọn Database


Khi có nhiều cơ sở dữ liệu trong lược đồ SQL. Khi đó trước khi thao tác với cơ sở dữ
liệu, bạn cần phải chọn một cơ sở dữ liệu để làm việc với nó.
Cú pháp:
USE DatabaseName;

5.4 Kiểm tra tất cả CSDL có sẵn


Câu lệnh:
SHOW DATABASES;

5.5 n
6. Từ khóa GO
Dùng để thực hiện từng khối lệnh một
7. Thao tác với bảng (Table)
7.1 Creat table
Tạo mới một bảng
Cú pháp:
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
);

7.2 Drop Table


Xóa bỏ một định nghĩa bảng và tất cả các dữ liệu, các chỉ mục, các trigger, các ràng
buộc và thông số của bảng đó. (Các thông tin có sẵn trong bảng cũng sẽ mất mãi mãi)
(Hiểu đơn giản là xóa bảng khỏi Database)
Cú pháp:
DROP TABLE table_name;

11
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Lưu ý: Một bảng được tham chiếu bởi một khóa ngoại thì không thể bị xóa. Muốn xóa
bảng thì ta phải xóa khóa ngoại hoặc xóa bảng tham chiếu đến bảng cần xóa.
7.3 TRUNCATE TABLE
Dùng để xóa dữ liệu trong bảng mà không xóa bảng
Cú pháp:
TRUNCATE TABLE table_name;

7.4 Lệnh DELETE


Dùng để xóa các bản ghi hiện có từ một bảng. Có thể sử dụng mệnh đề WHERE với
truy vấn DELETE để xóa các hàng đã chọn, nếu không tất cả các bản ghi sẽ bị xóa.
Cú pháp:
DELETE FROM table_name
WHERE [condition];

7.5 Hiển thị thông tin bảng


Cú pháp:
DESC Tên_bảng;
VD:
DESC CUSTOMERS;
KQ:

7.6 Lệnh ALTER

12
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Lệnh ALTER TABLE được dùng để thêm cột, chỉnh sửa cột, xóa cột, đổi tên cột hoặc
đổi tên bảng. lệnh ALTER TABLE được dùng để thêm cột, chỉnh sửa cột, xóa cột, đổi
tên cột hoặc đổi tên bảng.
Thêm cột vào bảng trong SQL Server:
ALTER TABLE ten_bang
ADD ten_cot dinh_nghia_cot;

Thêm nhiều cột vào bảng trong SQL Server:


ALTER TABLE ten_bang
ADD cot1 dinh_nghia_cot,
cot2 dinh_nghia_cot,

cot_n dinh_nghia_cot;

Chỉnh sửa cột trong bảng trong SQL Server:


ALTER TABLE ten_bang
ALTER COLUMN ten_cot kieu_cot;

Xóa cột của bảng trong SQL Server:


ALTER TABLE ten_bang

DROP COLUMN ten_cot;

Đổi tên cột của bảng trong SQL Server: Có thể dùng lệnh ALTER TABLE để đổi
tên cột trong bảng. Có thể dùng sp_rename nhưng Microsoft khuyến khích xóa và tạo lại
bảng để bản ghi và các quy trình lưu trữ không bị hỏng.
Cú pháp
sp_rename 'ten_bang.ten_cot_cu', 'ten_cot_moi', 'COLUMN';

7.7 Lệnh INSERT


Dùng để thêm các hàng (Bản ghi) mới vào một bảng trong CSDL
Cú pháp:
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);
Trong đó:
 column1, column2, column3, ... columnN là tên của các cột trong bảng mà ta
muốn chèn dữ liệu.
 value1, value2, value3,...valueN là giá trị tương ứng với các cột trên.

13
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Nếu thêm giá trị cho tất cả các cột của bảng, ta có thể sử dụng câu lệnh:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
Lưu ý:
 Thứ tự của các giá trị theo thứ tự của các cột trong bảng.
 Khi thêm dữ liệu kiểu số thì ghi số bình thường.
 Khi thêm dữ liệu kiểu ký tự hoặc ngày thì cần để trong dấu nháy đơn: ‘’. Ví dụ
kiểu dữ liệu date khi đưa vào: ‘20211129’ (Không được ghi dấu / hay – và phải
viết theo định dạng yyyymmdd)
 Khi thêm dữ liệu kiểu Unicode thì cần ghi chữ N đằng trước dấu nháy đơn: N’’
7.8 Lệnh UPDATE
Sửa đổi các bản ghi hiện có trong một bảng. Có thể sử dụng mệnh đề WHERE với truy
vấn UPDATE để cập nhật các bản ghi đã chọn, nếu không tất cả các bản ghi sẽ bị ảnh
hưởng.
Cú pháp:
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

8. Truy vấn dữ liệu cơ bản


8.1 Lệnh SELECT
Sử dụng để lấy dữ liệu từ một bảng cơ sở dữ liệu trả về dữ liệu này dưới dạng một
bảng kết quả. Các bảng kết quả này được gọi là tập kết quả (result-sets).
Cú pháp:
SELECT column1, column2, columnN FROM table_name;
Nếu muốn lấy tất cả các trường của bảng:
SELECT * FROM table_name;
Nếu muốn đổi tên cột hiển thị của bảng khi truy vấn, ta thêm AS vào sau tên trường
(cột) muốn truy vấn.
SELECT column1 AS ‘Tên_hiển_thị’, column2, columnN FROM table_name;

8.2 Mệnh đề WHERE

14
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Sử dụng để chỉ định một điều kiện trong khi lấy dữ liệu từ một bảng hoặc bằng cách
join với nhiều bảng. Nếu điều kiện thỏa mãn, thì nó trả về một giá trị cụ thể từ bảng. Sử
dụng mệnh đề WHERE để lọc các bản ghi và chỉ lấy các bản ghi cần thiết.
Cú pháp:
WHERE [condition]
Ví dụ muốn lấy dữ liệu từ các cột column1, column2, …từ bảng table_name với điều
kiện:
SELECT column1, column2, columnN
FROM table_name
WHERE [condition]

8.3 Toán tử AND & OR

8.4 Mệnh đề LIKE (Tìm kiếm gần đúng)


So sánh một giá trị với các giá trị tương tự sử dụng toán tử ký tự đại diện (wildcard).
Có hai ký tự đại diện được sử dụng kết hợp với toán tử LIKE.
 Phần trăm (%):Dấu phần trăm thể hiện không, một hoặc nhiều ký tự
 Dấu gạch dưới (_):Dấu gạch dưới đại diện cho một số hoặc một ký tự.

Câu lệnh Mô tả
WHERE SALARY LIKE '200%' Tìm bất kỳ giá trị nào bắt đầu bằng 200
WHERE SALARY LIKE '%200%' Tìm bất kỳ giá trị nào có chứa 200
WHERE SALARY LIKE '_00%' Tìm bất kỳ giá trị nào có chứa 0 ở vị trí
thứ 2 và thứ 3
WHERE SALARY LIKE '2_%_%' Tìm bất kỳ giá trị nào bắt đầu bằng 2 và
có ít nhất 3 ký tự
WHERE SALARY LIKE '%2' Tìm bất kỳ giá trị nào kết thúc bằng 2
WHERE SALARY LIKE '_2%3' Tìm bất kỳ giá trị nào có 2 ở vị trí thứ 2 và
kết thúc bằng 3
WHERE SALARY LIKE '2___3' Tìm bất kỳ giá trị nào có dạng 2xxx3

15
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

8.5 Mệnh đề TOP


Sử dụng để lấy ra N bản ghi hoặc X phần trăm bản ghi từ một bảng
Cú pháp:
SELECT TOP number|percent column_name(s)
FROM table_name
WHERE [condition]
Ví dụ:
TOP 5
TOP 10 PERCENT

8.6 Mệnh đề Order by


Sử dụng để sắp xếp dữ liệu theo thứ tự tăng dần hoặc giảm dần, dựa trên một hoặc
nhiều cột. Một số cơ sở dữ liệu sắp xếp các kết quả truy vấn theo thứ tự tăng dần theo
mặc định. Lệnh ASC được sử dụng để sắp xếp tăng dần và DESC được sử dụng để sắp
xếp giảm dần.
Cú pháp:
SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
(Mặc định là ASC: Tăng dần)
8.7 Mệnh đề Group by
Sử dụng kết hợp với câu lệnh SELECT để sắp xếp dữ liệu giống nhau thành các nhóm.
Mệnh đề GROUP BY này tuân theo mệnh đề WHERE trong câu lệnh SELECT và đứng
trước mệnh đề ORDER BY.
Lưu ý:
 Cột hiển thị phải là thuộc tính nằm trong khối Group by.
 Thường sử dụng kèm với Agreeate Funcion
Cú pháp:

SELECT column1, column2


FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2
ORDER BY column1, column2

16
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Lưu ý:
 Where không được chứa Agreeate Funcion. Do đó, để giải quyết vấn đề trên, ta
sử dụng HAVING ở sau mệnh đề Group By. Hiểu đơn giản, Having chính là
where của Group By.
 Having là điều kiện con của Group By. Do đó, điều kiện trong Having phải nằm
trong phạm vi của Group By.
 Sự khác nhau cơ bản của 2 mệnh đề này chính là ở chức năng mà nó đảm nhận.
 WHERE là mệnh đề điều kiện trả về kết quả đối chiếu cho từng bản ghi
 HAVING là mệnh đề điều kiện trả về kết quả đối chiếu cho nhóm được
tạo bởi mệnh đề GROUP BY

Ví dụ:

8.8 Từ khóa Distinct


Sử dụng kết hợp với câu lệnh SELECT để loại bỏ tất cả các bản ghi trùng lặp và chỉ
lấy các bản ghi duy nhất.
Cú pháp:
SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]

8.9 n

9. Agreeate Funcion
9.1 Count()
Dùng để đếm số lượng các bản ghi
COUNT(*) : Đếm số lượng tất cả các bản ghi của bảng
COUNT(Tên_cột): Đếm số lượng tất cả các bản ghi của cột Tên_cột

17
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

 Sử dụng 2 cách trên đều không có khác biệt, nên thường người ta sẽ sử dụng
COUNT(*)
Ví dụ muốn đếm tất cả các bản ghi của bảng HocSinh:
SELECT COUNT(*) AS N‘Số lượng’
FROM HocSinh
WHERE [condition] – Có thể có để lọc điều kiện

9.2 Avg()
Dùng để tính giá trị trùng bình của của các giá trị trong 1 cột nào đó

9.3 First()
9.4 Last()
9.5 Min()
Dùng để lấy giá trị nhỏ nhất của cột nào đó
9.6 Max()
Dùng để lấy giá trị lớn nhất của cột nào đó
9.7 Round()
n
9.8 Sum()
Dùng để tính tổng các giá trị của cột nào đó

9.9 n
10. Một số câu lệnh khác
10.1 Year()
Trả về giá trị năm của ngày.
Ví dụ NgaySinh kiểu dữ liệu date. Khi ta muốn lấy ra năm của NgaySinh, ta viết:
YEAR(NgaySinh)

10.2 Getdate()
Trả về ngày tháng, năm hiện tại
Cú pháp:
GETDATE()

10.3 Print
18
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Dùng để xuất ra một giá trị đơn cụ thể, rõ ràng


Ví dụ:
PRINT 1;
PRINT @Ten_bien;
10.4 n
11. String Funcion

12. N

19
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Phần 2: SQL nâng cao


1. Các ràng buộc
Constraint là các quy tắc được thi hành trên các cột dữ liệu trên một bảng. Chúng được
sử dụng để giới hạn loại dữ liệu có thể insert vào một bảng. Điều này đảm bảo tính chính
xác và độ tin cậy của dữ liệu trong cơ sở dữ liệu.
Các ràng buộc có thể được chỉ định khi một bảng được tạo ra với câu lệnh CREATE
TABLE hoặc có thể sử dụng câu lệnh ALTER TABLE để tạo các ràng buộc ngay cả sau
khi bảng được tạo.
Các cấp độ của Constraint:
 Cột: Ràng buộc chỉ áp dụng cho một cột.
 Bảng: Ràng buộc áp dụng cho toàn bộ bảng.
Một số ràng buộc phổ biến:
1.1. Not Null
NOT NULL - Đảm bảo rằng một cột không thể có giá trị NULL.
1.2. Default
DEFAULT - Cung cấp một giá trị mặc định cho một cột khi không có giá trị được chỉ
định.
1.3. Unique
UNIQUE - Đảm bảo rằng tất cả các giá trị trong một cột là khác nhau.
1.4. Primary Key (Khóa chính)
PRIMARY Key - Xác định mỗi hàng / bản ghi là duy nhất trong một bảng cơ sở dữ
liệu.
Primary key (khóa chính) là một trường trong bảng mà các giá trị trong trường đó là
duy nhất và không chứa giá trị NULL (Hiểu đơn giản, khóa chính là thứ giúp phân biệt
các bản ghi với nhau). Một bảng chỉ có một khóa chính. Nếu trong bảng có nhiều trường
được chọn làm khóa chính thì ta gọi đó là khóa tổng hợp (composite key).
Khóa chính là thứ để khóa ngoại tham chiếu tới
Tạo khóa chính:
- Khi tạo bảng:

20
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

CREATE TABLE table_name(


column1 datatype PRIMARY KEY, --Tạo khóa chính là 1 trường
column2 datatype,
column3 datatype,
.....
columnN datatype,
)

CREATE TABLE table_name(


column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY (column1, column2,…) --Tạo khóa chính là nhiều trường
)

CREATE TABLE table_name(


column1 datatype
column2 datatype,
column3 datatype,
.....
columnN datatype,
CONSTRAINT Tên_khóa_chính --Đặt tên khóa chính sau cho dễ thao tác
PRIMARY KEY (column1, column2,…) --Tạo khóa chính là nhiều trường, thường thì
những trường được chọn làm khóa chính lúc tạo bảng sẽ thêm NOT NULL
)

- Sau khi bảng đã được tạo:


ALTER TABLE table_name
ADD CONSTRAINT Tên_khóa_chính --Đặt tên khóa chính sau cho dễ thao tác
PRIMARY KEY (column1, column2,…) --Tạo khóa chính là nhiều trường

Xóa khóa chính:

1.5. Foreign Key (Khóa ngoại)


FOREIGN Key - Xác định một hàng / bản ghi là duy nhất trong bất kỳ bảng cơ sở dữ
liệu khác.
Khóa ngoại đảm bảo sự toàn vẹn dữ liệu. Khóa ngoại sẽ tham chiếu đến khóa chính.
Tức là các trường của khóa ngoại chỉ nhận các giá trị mà khóa chính có.

21
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Hiểu đơn giản thì khóa ngoại của bảng này là khóa chính của bảng khác. Và 1 bảng thì
chỉ có 1 khóa chính và có thể có một hoặc nhiều khóa ngoại.
Điều kiện để tạo khóa ngoại:
 Tham chiếu đến khóa chính
 NOT NULL và UNIQUE
 Cùng kiểu dữ liệu (Tên trường có thể không giống nhưng bắt buộc phải cùng
kiểu dữ liệu)
 Cùng số lượng trường có sắp xếp
 Đảm bảo toàn vẹn dữ liệu, không có trường hợp tham chiếu tới dữ liệu không tồn
tại. Lưu ý, muốn xóa bảng hay xóa khóa chính thì phải xóa khóa ngoại tham chiếu
tới bảng đó trước.
Cách tạo khóa ngoại:
- Khi tạo bảng:
CREATE TABLE table_name(
column1 datatype
column2 datatype,
column3 datatype,
.....
columnN datatype,
FOREGIN KEY (column1, column2,…) REFERENCES Tên_bảng_tham_chiếu_tới (column1,
column2,…) --Chú ý sắp xếp theo đúng thứ tự cột
)

- Sau khi bảng đã được tạo:


ALTER TABLE table_name
ADD CONSTRAINT Tên_khóa_ngoại --Đặt tên khóa ngoại sau cho dễ thao tác
FOREGIN KEY (column1, column2,…) REFERENCES Tên_bảng_tham_chiếu_tới(column1,
column2,…)
- Hủy khóa ngoại:
ALTER TABLE table_name
DROP CONSTRAINT Tên_khóa_ngoại

Indexes on Foreign Key Constraints: Ở khóa chính thì indexes được tạo tự động còn ở
khóa ngoại thì không. Ta nên tạo indexes cho khóa ngoại để:

22
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

- Truy vấn, tìm kiếm nhanh giữa 2 bảng. Kể cả khi 2 bảng chỉ có liên quan đến
nhau do cùng tham chiếu tới một khóa chính ở bảng khác. (Do hệ thống tìm
kiếm bằng cách khớp cột)
- Thay đổi khóa chính sẽ kiểm tra các khóa ngoại ở các bảng liên quan
Cascading Referential Integrity (Tính toàn vẹn tham chiếu theo tầng): Có 2 trường hợp
là:
(https://www.mssqltips.com/sqlservertip/2365/sql-server-foreign-key-update-and-
delete-rules/ )
 ON DELETE: Khóa ngoại tham chiếu đến khóa chính. Các giá trị trong khóa
ngoại phải nằm trong tập hợp các giá trị của khóa chính. Nhưng khi một giá trị
trong khóa chính bị xóa thì với:
 On Delete Cascade: Các bản ghi liên kết với giá trị đó ở bảng chứa khóa
ngoại sẽ bị xóa theo (Xóa cả hàng ở bảng chứa khóa ngoại)
 On Delete Set Null: Các bản ghi liên kết với giá trị đó ở bảng chứa khóa
ngoại sẽ được set giá trị NULL, còn các cột khác không bị ảnh hưởng gì
 On Delete Set Default: Các bản ghi liên kết với giá trị đó ở bảng chứa khóa
ngoại sẽ được set về giá trị mặc định, còn các cột khác không bị ảnh hưởng

 On Delete No Action: Các bản ghi liên kết với giá trị đó ở bảng chứa khóa
ngoại sẽ không bị thay đổi giá trị, còn các cột khác không bị ảnh hưởng gì
 ON UPDATE: Khóa ngoại tham chiếu đến khóa chính. Các giá trị trong khóa
ngoại phải nằm trong tập hợp các giá trị của khóa chính. Nhưng khi một giá trị
trong khóa chính được update thì với:
 On Update Cascade: Các bản ghi liên kết với giá trị đó ở bảng chứa khóa
ngoại sẽ được cập nhật theo.
 On Update Set Null: Các bản ghi liên kết với giá trị đó ở bảng chứa khóa
ngoại sẽ được set giá trị NULL, còn các cột khác không bị ảnh hưởng gì.
 On Update Set Default: Các bản ghi liên kết với giá trị đó ở bảng chứa khóa
ngoại sẽ được set về giá trị mặc định, còn các cột khác không bị ảnh hưởng
gì.
23
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

 On Update No Action: Không cho phép, thông báo lỗi


(Để sử dụng, ta chỉ cần thêm các câu lệnh trên vào sau tên_bảng_tham_chiếu tới)

1.6. Check
CHECK - CHECK constraint đảm bảo rằng tất cả các giá trị trong một cột thỏa mãn
một số điều kiện.
1.7. Index
INDEX - Dùng để tạo và lấy dữ liệu từ cơ sở dữ liệu rất nhanh.
1.8. Identity
IDENTITY: Số tạo ra duy nhất và tự động tăng, mặc định tăng từ 1.
IDENTITY(x,y): Tự động tăng từ x, mỗi lần tăng y đơn vị
1.9. n
2. JOIN
Sử dụng để kết hợp các bản ghi từ hai hay nhiều bảng trong cơ sở dữ liệu. JOIN là một
phương tiện để kết hợp các trường từ hai bảng bằng cách sử dụng các giá trị chung cho
mỗi bảng.
2.1. INNER JOIN
Lệnh Inner Join trong SQL tạo một bảng kết quả mới bằng cách kết hợp các giá trị cột
của hai bảng (table1 và table2) dựa trên điều kiện nối. Truy vấn so sánh từng hàng của
table1 với từng hàng của table2 để tìm tất cả các cặp hàng thỏa mãn điều kiện nối. Khi
điều kiện nối được thỏa mãn, các giá trị cột cho mỗi cặp hàng A và B phù hợp sẽ được
kết hợp thành một hàng kết quả.

Cú pháp:
24
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Kiểu cũ: Dùng SELECT kết hợp với điều kiện WHERE:
SELECT table1.column1, table2.column2...
WHERE table1.common_field = table2.common_field;

Kiểu chuẩn được Microsoft khuyến cáo:


SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;
(Lưu ý: Có thể viết JOIN = INNER JOIN)
Ví dụ:
SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
INNER JOIN ORDERS o
ON c.ID = o.CUSTOMER_ID;

2.2. Half - Outer JOIN


Right JOIN
Lệnh Right Join trong SQL trả về tất cả các hàng từ bảng bên phải, ngay cả khi không
có kết quả khớp nào trong bảng bên trái. Điều này có nghĩa là nếu mệnh đề ON không
khớp với các bản ghi của bảng bên trái. Lệnh Right Join vẫn sẽ trả về một hàng trong kết
quả, nhưng với NULL cho mỗi cột của bảng bên trái.

Cú pháp:
SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;
Ví dụ:
SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
RIGHT JOIN ORDERS o
ON c.ID = o.CUSTOMER_ID;
Left JOIN
25
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Lệnh Left Join trong SQL trả về tất cả các hàng từ bảng bên trái, ngay cả khi không có
kết quả khớp nào trong bảng bên phải. Điều này có nghĩa là nếu mệnh đề ON không khớp
với các bản ghi của bảng bên phải. Lệnh Left Join vẫn sẽ trả về một hàng trong kết quả,
nhưng với NULL cho mỗi cột của bảng bên phải.

Cú pháp:
SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;
Ví dụ:
SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
LEFT JOIN ORDERS o
ON c.ID = o.CUSTOMER_ID;
2.3. Full Outer Join
Lệnh Full Join trong SQL là sự kết hợp các kết quả của cả hai phép nối Left Join và
Right Join. Kết quả join sẽ chứa tất cả các bản ghi từ cả hai bảng và điền vào NULL
cho các kết quả bị thiếu ở hai bên.
(Kết hợp 2 bảng theo điều kiện, Bên nào không có dữ liệu thì để NULL)

Cú pháp:
SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

26
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Ví dụ:
SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
FULL JOIN ORDERS o
ON c.ID = o.CUSTOMER_ID;

2.4. Cros Join ( Cartesian JOIN)


Là tổ hợp mỗi bản ghi ở bảng A với tất cả bản ghi ở bảng B
(Mỗi hàng của bảng thứ nhất sẽ được kế hợp với mỗi hàng của bảng thứ hai. Nên số
lượng các hàng trong bảng mới được tạo ra bằng tích số lượng giữa các hàng )
Cú pháp:
SELECT table1.column1, table2.column2...
FROM table1
CROSS JOIN table2

2.5. Self Join


Lệnh Self Join trong SQL được sử dụng để nối một bảng với chính nó.
Cú pháp:
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_field = b.common_field;

Ví dụ:
SELECT a.ID, b.NAME, a.SALARY
FROM CUSTOMERS a, CUSTOMERS b
WHERE a.SALARY < b.SALARY

2.6. n
3. Union, Union All
Mệnh đề UNION trong SQL được sử dụng để kết hợp các kết quả của hai hoặc nhiều
câu lệnh SELECT mà không trả về bất kỳ hàng trùng lặp nào.
Toán tử UNION ALL được dùng để kết hợp bộ kết quả từ 2 hoặc nhiều lệnh SELECT
trong SQL Server. Khác với toán tử UNION, toán tử UNION ALL trả về tất cả các hàng
từ truy vấn và không xóa các hàng trùng lặp
(Hiểu đơn giản là Gộp kết quả 2 lệnh SELECT và loại bỏ đi những kết quả bị trùng)

27
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Để sử dụng mệnh đề UNION này, mỗi câu lệnh SELECT cần phải có
 Tổng số cột bằng nhau
 Cùng tên cột
 Cùng kiểu dữ liệu
 Cùng một thứ tự các cột
Cú pháp:
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

4. Select Into
Dùng để lấy hết dữ liệu bảng hoặc các giá trị trong một cột của Bảng 1 cũ sang Bảng 2
mới => Ứng dụng để Backup dữ liệu
Cú pháp:
SELECT column1 [, column2 ] INTO table_mới
FROM table1 [, table2 ]
[WHERE condition]

5. Insert Into Select


Dùng để copy dữ liệu từ Bảng_A sang một bảng đã tồn tại là Bảng_B. Lưu ý là 2
bảng này phải có các trường muốn copy cùng kiểu dữ liệu
Cú pháp:
INSERT INTO table_B
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

6. Truy vấn lồng (Sub-query)


IN: Kiểm tra xem một giá trị có tồn tại trong đâu đó không (Bảng)
Truy vấn lồng thực chất là tái sử dụng lại một bảng truy vấn (Bảng kết quả truy vấn)
để làm cơ sở thực hiện truy vấn.
Cách thực hiện: Đặt câu truy vấn đó (SELECT) trong một cặp dấu ngoặc đơn ().
28
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Có thể truy vấn lồng trong FROM hoặc WHERE.


Lưu ý, khi sử dụng truy vấn lồng trong FROM ta nên đặt tên để có thể tái sử dụng.
Cách xác định: Tách yêu cầu ra thành từng câu truy vấn đơn giản, từng yêu cầu rồi đưa
vào truy vấn lồng.

7. View
View là bảng ảo. cập nhật dữ liệu theo bảng mà view truy vấn tới.
Giả sử Bảng_A được tạo ra từ Bảng_B và Bảng_C dựa vào câu lệnh INSERT…INTO.
Khi dữ liệu ở Bảng_B và Bảng_C thay đổi thì dữ liệu ở Bảng_A không thay đổi (Do A là
một bảng thật, độc lập với các Bảng_B và Bảng_C). Nhưng nếu ta muốn tạo ra một bảng
mà dữ liệu được tham chiếu tới hai Bảng_B và Bảng_C, dữ liệu ở bảng này sẽ thay đổi
mỗi khi dữ liệu ở Bảng_B và Bảng_C được UPDATE hay thay đổi, lúc này ta cần sử
dụng View.
Cú pháp:
CREATE VIEW view_name AS
SELECT column1, column2,...
FROM table_name
WHERE condition;
Giải thích:
 CREATE VIEW view_name: Tạo bảng View với tên là view_name

 AS: Bảng view được tạo ra với dữ liệu lấy từ câu truy vấn sau AS
(Nếu muốn tạo bảng View mà có tên chứa ký tự UNICODE như tiếng Việt, ta đặt tên
bảng view vào trong cặp dấu ngoặc đơn () .)
Sử dụng View như một bảng bình thường, ta chỉ cần thay thế TABLE thành VIEW . Ví
dụ với những lệnh:
 Xóa bảng: DROP TABLE => DROP VIEW
 Sửa bảng: ALTER TABLE => ALTER VIEW

8. Check

29
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Check là tạo một điều kiện để bắt buộc ta nhập dữ liệu vào phải thỏa mãn điều kiện
của check
Cách tạo Check như tạo khóa chính.
- Khi tạo bảng:
Cách 1:
CREATE TABLE table_name(
column1 datatype
column2 datatype,
column3 datatype,
.....
columnN datatype,
CHECK (Điều kiện) --Tạo điều kiện ví dụ: column3 >1,…
)

CREATE TABLE table_name(


column1 datatype
column2 datatype,
column3 datatype,
.....
columnN datatype,
CONSTRAINT Tên_Check --Đặt tên check sau cho dễ thao tác
CHECK (Điều kiện) --Tạo điều kiện ví dụ: CHECK (column3 >1),…
)

- Sau khi bảng đã được tạo:


ALTER TABLE table_name
ADD CONSTRAINT Tên_Check --Đặt tên check sau cho dễ thao tác
CHECK (Điều kiện) --Tạo điều kiện ví dụ: column3 >1,…

9. Indexes
9.1 Giới thiệu
Khi có một lượng lớn dữ liệu cần truy vấn, để tăng tốc độ truy vấn, ta sẽ đánh index
cho bảng đó.
Lưu ý
- Thêm, xóa, sửa dữ liệu trong cột index sẽ lâu hơn cột bình thường.
- Tốc độ tìm kiếm, truy vấn trong cột index sẽ nhanh hơn cột bình thường.
- Không nên sử dụng cho các cột mà chứa một số lượng lớn giá trị NULL.
- Không nên dùng Index cho các cột mà thường xuyên bị sửa đổi.

30
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

- Index là một bảng được đánh số thứ tự. Mỗi phần tử trong bảng sẽ lưu một giá trị
là địa chỉ để tham chiếu đến các bản ghi được đánh index

Cú pháp:
 Chỉ mục Single-Column: Chỉ một cột được đánh Index
CREATE INDEX index_name
ON table_name (column1);
 Chỉ mục Composite: Nhiều cột được đánh Index
CREATE INDEX index_name
ON table_name (column1, column2, ...);
 Chỉ mục UNIQUE: Cột được đánh Index không được có giá trị trùng nhau
CREATE UNIQUE INDEX index_name
ON table_name (column1);
Lưu ý: Việc lựa chọn kiểu chỉ mục nào là tùy thuộc vào tần suất truy vấn của ta. Nếu
ta thường sử dụng một cột làm điều kiện lọc khi truy vấn thì sử dụng Single-column và
ngược lại.
9.2 Clustered Index
Mỗi một bảng chỉ có một Clustered Index. Clustered Index được tạo tự động khi
khóa chính được tạo ra và được lưu trữ theo thứ tự tăng dần.
Khi ta thêm một record mới vào thì hệ thống sẽ xếp lại toàn bộ data.
Do khóa chính là duy nhất nên mỗi một Index sẽ chỉ có một bản ghi, do đó mà tốc độ
truy vấn sẽ nhanh hơn Non- Clustered Index.
9.3 Non- Clustered Index
Mỗi một bảng có thể có một hoặc nhiều Non-Clustered Index. Non-Clustered Index
được tạo ra khi ta đánh Index cho một hoặc nhiều cột không phải là khóa chính.
Khi ta thêm một record mới vào thì hệ thống sẽ xếp lại Index. Nếu các bản ghi của cột
được đánh index có giá trị trùng nhau thì chúng sẽ được đánh số cùng Index. Khi tìm
kiếm thì sẽ tìm đến phần Index này và tìm tiếp các bản ghi thỏa mãn trong danh sách của
Index đó. (Tương tự như Hash-Map). Do đó mà tốc độ truy vấn sẽ lâu hơn Clustered
Index

31
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

9.4 n
10. Kiểu dữ liệu tự định nghĩa
Cú pháp:
EXEC sp_addtype 'Ten_Kieu_du_lieu_moi', 'Ten_Kieu_du_lieu_thuc’, 'Not
null'
Giải thích:
 'Ten_Kieu_du_lieu_moi': Tên kiểu dữ liệu mới tự định nghĩa
 'Ten_Kieu_du_lieu_thuc’: Tên kiểu dữ liệu thực ví dụ int, char, nvarchar,…
 'Not null': Không cho phép giá trị NULL. Câu lệnh này có thể có hoặc không
Để xóa kiểu dữ liệu này, ta sử dụng cú pháp: (Lưu ý, kiểu dữ liệu này phải không được
sử dụng ở bảng nào thì mới xóa được)
EXEC sp_droptype ‘Ten_Kieu_du_lieu_moi’

11. Declare và sử dụng biến


Mục đích tạo ra biến là để lưu lại một giá trị có được từ một câu truy vấn. Sau đó ta có
thể tái sử dụng lại nhiều lần.
Cú pháp khai báo:
DECLARE @Ten_bien Data_type
Hoặc:
DECLARE @Ten_bien Data_type = giá_trị

Sử dụng: Kèm theo dấu @


- Set giá trị dựa vào hàm Set
DECLARE @i INT =0;
DECLARE @j INT;
SET @j = 5;
SET @i += 1;
SET @i += @j;
- Set giá trị dựa vào Select
Ví dụ:

32
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Kết quả ở cột Masv chỉ có một giá trị 8 do biến @Ten_bien từ câu lệnh SELECT bên
trên chỉ lưu được 1 giá trị nên sẽ nhận giá trị cuối cùng được duyệt là giá trị 8.

Để lưu một bảng giá trị, ta có thể sử dụng:


DECLARE @Local_Tablevariable TABLE
(column_1 Data_Type,
column_2 Data_Type,
column_N Data_Type
)
Thêm và sử dụng như biến và mảng thông thường.
12. T-SQL
12.1. If-else trong T-SQL
Cú pháp:
IF (Dieu_kien)
BEGIN
[Nhóm câu lệnh]
33
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

END
ELSE
BEGIN
[Nhóm câu lệnh]
END

12.2. Vòng lặp trong T-SQL


Cú pháp:
WHILE (điều kiện)
BEGIN
[Nhóm câu lệnh]
END
Ví dụ:

12.3. Cursor trong T-SQL


Khi duyệt từng record của bảng mà ta lại muốn mỗi một record có kết quả xử lý riêng
thì ta dùng Cursor.
Các bước thực hiện:

34
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Bước 1: Khai báo con trỏ, trỏ đến một tập dữ liệu (kết quả của Select) bằng
lệnh DECLARE:
Ta khai báo một con trỏ đặt tên là cursorProduct nhận kết quả từ câu lệnh SELECT thì
sẽ viết như sau:
DECLARE cursorProduct CURSOR FOR
SELECT id, title FROM Product
Con trỏ này sẽ nắm giữ thông tin là 1 bảng kết quả của câu lệnh SELECT. Con trỏ này
khi đó sẽ nằm ở vùng nhớ đầu tiên của bảng.

Bước 2: Khi bắt đầu quá trình đọc các dòng dữ liệu từ Cursor trên, thì phải mở con
trỏ, thực hiện như sau:
Open cursorProduct
Khi Cursor được mở, con trỏ sẽ trỏ tới dòng đầu tiên của tập dữ liệu, lúc này có thể
đọc nội dung dòng đó bằng lệnh FETCH
Bước 3: Đọc dữ liệu sử dụng lệnh như sau:
(Lưu ý phải khai báo 2 biến @id và @title trước khi sử dụng)
DECLARE @id INT
DECLARE @title INT
FETCH NEXT FROM cursorProduct INTO @id, @title

Lệnh trên sẽ đọc nội dung dòng hiện tại, lưu vào biến @id và @title (vì dữ liệu trong
Cursor này có 2 cột). Nếu đọc thành công thì dịch chuyển con trỏ tới dòng tiếp theo
Để kiệm tra việc FETCH thành công thì kiểm tra điều kiện @@FETCH_STATUS = 0
Kết hợp những điều trên lại, để đọc từng dòng từ đầu đến cuối sẽ làm như sau:
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'ID:' @id
PRINT 'TITLE:' @title

FETCH NEXT FROM cursorProduct INTO @id, @title


END
Bước 4: sau khi không còn dùng đến Cursor, cần đóng lại và giải phóng các tài nguyên
nó chiếm giữ.
CLOSE cursorProduct
DEALLOCATE cursorProduct

35
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Lưu ý: Con trỏ sẽ truy vấn lâu. Nên chỉ khi nào thực hiện những truy vấn phức tạp ta
mới nên dùng. Còn lại ta nên cố gắng đặt biến và sử dụng truy vấn lồng.

12.4. n
13. Store Procedure trong SQL
Store Procedure:
- Là chương trình hay một thủ tục => Tái sử dụng lại một đoạn Code đơn giản và dễ
dàng. Ta chỉ cần truyền vào thông số (Hoặc không) và nó sẽ thực hiện khối lệnh
trong Store
- Ta có thể dùng Transaction-SQL EXCUTE (EXEC) để thực thi các Stored
Procedure.
- Stored Procedure khác với các hàm xử lý là giá trị trả về => Không có giá trị trả về
mà chỉ trả ra 1 bảng truy vấn kết quả
- Không chứa trong tên và không được sử dụng trực tiếp trong biểu thức. (Không thể
sử dụng trực tiếp trong câu truy vấn)
Tính chất:
- Động: Có thể chỉnh sửa khối lệnh, tái sử dụng lại nhiều lần
- Nhanh hơn: Tự phân tích cú pháp cho tối ưu và tạo bản sao để lần sử dụng tới
không phải chạy lại từ đầu
- Bảo mật: Giới hạn quyền cho user sử dụng và user nào không được sử dụng
- Giảm Bandwidth: Với những Transection lớn thì dùng store sẽ đảm bảo.
Cú pháp:
CREATE PROC Ten_Store
@paramter1 int, @paramter2 int -- Danh sách các thông só truyền vào. Có
thể có hoặc không. Các thông số này được sử dụng trong phạm vi của Store
AS
BEGIN
-- Câu lệnh hoặc nhóm câu lệnh

END
Sử dụng: Có 2 cách:
-- Cách 1
EXEC Ten_Store @paramter1 = [giá_trị], @paramter2 = [giá_trị]
-- Cách 2

36
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

EXEC Ten_Store [giá_trị], [giá_trị]

Muốn chỉnh sửa Store Procedure, ta thay từ khóa CREATE bằng ALTER

14. Store Funcion


Tác dụng tương tự như Store Procedure. Nhưng với Store Procedure thì có thể được
gọi độc lập và không thể được gọi trực tiếp trong câu truy vấn. Còn với Funcion thì
không thể được gọi độc lập mà phải gọi kèm trong một câu truy vấn.
Cú pháp:
CREATE FUNCTION [schema_name.]function_name
( [
@parameter [ AS ] [type_schema_name.] datatype[ = default ] [ READONLY ]
, @parameter [ AS ] [type_schema_name.] datatype[ = default ] [ READONLY ]
]
)
RETURNS return_datatype

[ WITH { ENCRYPTION| SCHEMABINDING| RETURNS NULL ON NULL INPUT| CALLED ON

NULL INPUT| EXECUTE AS Clause ]


[ AS ]
BEGIN
[declaration_section]
executable_section
RETURN return_value

END;
Trong đó:
 schema_name: Tên schema (lược đồ) sở hữu function.
 function_name: Tên gán cho function.
 @parameter: Một hay nhiều tham số được truyền vào hàm.
 type_schema_name: Kiểu dữ liệu của schema (nếu có).
 Datatype: Kiểu dữ liệu cho @parameter.

37
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

 Default: Giá trị mặc định gán cho @parameter.


 READONLY: @parameter không thể bị function ghi đè lên.
 return_datatype: Kiểu dữ liệu của giá trị trả về.
 ENCRYPTION: Mã nguồn (source) của function sẽ không được lưu trữ dưới
dạng text trong hệ thống.
 SCHEMABINDING: Đảm bảo các đối tượng không bị chỉnh sửa gây ảnh hưởng
đến function.
 RETURNS NULL ON NULL INPUT: Hàm sẽ trả về NULL nếu bất cứ parameter
nào là NULL.
 CALL ON NULL INPUT: Hàm sẽ thực thi cho dù bao gồm tham số là NULL.
 EXECUTE AS clause: Xác định ngữ cảnh bảo mật để thực thi hàm.
 return_value: Giá trị được trả về.
Ví dụ:
CREATE FUNCTION fuNhanvien

(@nhanvien_id INT)

RETURNS VARCHAR(50)
AS

BEGIN
DECLARE @nhanvien_name VARCHAR(50);

IF @nhanvien_id < 10
SET @nhanvien_name = 'Smith';
ELSE

SET @nhanvien_name = 'Lawrence';

RETURN @nhanvien_name;
END;
Lưu ý: Kiểu trả về của Funcion phải cùng kiểu dữ liệu trả về trong khối lệnh Begin-
End
Sử dụng:
VD1

38
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

VD2

Muốn chỉnh sửa Store Funcion, ta thay từ khóa CREATE bằng ALTER

15. Trigger
Hiểu đơn giản thì Trigger là một Stored Procedure không có tham số. Trigger thực thi
một cách tự động khi một trong ba câu lệnh Insert, Update, Delete làm thay đổi dữ liệu

39
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

trên bảng có chứa trigger. Khi ta thực hiện câu lệnh được bắt bởi trigger (Insert, Update,
Delete) thì trước tiên nó sẽ đi vào bảng trong trigger rồi sau đó mới đi vào bảng ta đang
thực hiện.
Cú pháp:
CREATE TRIGGER tên_trigger ON tên_bảng
FOR {DELETE, INSERT, UPDATE}
AS
câu_lệnh_sql
Mục đích tạo ra trigger:
- Trigger thường được sử dụng để kiểm tra ràng buộc (check constraints) trên
nhiều quan hệ (nhiều bảng/table) hoặc trên nhiều dòng (nhiều record) của bảng.
- Để chương trình có những hàm chạy ngầm nhằm phục vụ những trường hợp
hữu hạn và thường không sử dụng cho mục đích kinh doanh hoặc giao dịch
Trong Trigger luôn tồn tại 2 bảng:
- Inserted: Bảng này chứa những bản ghi đã được Insert hoặc Update vào bảng,
Delete
- Deleted: Bảng này chứa những bản ghi đã được Delete khỏi bảng
Ví dụ:
CREATE TRIGGER TG_Test1 -- Tạo Trigger tên TG_Test1
ON dbo.TBLHuongdan -- Tạo Trigger của bảng TBLHuongdan
FOR DELETE -- Bắt sự kiện xóa bản ghi
AS
BEGIN
DECLARE @count INT
SELECT @count = COUNT(*) FROM Deleted AS D WHERE D.KetQua >5
IF (@count > 0)
BEGIN
PRINT 'Ket qua lon hon 5, khong duoc xoa'
ROLLBACK TRANSACTION -- Hủy bỏ thao tác
END
END

DELETE FROM dbo.TBLHuongDan


WHERE KetQua > 5
Kết quả:

40
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

16. Transaction
16.1 Giới thiệu
Transaction trong SQL là một nhóm các câu lệnh SQL. Nếu một transaction được thực
hiện thành công, tất cả các thay đổi dữ liệu được thực hiện trong transaction được lưu vào
cơ sở dữ liệu. Nếu một transaction bị lỗi và được rollback, thì tất cả các sửa đổi dữ liệu sẽ
bị xóa (dữ liệu được khôi phục về trạng thái trước khi thực hiện transaction).
Đặc điểm ACID:
- Atomicity (Bảo toàn): đảm bảo rằng tất cả các câu lệnh trong nhóm lệnh được
thực thi thành công. Nếu không, transaction bị hủy bỏ tại thời điểm thất bại và
tất cả các thao tác trước đó được khôi phục về trạng thái cũ.
- Consistency (Nhất quán): đảm bảo rằng cơ sở dữ liệu thay đổi chính xác các
trạng thái khi một transaction được thực thi thành công.
- Isolation (Độc lập) - cho phép các transaction hoạt động độc lập và minh bạch
với nhau.
- Durability (Bền bỉ) - đảm bảo rằng kết quả của một transaction được commit
vẫn tồn tại trong trường hợp lỗi hệ thống.

41
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Câu lệnh xử lý trong Transaction:


- COMMIT - để lưu các thay đổi.
- ROLLBACK - để khôi phục lại các thay đổi.
- SAVEPOINT - tạo ra các điểm trong transaction để ROLLBACK.
- SET TRANSACTION - thiết lập các thuộc tính cho transaction.
Lưu ý:
- Các lệnh điều khiển transaction chỉ được sử dụng với các lệnh thao tác dữ
liệu DML như - INSERT, UPDATE và DELETE.
- Chúng không thể được sử dụng trong lệnh CREATE TABLE hoặc DROP
TABLE vì các hoạt động này được tự động được commit trong cơ sở dữ liệu.
- Với Commit hoặc Rollback tức là ta đã kết thúc Transection đó.
Để bắt đầu sử dụng Transaction, ta sử dụng câu lệnh:
BEGIN TRANSACTION
Hoặc:
DECLARE @trans1 NVARCHAR(10)
SET @trans1 = 'trans1'
BEGIN TRANSACTION @trans1 --Đặt tên cho Transection

16.2 Commit
Lệnh COMMIT được sử dụng để lưu các thay đổi gọi bởi một transaction với cơ sở
dữ liệu.
Lệnh COMMIT lưu tất cả các transaction vào cơ sở dữ liệu kể từ khi lệnh COMMIT
hoặc ROLLBACK cuối cùng.
Cú pháp:
COMMIT;
Ví dụ:
DECLARE @trans1 NVARCHAR(10)
SET @trans1 = 'trans1'
BEGIN TRANSACTION @trans1
--Câu lệnh thực hiện
COMMIT TRANSACTION @trans1

16.3 Rollback

42
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

Lệnh ROLLBACK được sử dụng để hoàn tác các transaction chưa được lưu vào cơ
sở dữ liệu. Lệnh này chỉ có thể được sử dụng để hoàn tác các transaction kể từ khi lệnh
COMMIT hoặc ROLLBACK cuối cùng được phát hành.
Cú pháp:
ROLLBACK;

Ví dụ:
DECLARE @trans1 NVARCHAR(10)
SET @trans1 = 'trans1'
BEGIN TRANSACTION @trans1
--Câu lệnh thực hiện
ROLLBACK TRANSACTION @trans1 –- Hủy bỏ những câu lệnh bên trên

16.4 Savepoint
SAVEPOINT là một điểm trong một transaction khi bạn có thể cuộn transaction trở lại
một điểm nhất định mà không quay trở lại toàn bộ transaction.
Cú pháp:
SAVE TRANSACTION SavePoint_Name
Ví dụ:

BEGIN TRANSACTION
SAVE TRANSACTION trans2
--Nhóm câu lệnh thực hiện trans2
SAVE TRANSACTION trans3
--Nhóm câu lệnh thực hiện trans3
ROLLBACK TRANSACTION trans2
Giải thích: Ở câu lệnh ROLLBACK TRANSACTION, nếu là trans2 thì sẽ quay trở lại điểm
trans2, tức là những nhóm câu lệnh thực hiện trans2 và trans3 sẽ không được thực
hiện. Nếu là trans3 thì nhóm câu lệnh thực hiện trans2 sẽ được thực hiện và nhóm câu
lệnh thực hiện trans3 sẽ không được thực hiện.
16.5 Set Transaction
Lệnh SET TRANSACTION có thể được sử dụng để bắt đầu một transaction cơ sở dữ
liệu. Lệnh này được sử dụng để chỉ định các đặc tính cho transaction sau. Ví dụ, chỉ định
một transaction chỉ được đọc hoặc đọc viết.
Cú pháp:
SET TRANSACTION [ READ WRITE | READ ONLY ];

43
Đỗ Văn Thành – Thanh.dovan9998@gmai.com

17. N

44

You might also like