Gợi ý cùng tìm hiểu các lệnh cơ bản thao tác với SQL

Các lệnh cơ bản thao tác với SQL

Chia sẻ kiến thức 11/12/2022

Nếu bạn đang học về SQL và muốn nhanh chóng nắm vững các lệnh cơ bản thao tác với SQL, thì đây là bài viết dành cho bạn.

Đây là bài chia sẻ, tổng hợp kiến thức về các lệnh cơ bản thao tác với SQL của bạn Phạm Tuấn Vũ – Học viên khóa Chứng chỉ Doanh nghiệp tại FUNiX

Phạm Tuấn Vũ nhập học FUNiX từ tháng 12/2021. Hàng ngày, Vũ dành khoảng 3- 5 tiếng để học lập trình online, chăm chỉ tìm tòi và nghiên cứu tài liệu, làm bài tập và từng bước chinh phục lộ trình khóa học. Khi gặp khó, nam học viên sẽ tìm đến hướng dẫn viên (tutor), các bạn đi trước hoặc mentor (cố vấn chuyên môn) tại FUNiX để nhận hỗ trợ.

Tháng 11/2022, học viên Phạm Tuấn Vũ được FUNiX hỗ trợ ứng tuyển và được nhận vào thực tập tại NCC Asia – một trong những công ty công nghệ có uy tín tại Hà Nội, thuộc mạng lưới đối tác doanh nghiệp của trường. Anh coi đây là bước khởi đầu thuận lợi để theo đuổi ước mơ từng dang dở và sẽ tiếp tục học tập nâng cao kiến thức, kỹ năng để phát triển sự nghiệp vững chắc.

 thao tác với SQL
SQL là viết tắt của Structured Query Language là ngôn ngữ truy vấn có cấu trúc. Cùng tìm hiểu thao tác với SQL nhé!

SQL là gì?

SQL là loại ngôn ngữ máy tính, giúp cho thao tác lưu trữ và truy xuất dữ liệu được lưu trữ trong một cơ sở dữ liệu quan hệ. SQL là viết tắt của Structured Query Language là ngôn ngữ truy vấn có cấu trúc.

Lệnh cơ bản thao tác với SQL

Mời bạn theo dõi các lệnh cơ bản thao tác với SQL dưới đây qua tổng hợp của học viên FUNiX Phạm Tuấn Vũ.

Chủ đề Thao tác Cú pháp Chú thích Ví Dụ
DB Operator Tạo csdl CREATE DATABASE dbname    
DB Operator Xóa csdl DROP DATABASE dbname    
CREATE Tạo bảng CREATE TABLE tb_name(
column1 datatype1,
column2,datatype2,
column3,datatype3
);
   
DROP Xóa bảng DROP TABLE tb_name    
DELETE Xóa dữ liệu trong bảng DELETE FROM tb_name WHERE condition    
ADD Thêm cột cho bảng ALTER TABLE tbname
ADD column_name datatype;
   
ALTER Thay đổi kiểu dữ liệu của cột ALTER TABLE tb_name
ALTER COLUMN column_name datatype;
   
DROP Xóa cột của bảng ALTER TABLE tb_name
DROP COLUMN column_name;
   
INSERT Chèn dữ liệu INSERT INTO table_name
VALUES (value1,value2,value3);
   
SELECT Lấy dữ liệu từ bảng SELECT col1,col2 FROM tb_name
SELECT * FROM tb_name
   
DROP Xóa ràng buộc ALTER TABLE tb_name
DROP CONSTRAINT constraint_name
   
Constraint Ràng buộc Not Null Khi tạo bảng:
CREATE TABLE tb_name(
column1 datatype NOT NULL
);
Khi chỉnh sửa :
ALTER TABLE tb_name
ALTER COLUMN column1 datatype NOT NULL;
Đảm bảo dữ liệu đưa vào không được trống hay khuyệt  
Constraint Ràng buộc Unique Khi tạo bảng:
CREATE TABLE tb_name(
column1 datatype UNIQUE
);
+Đánh tên constraint
CREATE TABLE tb_name(
column1 datatye,
CONSTRAINT uc_name UNIQUE (col1,col2)
);
Khi chỉnh sửa :
ALTER TABLE tb_name
ADD UNIQUE (col1);
-đánh tên
ALTER TABLE tb_name
ADD CONSTRAINT uc_name UNIQUE(col1,col2)
Đảm bảo dữ liệu một trường không được lặp lại trong các bản ghi của cùng một bảng  
Constraint Ràng buộc Default   Ràng buộc mặc định (default constraint) đảm bảo dữ liệu của một trường được gán giá trị mặc định trong trường hợp không được chỉ định khi chèn dữ liệu. –khởi tạo
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
City varchar(255) DEFAULT ‘Sandnes’

);
–thay đổi
ALTER TABLE Persons
ADD CONSTRAINT df_City
DEFAULT ‘Sandnes’ FOR City;
-xóa
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;

SELECT Tìm kiếm theo định dạng LIKE SELECT col1,col2 FROM tb_name
WHERE colN LIKE pattern
a%-bắt đầu bằng chữ cái a  
SELECT Tổng hợp và sắp xếp dữ liệu SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s)
   
SELECT Các tiêu chí trên dữ liệu tổng hợp-Nhóm theo group(GROUP BY_HAVING) SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
where kiêm tra dữ liệu trên từng bản ghi còn having kiểm tra điều kiện trên từng nhóm dữ liệu SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;
SELECT Duyệt bảng không trùng lặp SELECT DISTINCT col1,col2
FROM table_name
Đếm số bản ghi không trùng lặp :
SELECT COUNT(DISTINCT Country) FROM Customers;
Khi duyệt không cho phép các bản ghi bị trùng thuộc tính nào đó  
COMBINE DATA Truy vấn JOIN giữa 2 bảng Dạng 1:
SELECT column_names
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name
Dangj 2:
SELECT column_names
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
Dang 3:
SELECT column_names
FROM table1,table2
WHERE table1.column_name=table2.column_name;
Truy vấn dữ liệu giao nhau ở cùng một trường giữa 2 bảng
Trả về tất cả các bản ghi có giá trị khớp ở cả 2 bảng
 
COMBINE DATA LEFT(OUTER) JOIN SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name
Trả về tất cả các bản ghi từ bảng bên trái và các bản ghi khớp từ bảng bên phải,nếu không có bản ghi khớp thì đánh giá trị null  
COMBINE DATA RIGHT(OUTER) JOIN SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name
Trả về tất cả các bản ghi từ bảng bên phải,và các bản ghi khớp từ bảng bên trái,nếu không có bản ghi khớp thì đánh giá trị null  
COMBINE DATA FULL (OUTER) JOIN SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
WHERE condition;
Trẩ về tất cả các bản ghi có khớp hoặc không khớp từ cả 2 bảng
FULL OUTER JOIN=FULL JOIN
 
COMBINE DATA UNION SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2
Điều kiện kết hợp:
-Mỗi lệnh SELECT trong union phải có cùng số lượng trường
-Mọi cặp trường tương ứng từ hai bảng phải có cùng kiểu dữ liệu
Muốn lấy được cả bản ghi bị trùng lặp thì dùng UNION ALL
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2
Kết hợp tổng hợp kết quả từ 2 lệnh SELECT.
Kết hợp theo hàng chứ không phải theo cột giống FULL JOIN
Kết quả nhận được sẽ là distinct (riêng biệt)
 
COMBINE DATA INTERECT   Trả về các bản ghi giao giữa 2 tập kết quả (SELECT)
COMBINE DATA EXCEPT   Chỉ trả về kết quả là các bản ghi xuất hiện ở tập kết quả đầu tiên chứ không xuất hiện ở tập kết quả thứ 2
SELECT CASE CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN condition3 THEN result3
ELSE result
END;
  SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN ‘The quantity is greater than 30’
WHEN Quantity = 30 THEN ‘The quantity is 30’
ELSE ‘The quantity is under 30’
END AS QuantityText
FROM OrderDetails;
COMBINE DATA Tổng hợp dữ liệu và chuyển đổi sang cột (PIVOT) SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,

[last pivoted column] AS <column name>
FROM
(<SELECT query that produces the data>)
AS <alias for the source query>
PIVOT
(
<aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
… [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;
  use VuPT12DB
select ‘totlalStudent’ as totalStudent,[NinhBinh],[HaNoi],[HaGiang] from (
select id ,country
from student
) as sourcetb
pivot (
count(id)
FOR country IN ([HaNoi],[NinhBinh],[HaGiang])
) as pivottb
RANKING Xếp hạng dữ liệu của bảng SELECT RANK() OVER (ORDER BY column ASC/DSC) AS name,column1,column2,…
FROM table_name
-Đặc điểm : đánh dấu từ 1,các cột có dữ liệu trùng sẽ có cùng rank và cột sau đó sẽ nhảy lên 1 đơn vị rank,vd 1 22 4 select rank() over(ORDER BY country asc) as xep_hang_tp ,id,country from student;
RANKING Đánh số các bản ghi (ROW_NUMBER) SELECT ROW_NUMBER () OVER
(ORDER BY column_name asc/dsc) AS name,column1,column2,..
FROM table_name
Xếp hạng tập kết quả bắt đầu từ 1,không quan tâm các giá trị bị trùng lặp select ROW_NUMBER() over (order by id asc) as ds ,id ,name,country from student;
RANKING Xếp hạng dữ liệu của bảng SELECT DENSE_RANK()
OVER(ORDER BY Tên_cột asc/desc) AS Bí_danh, Các_cột
FROM Tên_bảng;
Xếp hạng các giá trị của một cột theo quy tắc các giá trị giống nhau theo cùng 1 hạng ,các hàng nằm sau sẽ có giá trị lớn hơn 1 .
vd 1 22 3 4 5
 
RANKING Phân nhóm và đánh số hàng SELECT ROW_NUMBER () OVER
(PARTITION BY column_1 ORDER BY column_2 asc/dsc) AS name,colum3,column4,…
FROM table_name
-Xếp các bản ghi theo nhóm (partittion by) bởi thuộc tính chỉ định ,và đánh số chúng ,bắt đầu phân vùng mới thì đánh số từ 1 select row_number() over (partition by country order by id asc) row_no,id,name,country from student
row_no /id/name/country
1 6 ha HaGiang
1 1 vu HaNoi
2 4 nga HaNoi
1 2 tuan NinhBinh
2 3 hoang NinhBinh
3 7 vinh NinhBinh
SELECT Truy vấn con (sub querry) Dạng cơ bản :
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, …);
Dạng truy vấn con :
SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);
-Truy vấn con là cơ chế lồng các lệnh select
-Tập giá trị cho toán tử IN là động
-Câu lệnh select thứ 2 được gọi là câu lệnh truy vấn con ,nó phải trả về duy nhất một cột tương ứng với cột column_name
-Truy vấn không trong select con là NOT IN
SELECT *
FROM tblTransaction as T
WHERE EmployeeNumber IN (
SELECT EmployeeNumber FROM tblEmployee WHERE EmployeeLastName LIKE ‘y%’);
SELECT Lựa chọn trong khoảng (BETWEEN) SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
   
SELECT Truy vấn với toán tử con (ANY,ALL) SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name
FROM table_name
WHERE condition);
;=, <>, !=, >, >=, <, or <=  
SELECT Truy vấn con trong mệnh đề from SELECT *
FROM (bảng tổng hợp từ truy vấn)
SELECT *

FROM tblTransaction as T

LEFT JOIN (SELECT * FROM tblEmployee WHERE EmployeeLastName LIKE ‘y%’) as E

ON E.EmployeeNumber = T.EmployeeNumber

 
SELECT Truy vấn con trong mệnh đề select   SELECT *,
(SELECT COUNT(T.EmployeeNumber) as NumTransaction FROM tblTransaction as T)

FROM tblEmployee as E

WHERE E.EmployeeLastName LIKE ‘y%’

sẽ dùng truy vấn con trong mệnh đề SELECT để tạo ra một cột mới là NumTransaction. Subquery này chỉ trả về kết quả là 1 bản ghi với một cột và với mỗi bản ghi kết quả, sub query đó sẽ được thực hiện lại một lần.
ANALYS DATA Tính số lượng bản ghi (COUNT) SELECT COUNT(column_name)
FROM table_name
WHERE condition;
SELECT COUNT(id)
FROM student
 
ANALYS DATA Tính tổng (SUM) SELECT SUM(column_name)
FROM table_name
WHERE condition;
   
ANALYS DATA Tính trung bình (AVERAGE) SELECT AVG(column_name)
FROM table_name
WHERE condition;
   
SELECT Kiểm tra xem trường có rỗng hay không (ISNULL) SELECT column_names
FROM table_name
WHERE column_name IS NULL;
SELECT column_names
FROM table_name
WHERE column_name IS NOT NULL;
   
UPDATE Cập nhật dữ liệu cho bảng UPDATE table_name
SET column1 = value1, column2 = value2, …
WHERE condition;
  UPDATE Customers
SET ContactName = ‘Alfred Schmidt’, City= ‘Frankfurt’
WHERE CustomerID = 1;
SELECT Select top SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;
-Chỉ rõ số lượng bản ghi trả về
-Hữu dụng trong những bảng dữ liệu lớn
SELECT TOP 3 * FROM Customers;
PROCEDURE Thủ tục lưu trữ (Stored Procedure) CREATE PROCEDURE produce_name
AS
sql_statement
GO;
— Thực thi
EXEC procedure_name;
-Stored Procedure (SP) là các đoạn SQL được định nghĩa trước và thường được goi ra để chạy đi chạy lại nhiều lần
-Create proc
-Ưu điểm của stored procedure
+Giúp tăng hiệu năng của csdl nhờ cơ chế biên dịch 1 lần sử dụng nhiều lần
+Giúp tăng tính bảo mật cho csdl vì cấu trúc của csdl được giấu kín
+Hạn chế sql injection
Create procedure selectAllCustomers
AS
SELECT * from Customers
GO;
Exec selectAllCustomers;
PROCEDURE Truyền tham số cho Stored Procedure CREATE PROCEDURE produce_name @param1 type .@param2 type,..
AS
sql_statement
GO;
— Thực thi
EXEC procedure_name @param1=’value1′,@param2=’value2′;
  CREATE PROCEDURE SelectAllCustomers @City nvarchar(30), @PostalCode nvarchar(10)
AS
SELECT * FROM Customers WHERE City = @City AND PostalCode = @PostalCode
GO;

EXEC SelectAllCustomers @City = ‘London’, @PostalCode = ‘WA1 1DP’;

PROCEDURE Lệnh IF trong Stored Procedure IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
-dùng cấu trúc lệnh phân nhánh if-else để đưa ra các phương án xử lý khác nhau,tương ứng với các giá trị tham số truyền vào CREATE PROC NameEmployees(@EmployeeNumber int) AS
BEGIN
IF exists(SELECT * FROM tbmlEmployee WHERE EmployeeNumber = @EmployeeNumber)
BEGIN
SELECT EmployeeNumber, EmployeeFirstName, EmployeeLastName
FROM tbmlEmployee
WHERE EmployeeNumber = @EmployeeNumber
END
END
GO
PROCEDURE BEGIN-END Statement BEGIN
{ sql_statement | statement_block}
END
-Dùng để khởi tạo một statement block
-Một statement block gồm có tập hợp các lệnh sql statement được thực thi cùng nhau
-Một statement block cũng được coi như batch
BEGIN
SELECT product_id,product_name
FROM production.products
WHERE list_price >100000;
IF @@ROWCOUNT=0
PRINT ‘No product with price greater than 100000 found’
END
PROCEDURE Nesting BEGIN-END   -The statement block can be nested .It simply means that you can placce a begin-end statement within another begin.end statement như ví dụ lệnh if trong procedure
PROCEDURE Vòng lặp while trong Stored Procedure     DECLARE @cnt INT = 0;
WHILE @cnt < cnt_total
BEGIN
{…statements…}
SET @cnt = @cnt + 1;
END;
PROCEDURE Câu lệnh RETURN trong Stored Procedure     — khởi tạo
CREATE PROCEDURE spGetTotalCountOfEmployee2
AS
BEGIN
RETURN (SELECT COUNT(ID) FROM Employee)
END
— thực thi
DECLARE @EmployeeTotal INT
EXECUTE @EmployeeTotal = spGetTotalCountOfEmployee2
PRINT @EmployeeTotal
FUNCTION Giới thiệu về hàm (function) https://www.w3schools.com/sql/sql_ref_sqlserver.asp

CREATE FUNCTION function_name (parameter_list)
RETURNS data_type AS
BEGIN
statements
RETURN value
END

-Hàm là một đối tượng trong cơ sở dữ liệu ,nó chứa một tập nhiều câu lệnh được nhóm lại với nhau và được tạo ra với mục đích sử dụng lại
-Ngoài những function có sẵn,sql cho phép người dùng tự định nghĩa thêm các function mới cho csdl của mình.Loại function này là UDF(User defined function)
-Function trong sql server chia làm 2 loại .
+Hàm tiền định (deterministic functions): hàm trả về cùng một giá trị ở mỗi lần gọi nếu truyền cùng giá trị tham số. Ví dụ các hàm toán học SQUARE(), Power(), Sum(), AVG(), vàCount().
+Hàm phi tiền định (non-deterministic functions): hàm trả về giá trị khác nhau ở mỗi lần gọi dù truyền cùng giá trị tham số. Ví dụ các hàm xử lý ngày tháng như GetDate(), mỗi lần sẽ trả lại thông tin ngày hiện tại khác nhau.
CREATE FUNCTION sales.udfNetSale(
@quantity INT,
@list_price DEC(10,2),
@discount DEC(4,2)
)
RETURNS DEC(10,2)
AS
BEGIN
RETURN @quantity * @list_price * (1 – @discount);
END;
FUNCTION Hàm vô hướng (scalar function) CREATE FUNCTION function_name (parameter_list)
RETURNS data_type AS
BEGIN
statements
RETURN value
END
https://www.sqlservertutorial.net/sql-server-user-defined-functions/sql-server-scalar-functions/
-Trong SQL Server, loại hàm Scalar Function được hiểu là hàm nhận một hay nhiều tham số và phải trả về giá trị bằng lệnh RETURN. — khởi tạo
CREATE FUNCTION sales.udfNetSale(
@quantity INT,
@list_price DEC(10,2),
@discount DEC(4,2)
)
RETURNS DEC(10,2)
AS
BEGIN
RETURN @quantity * @list_price * (1 – @discount);
END;
–thực thi
SELECT sales.udfNetSale(10,100,0.1) net_sale;
select [dbo].fc_cau1(‘VT01’)
FUNCTION Hàm table (Inline Table Function)   -Nội dung bên trong các hàm này, chỉ cho phép thực hiện câu lệnh SELECT.
Trong trường hợp này, các Inline Table Function có vai trò gần giống với View.
CREATE FUNCTION [dbo].[udfGetProductList] (@SafetyStockLevel SMALLINT)
RETURNS TABLE
AS
RETURN
(SELECT Product.ProductID,
Product.Name,
Product.ProductNumber
FROM Production.Product
WHERE SafetyStockLevel >= @SafetyStockLevel)
SELECT *
FROM dbo.udfGetProductList( 100 )
Constraint Ràng buộc check   Ràng buộc kiểm tra (check constraint) đảm bảo tính hợp lệ của dữ liệu được đưa vào. –khởi tạo
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int CHECK (Age>=18)
);

–thay đổi
ALTER TABLE Persons
ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND City=’Sandnes’);
–Xóa
ALTER TABLE Persons
DROP CONSTRAINT CHK_PersonAge;

Constraint Ràng buộc khóa chính   Ràng buộc khoá chính (primary key constraint) đảm bảo giá trị dữ liệu của một trường là duy nhất và không được null, dùng làm định danh cho bản ghi trong bảng. –khởi tạo
CREATE TABLE Persons (
ID int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
— khởi tạo với nhiều khóa chính
CREATE TABLE Persons (
ID int,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY(ID, LastName)
);
–thay đổi
ALTER TABLE abc
ADD PRIMARY KEY (column(s))
— thay đổi
ALTER TABLE Persons
ADD CONSTRAINT PK_Person PRIMARY KEY (ID,LastName);
–xóa
ALTER TABLE Persons
DROP CONSTRAINT PK_Person;
Constraint Ràng buộc khóa ngoại (foreign key)   Ràng buộc khoá ngoại (foreign key constraint) đảm bảo mối liên kết với một bản ghi trong bảng khác, giá trị của trường khoá ngoại phải tương ứng với giá trị một trường khoá chính ở bảng khác. — khởi tạo
CREATE TABLE Orders (
OrderID int NOT NULL PRIMARY KEY,
OrderNumber int NOT NULL,
PersonID int FOREIGN KEY REFERENCES Persons(PersonID)

);
— thay đổi
ALTER TABLE Orders
ADD CONSTRAINT FK_PersonOrder
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
— xóa
ALTER TABLE Orders
DROP CONSTRAINT FK_PersonOrder;

INDEX Đánh chỉ mục Clustered index(Btree) CREATE CLUSTERED INDEX idx_tblEmployee
ON [dbo].[tblEmployee]([EmployeeNumber])
Khi tạo cột là Primary key thì một clustered index sẽ tự động được tạo cho cột đó.
Lưu ý mỗi bảng chỉ có thể tạo được 1 clustered index
Trong tình huống cần tạo index cho các cột khác nữa thì cần phải sử dụng non-clustered index.
 
INDEX Đánh chỉ mục Non Clustered index CREATE NONCLUSTERED INDEX idx_tblEmployee_DateOfBirth
ON [dbo].[tblEmployee].([DateOfBirth])
Như bạn đã biết, hình thức non-clustered index sẽ tạo ra một bảng index riêng độc lập với bảng dữ liệu, dữ liệu của bảng không phải sắp xếp lại một cách vật lý mỗi khi có sự thay đổi dữ liệu.  
TRANSACTION Định nghĩa transaction   Transaction (giao dịch) là cơ chế trong SQL Server giúp đảm bảo thực hiện nhiều hành động (có thể hiểu là nhiều lệnh SQL) như thể 1 hành động duy nhất. Và 1 transaction chỉ được coi thực hiện thành công khi tất cả các hành động bên trong phải thực hiện thành công. Trường hợp khi có bất cứ một hành động bên trong vì lý do nào đó không thực hiện thành công, thì mọi hành động trước đó phải khôi phục lại trạng thái dữ liệu cũ (hành động rollback).
-Transaction là công cụ quan trọng giúp đảm bảo tính toàn vẹn của CSDL.
 
TRANSACTION Phân loại transaction   Có 4 chế độ transaction trong sql server
-Autocomit transaction :giao dịch tự hoàn thành
-Implicit transation :giao dịch ngầm định
-Explicit transation :giao dịch tường minh
-Batch-scoped transaction:giao dịch trong phạm vi lô
 
TRANSACTION Autocomit transaction (giao dịch tự hoàn thành)   Giao dịch tự hoàn thành sẽ tự động thực hiện các giao dịch mà không cần có lệnh COMMIT (để xác nhận thành công) hoặc ROLLBACK (để xác nhận thất bại).  
TRANSACTION Implicit transation(giao dịch ngầm định)   Giao dịch ngầm định là loại giao dịch được thực hiện tự động khi giao dịch trước đó hoàn thành. Tuy nhiên mỗi giao dịch cần được hoàn thành một cách tường minh bằng lệnh COMMIT hoặc ROLLBACK.  
TRANSACTION Explicit transaction(giao dịch tường minh) BEGIN TRANSACTION

SELECT * FROM [dbo].[tblEmployee]

UPDATE [dbo].[tblEmployee] SET EmployeeNumber = 122WHERE EmployeeNumber = 123

COMMIT TRANSACTION

Giao dịch tường minh (explicit transaction) là loại giao dịch cần phải được người dùng chỉ rõ mốc bắt đầu (BEGIN TRANSACTION) và mốc kết thúc (COMMIT hoặc ROLLBACK).  
TRANSACTION Đánh dấu transaction WITH MARK BEGIN TRANSACTION MyTransaction WITH MARK

SELECT * FROM [dbo].[tblEmployee]

UPDATE [dbo].[tblEmployee] SET EmployeeNumber = 122 WHERE EmployeeNumber = 123

COMMIT TRANSACTION MyTransaction

Với mệnh đề tùy chọn WITH MARK giúp cho tên của giao dịch sẽ được ghi nhận trong nhật ký (log) giao dịch. Khi khôi phục một CSDL về trạng thái trước đó, giao dịch được đánh dấu có thể được sử dụng kèm với ngày giờ.  
TRANSACTION Kiểm tra số lượng giao dịch đã sảy ra trong kết nối csdl hiện tại @@transcount    
DELETE Foreign Key với Cascade Delete trong SQL Server CREATE TABLE hangtonkho
( id_hangtonkho INT PRIMARY KEY,
id_sanpham INT NOT NULL,
soluong INT,
luong_toithieu INT,
luong_toida INT,
CONSTRAINT fk_htk_id_sanpham
FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
ON DELETE CASCADE
);
ALTER TABLE bang_con
ADD CONSTRAINT fk_ten
FOREIGN KEY (cot_con1, cot_con2, … cot_con_n)
REFERENCES bang_me (cot_me1, cot_me2, … cot_me_n)
ON DELETE CASCADE;
   
TRIGGER Định nghĩa về trigger CREATE TRIGGER [schema_name.]trigger_name
ON table_name
AFTER {[INSERT],[UPDATE],[DELETE]}
AS
{sql_statements}
Trigger là công cụ được cung cấp bởi hệ quản trị CSDL SQL Server nhằm tạo ra khả năng tự động thực hiện một hành động khi có một sự thay đổi nhất định trên CSDL.
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.
Mỗi bảng thường sẽ có 3 thao tác làm thay đổi dữ liệu đó là: UPDATE, INSERT, DELETE. Và đôi khi mỗi hành động như vậy ta sẽ có những ràng buộc trên bảng để giúp bảo toàn dữ liệu, lúc này sử dụng trigger là một giải pháp tốt cho các lệnh thao tác dữ liệu DML.
CREATE TRIGGER tr_tblDepartment
ON dbo.tblDepartment
AFTER DELETE, INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
END
TRIGGER Phân loại trigger -After trigger
-Instead of trigger
   
TRIGGER After trigger For trigger Đây là loại Trigger được gọi tự động SAU KHI hành động thay đổi dữ liệu trong CSDL (insert, update hoặc delete dữ liệu) thực hiện xong.
SQL cung cấp 2 bảng tạm để sử dụng trigger
-Bảng inserted chứa các bản ghi được thêm vào bảng
-Bảng deleted chứa các bản ghi bị xóa khỏi bảng
CREATE TRIGGER trg_DatHang ON tbl_DatHang
AFTER INSERT AS
BEGIN
UPDATE tbl_KhoHang
SET SoLuongTon = SoLuongTon – (
SELECT SoLuongDat
FROM inserted
WHERE MaHang = tbl_KhoHang.MaHang
)
FROM tbl_KhoHang
JOIN inserted ON tbl_KhoHang.MaHang = inserted.MaHang
END
TRIGGER Instead of trigger   Trigger được gọi thực thi THAY VÌ thực hiện thay đổi (Insert, delete, update) dữ liệu trong CSDL. Tức là hành động thay đổi CSDL bị bỏ qua, không thực hiện, thay vào đó là thực hiện luôn đoạn lệnh của Trigger.  

Phạm Tuấn Vũ

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, Q. Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        
Chat Button
FUNiX V2 GenAI Chatbot ×

yêu cầu gọi lại