Professional Documents
Culture Documents
SQL
SQL
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
3
Đỗ Văn Thành – Thanh.dovan9998@gmai.com
4
Đỗ Văn Thành – Thanh.dovan9998@gmai.com
5
Đỗ Văn Thành – Thanh.dovan9998@gmai.com
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
datetime
(YYYY-MM-DD hh:mm:ss)
smalldatetime
date (Lưu ngày, tháng,
năm)
(YYYY-MM-DD)
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
8
Đỗ Văn Thành – Thanh.dovan9998@gmai.com
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
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,
);
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;
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;
Đổ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';
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];
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]
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
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.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
12. N
19
Đỗ Văn Thành – Thanh.dovan9998@gmai.com
20
Đỗ Văn Thành – Thanh.dovan9998@gmai.com
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
)
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
gì
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
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;
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;
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]
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,…
)
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’
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.
END
ELSE
BEGIN
[Nhóm câu lệnh]
END
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
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
Muốn chỉnh sửa Store Procedure, ta thay từ khóa CREATE bằng ALTER
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
(@nhanvien_id INT)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @nhanvien_name VARCHAR(50);
IF @nhanvien_id < 10
SET @nhanvien_name = 'Smith';
ELSE
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
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
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