Trong lập trình cơ sở dữ liệu, có bốn hoạt động cơ bản: tạo , đọc , cập nhật và xóa - CRUD các hoạt động. Chúng là bước đầu tiên trong lập trình cơ sở dữ liệu.
Thuật ngữ CRUD xuất hiện lần đầu tiên trong cuốn sách ‘Quản lý môi trường cơ sở dữ liệu’ của James Martin. Kể từ đó, thuật ngữ này trở nên phổ biến. Trong bài viết này, chúng ta sẽ khám phá hoạt động CRUD về SQL Server vì cú pháp hoạt động có thể khác với các cơ sở dữ liệu quan hệ và NoSQL khác.
Chuẩn bị
Ý tưởng chính của cơ sở dữ liệu quan hệ là lưu trữ dữ liệu trong các bảng. Dữ liệu bảng có thể được đọc, chèn, xóa. Bằng cách này, các phép toán CRUD thao tác dữ liệu bảng.
C | C REATE | Chèn hàng / hàng vào bảng |
R | R EAD | Đọc (chọn) hàng / hàng từ bảng |
Ư | Ư PDATE | Chỉnh sửa hàng / hàng trong bảng |
Đ | Đ BỎ LỠ | Xóa hàng / hàng khỏi bảng |
Để minh họa các hoạt động CRUD, chúng ta cần một bảng dữ liệu. Hãy tạo một cái. Nó sẽ chỉ chứa ba cột. Cột đầu tiên sẽ lưu tên quốc gia, cột thứ hai sẽ lưu trữ lục địa của các quốc gia này và cột cuối cùng sẽ lưu trữ dân số của các quốc gia này. Chúng tôi có thể tạo bảng này với sự trợ giúp của câu lệnh T-SQL và đặt nó là TblCountry .
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL
)
Bây giờ, hãy để chúng tôi xem xét các hoạt động CRUD được thực hiện trên TblCountry bảng.
C - TẠO
Để thêm hàng mới vào bảng, chúng tôi sử dụng CHÈN VÀO yêu cầu. Trong lệnh này, chúng ta cần chỉ định tên của bảng đích và sẽ liệt kê các tên cột trong dấu ngoặc. Cấu trúc câu lệnh phải kết thúc bằng VALUES:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES ('Germany','Europe',8279000 )
Để thêm nhiều hàng vào bảng, chúng ta có thể sử dụng loại lệnh INSERT sau:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Lưu ý rằng VÀO từ khóa là tùy chọn và bạn không cần sử dụng từ khóa đó trong các câu lệnh chèn.
INSERT TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Ngoài ra, bạn có thể sử dụng định dạng sau để chèn nhiều hàng vào bảng:
INSERT INTO TblCountry
SELECT 'Germany','Europe',8279000
UNION ALL
SELECT 'Japan','Asia',126800000
UNION ALL
SELECT 'Moroco','Africa',35740000
Bây giờ, chúng ta sẽ sao chép dữ liệu trực tiếp từ bảng nguồn sang bảng đích. Phương thức này được gọi là CHÈN VÀO… CHỌN tuyên bố.
INSERT INTO… SELECT yêu cầu phải khớp các kiểu dữ liệu của bảng nguồn và bảng đích. Trong câu lệnh INSERT INTO… SELECT sau đây, chúng tôi sẽ chèn dữ liệu của SourceCountryTbl bảng vào TblCountry bảng.
Lúc đầu, chúng tôi chèn một số dữ liệu tổng hợp vào SourceCountryTbl bảng cho cuộc trình diễn này.
DROP TABLE IF EXISTS [SourceCountryTbl]
CREATE TABLE [dbo].[SourceCountryTbl]
(
[SourceCountryName] VARCHAR(50),
[SourceContinentNames] VARCHAR(50) NULL,
[SourceCountryPopulation] BIGINT NULL
)
INSERT INTO [SourceCountryTbl]
VALUES
('Ukraine','Europe',44009214 ) ,
('UK','Europe',66573504) ,
('France','Europe',65233271)
Bây giờ chúng ta sẽ thực hiện câu lệnh INSERT INTO… SELECT.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl
Câu lệnh chèn ở trên đã thêm tất cả SourceCountryTbl dữ liệu cho TblCountry bàn. Chúng tôi cũng có thể thêm WHERE mệnh đề để lọc câu lệnh select.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl WHERE TargetCountryName='UK'
SQL Server cho phép chúng ta sử dụng các biến bảng (các đối tượng giúp lưu trữ dữ liệu bảng tạm thời trong phạm vi cục bộ) với các câu lệnh INSERT INTO… SELECT. Trong phần minh họa sau, chúng tôi sẽ sử dụng biến bảng làm bảng nguồn:
DECLARE @SourceVarTable AS TABLE
([TargetCountryName] VARCHAR(50),
[TargetContinentNames] VARCHAR(50) NULL,
[TargetCountryPopulation] BIGINT NULL
)
INSERT INTO @SourceVarTable
VALUES
('Ukraine','Europe',44009214 ) ,
('UK','Europe',66573504) ,
('France','Europe',65233271)
INSERT INTO TblCountry
SELECT * FROM @SourceVarTable
Mẹo :Microsoft đã công bố một tính năng trong SQL Server 2016 là chèn song song . Tính năng này cho phép chúng tôi thực hiện các thao tác CHÈN trong các luồng song song.
Nếu bạn thêm TABLOCK gợi ý ở cuối câu lệnh chèn của bạn, SQL Server có thể chọn song song với kế hoạch thực thi xử lý theo mức độ song song tối đa của máy chủ của bạn hoặc ngưỡng chi phí cho các tham số song song.
Xử lý chèn song song cũng sẽ làm giảm thời gian thực hiện của câu lệnh chèn. Tuy nhiên, TABLOCK gợi ý sẽ có được khóa của bảng được chèn trong quá trình chèn. Để biết thêm thông tin về chèn song song, bạn có thể tham khảo CHÈN song song trong thế giới thực… CHỌN.
Một câu lệnh tiện dụng khác là CHỌN VÀO. Phương pháp này cho phép chúng ta sao chép dữ liệu từ một bảng vào một bảng mới được tạo. Trong câu lệnh sau, NewCountryTable không tồn tại trước khi thực hiện truy vấn. Truy vấn tạo bảng và chèn tất cả dữ liệu từ TblCountry bảng.
SELECT * INTO NewCountryTable
FROM TblCountry
Đồng thời, chúng ta có thể tạo một bảng mới cho các cột cụ thể của bảng nguồn.
Trong một số trường hợp, chúng ta cần trả về và sử dụng các giá trị được chèn từ câu lệnh INSERT. Kể từ SQL Server 2005, câu lệnh INSERT cho phép chúng tôi truy xuất các giá trị được đề cập từ câu lệnh INSERT.
Bây giờ, chúng tôi sẽ thả và tạo bảng thử nghiệm của chúng tôi và thêm một cột nhận dạng mới. Ngoài ra, chúng tôi sẽ thêm một ràng buộc mặc định cho cột này. Do đó, nếu chúng tôi không chèn bất kỳ giá trị rõ ràng nào vào cột này, cột này sẽ tự động tạo một giá trị mới.
Trong mẫu sau, chúng tôi sẽ khai báo một bảng có một cột và chèn đầu ra của SeqID giá trị cột của bảng này với sự trợ giúp của cột OUTPUT:
DROP TABLE IF EXISTS TblCountry
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL ,
SeqID uniqueidentifier default(newid())
)
DECLARE @OutputID AS TABLE(LogID uniqueidentifier)
INSERT TblCountry
(CountryName,ContinentNames,CountryPopulation)
OUTPUT INSERTED.SeqId INTO @OutputID
VALUES
('Germany','Europe',8279000 )
SELECT * FROM @OutPutId
R - Đọc
Đọc hoạt động lấy dữ liệu từ một bảng và trả về một tập hợp kết quả với các bản ghi của bảng. Trong trường hợp chúng ta muốn truy xuất dữ liệu từ nhiều bảng, chúng ta có thể sử dụng toán tử JOIN và tạo mối quan hệ logic giữa các bảng.
Câu lệnh SELECT đóng một vai trò chính duy nhất trong read hoạt động. Nó dựa trên ba thành phần:
- Cột - chúng tôi xác định các cột mà chúng tôi muốn truy xuất dữ liệu từ đó
- Bảng - chúng tôi chỉ định bảng mà chúng tôi muốn lấy dữ liệu từ đó
- Lọc - chúng tôi có thể lọc dữ liệu mà chúng tôi muốn đọc. Phần này là tùy chọn.
Dạng đơn giản nhất của câu lệnh select như sau:
SELECT column1, column2,...,columnN
FROM table_name
Bây giờ, chúng ta sẽ đi qua các ví dụ. Lúc đầu, chúng ta cần một bảng mẫu để đọc. Hãy để chúng tôi tạo ra nó:
DROP TABLE IF EXISTS TblCountry
GO
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL
)
GO
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Đọc tất cả các cột trong bảng
Toán tử dấu hoa thị (*) được sử dụng trong các câu lệnh SELECT vì nó trả về tất cả các cột trong bảng:
SELECT * FROM TblCountry
Mẹo :Toán tử dấu hoa thị (*) có thể ảnh hưởng tiêu cực đến hiệu suất vì nó gây ra nhiều lưu lượng mạng hơn và tiêu thụ nhiều tài nguyên hơn. Do đó, nếu bạn không cần lấy tất cả dữ liệu từ tất cả các cột được trả về, hãy tránh sử dụng dấu hoa thị (*) trong câu lệnh SELECT.
Đọc các cột cụ thể của bảng
Chúng tôi cũng có thể đọc các cột cụ thể của bảng. Hãy xem lại ví dụ sẽ chỉ trả về CountryName và CountryPopulation cột:
SELECT CountryName,CountryPopulation FROM TblCountry
Sử dụng bí danh trong các câu lệnh SELECT
Trong các câu lệnh SELECT, chúng ta có thể đặt tên tạm thời cho bảng hoặc các cột. Những tên tạm thời này là bí danh. Hãy viết lại hai truy vấn trước bằng bí danh bảng và cột.
Trong truy vấn sau, TblC bí danh sẽ chỉ định tên bảng:
SELECT TblC.* FROM TblCountry TblC
Trong ví dụ sau, chúng tôi sẽ cung cấp bí danh cho tên cột. Chúng tôi sẽ thay đổi CountryName tới CName và CountryPopulation - đến CPop .
SELECT TblC.CountryName AS [CName], CountryPopulation AS [CPop] FROM TblCountry TblC
Mục đích của bí danh là:
- Làm cho truy vấn dễ đọc hơn nếu tên bảng hoặc cột phức tạp.
- Đảm bảo sử dụng truy vấn cho bảng nhiều lần.
- Đơn giản hóa việc viết truy vấn nếu tên bảng hoặc cột dài.
Lọc câu lệnh SELECT
Câu lệnh SELECT cho phép chúng ta lọc các tập kết quả thông qua mệnh đề WHERE. Ví dụ:chúng tôi muốn lọc câu lệnh SELECT theo CountryName và chỉ trả về dữ liệu của Đức vào tập kết quả. Truy vấn sau sẽ thực hiện thao tác đọc với bộ lọc:
SELECT TblC.* FROM TblCountry TblC
WHERE TblC.CountryName='Germany'
Sắp xếp kết quả câu lệnh SELECT
Mệnh đề ORDER BY giúp chúng ta sắp xếp tập kết quả của câu lệnh SELECT theo cột hoặc các cột được chỉ định. Chúng tôi có thể thực hiện sắp xếp tăng dần hoặc giảm dần với sự trợ giúp của mệnh đề ORDER BY.
Chúng tôi sẽ sắp xếp TblCountry bảng theo dân số các quốc gia theo thứ tự tăng dần:
SELECT TblC.* FROM TblCountry TblC
ORDER BY TblC.CountryPopulation ASC
Mẹo :Bạn có thể sử dụng chỉ mục cột trong mệnh đề ORDER BY và số chỉ mục cột bắt đầu bằng 1.
Chúng tôi cũng có thể viết truy vấn trước đó. Số ba (3) biểu thị CounrtyPopulation cột :
SELECT TblC.* FROM TblCountry TblC
ORDER BY 3 ASC
U - Cập nhật
Câu lệnh UPDATE sửa đổi dữ liệu hiện có trong bảng. Câu lệnh này phải bao gồm mệnh đề SET để chúng ta có thể xác định cột mục tiêu để sửa đổi dữ liệu.
Truy vấn sau sẽ thay đổi tất cả các hàng của CounrtyPopulation giá trị cột thành 1.
UPDATE TblCountry SET CountryPopulation=1
GO
SELECT TblC.* FROM TblCountry TblC
Trong các câu lệnh CẬP NHẬT, chúng ta có thể sử dụng mệnh đề WHERE để sửa đổi một hàng cụ thể hoặc các hàng trong bảng.
Hãy thay đổi Nhật Bản hàng của CounrtyPopulation đến 245000:
UPDATE TblCountry SET CountryPopulation=245000
WHERE CountryName = 'Japan'
GO
SELECT TblC.* FROM TblCountry TblC
Câu lệnh UPDATE là sự kết hợp của câu lệnh xóa và chèn. Vì vậy, chúng ta có thể trả về các giá trị đã chèn và đã xóa thông qua mệnh đề OUTPUT.
Hãy làm một ví dụ:
UPDATE TblCountry SET CountryPopulation=22
OUTPUT inserted.CountryPopulation AS [Insertedvalue],
deleted.CountryPopulation AS [Deletedvalue]
WHERE CountryName = 'Germany'
Như bạn có thể thấy, chúng tôi đã sửa đổi CountryPopulation giá trị từ 1 đến 22. Sau đó, chúng ta có thể tìm ra các giá trị được chèn và xóa. Ngoài ra, chúng ta có thể chèn các giá trị này vào một biến bảng (một loại biến đặc biệt có thể được sử dụng như một bảng).
Chúng tôi sẽ chèn các giá trị đã chèn và đã xóa vào biến bảng:
DECLARE @LogTable TABLE(InsertValLog INT , DelValLog INT)
UPDATE TblCountry SET CountryPopulation=45
OUTPUT inserted.CountryPopulation ,
deleted.CountryPopulation INTO @LogTable
WHERE CountryName = 'Germany'
SELECT * FROM @LogTable
@@ ROWCOUNT là một biến hệ thống trả về số hàng bị ảnh hưởng trong câu lệnh cuối cùng. Do đó, chúng ta có thể sử dụng biến này để hiển thị một số hàng đã sửa đổi trong câu lệnh cập nhật.
Trong ví dụ sau, truy vấn cập nhật sẽ thay đổi 3 hàng và biến hệ thống @@ ROWCOUNT sẽ trả về 3.
UPDATE TblCountry SET CountryPopulation=1
SELECT @@ROWCOUNT AS [AffectedRowNumber]
D - Xóa
Câu lệnh Delete xóa hàng / hàng hiện có khỏi bảng.
Đầu tiên, hãy xem cách sử dụng mệnh đề WHERE trong các câu lệnh DELETE. Hầu hết thời gian chúng tôi muốn lọc các hàng đã xóa.
Ví dụ dưới đây minh họa cách xóa một hàng cụ thể:
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry WHERE CountryName='Japan'
SELECT TblC.* FROM TblCountry TblC
Mặc dù với câu lệnh DELETE, chúng ta có thể xóa tất cả các bản ghi khỏi bảng. Tuy nhiên, câu lệnh DELETE rất cơ bản và chúng tôi không sử dụng điều kiện WHERE.
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry
SELECT TblC.* FROM TblCountry TblC
Tuy nhiên, trong một số trường hợp của thiết kế cơ sở dữ liệu, câu lệnh DELETE không xóa hàng / hàng nếu nó vi phạm khóa ngoại hoặc các ràng buộc khác.
Ví dụ:trong AdventureWorks cơ sở dữ liệu, chúng tôi không thể xóa các hàng của Danh mục sản phẩm bảng vì ProductCategoryID được chỉ định làm khóa ngoại trong bảng đó.
Hãy để chúng tôi cố gắng xóa một hàng khỏi Danh mục sản phẩm bảng - chắc chắn, chúng tôi sẽ gặp phải lỗi sau:
DELETE FROM [Production].[ProductCategory]
WHERE ProductCategoryID=1
Kết luận
Như vậy, chúng ta đã khám phá các hoạt động CRUD trong SQL. Các câu lệnh INSERT, SELECT, UPDATE và DELETE là các hàm cơ bản của cơ sở dữ liệu SQL và bạn phải nắm vững chúng nếu muốn học lập trình cơ sở dữ liệu SQL. Lý thuyết CRUD có thể là một điểm khởi đầu tốt, và thực hành nhiều sẽ giúp bạn trở thành một chuyên gia.