Các lệnh cơ bản thao tác với SQL
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.
- Một số thay đổi trong môn học Các hệ cơ sở dữ liệu (phiên bản nâng cấp)
- 6 bước để trở thành một back-end developer thành công
Table of Contents
Đâ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.
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’ ); |
|
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) |
-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 |
|
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) ); |
|
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ũ
Bình luận (0
)