Khám Phá 5 Kỹ Năng SQL Cần Thiết Cho Người Quản Lý Dữ Liệu
Bài viết này sẽ điểm qua năm kỹ năng SQL quan trọng mà bạn cần nắm vững để nâng cao khả năng quản lý cơ sở dữ liệu và thao tác với dữ liệu một cách hiệu quả. Hãy cùng tìm hiểu từng kỹ năng một cách chi tiết, kèm theo ví dụ minh họa thực tế.
Giới Thiệu Về Cơ Sở Dữ Liệu
Trong bài viết này, chúng ta sẽ sử dụng một vài bảng dữ liệu mẫu bao gồm Khách Hàng, Sản Phẩm, Đơn Hàng và Chi Tiết Đơn Hàng. Bạn có thể sử dụng đoạn mã SQL dưới đây để thiết lập các bảng và dữ liệu ban đầu.
sql
-- Khởi tạo bảng Khách Hàng
CREATE TABLE Customers (
CustomerUID UNIQUEIDENTIFIER DEFAULT (NEWID()) NOT NULL,
CustomerNumber BIGINT IDENTITY(1,1) NOT NULL,
LastName NVARCHAR(100) NOT NULL,
FirstName NVARCHAR(100) NOT NULL,
DOB DATE NOT NULL,
IsDeleted BIT NOT NULL DEFAULT 0,
CreateBy NVARCHAR(100) NOT NULL DEFAULT 'SYSTEM',
CreateDate DATETIME NOT NULL DEFAULT GETDATE(),
ModifyBy NVARCHAR(100) NOT NULL DEFAULT 'SYSTEM',
ModifyDate DATETIME NOT NULL DEFAULT GETDATE(),
CHECK (YEAR(DOB) >= 1900),
PRIMARY KEY (CustomerUID)
);
-- Khởi tạo bảng Sản Phẩm
CREATE TABLE Products (
ProductUID UNIQUEIDENTIFIER DEFAULT (NEWID()) NOT NULL,
ProductName NVARCHAR(1000) NOT NULL,
ProductCode NVARCHAR(1000) NOT NULL,
AvailableQuantity INT NOT NULL,
IsDeleted BIT NOT NULL DEFAULT 0,
CreateBy NVARCHAR(100) NOT NULL DEFAULT 'SYSTEM',
CreateDate DATETIME NOT NULL DEFAULT GETDATE(),
ModifyBy NVARCHAR(100) NOT NULL DEFAULT 'SYSTEM',
ModifyDate DATETIME NOT NULL DEFAULT GETDATE(),
CHECK (AvailableQuantity >= 0),
PRIMARY KEY (ProductUID)
);
-- Khởi tạo bảng Đơn Hàng
CREATE TABLE Orders (
OrderUID UNIQUEIDENTIFIER DEFAULT (NEWID()) NOT NULL,
CustomerUID UNIQUEIDENTIFIER,
OrderNumber NVARCHAR(1000) NOT NULL,
OrderDate DATETIME NOT NULL,
IsDeleted BIT NOT NULL DEFAULT 0,
CreateBy NVARCHAR(100) NOT NULL DEFAULT 'SYSTEM',
CreateDate DATETIME NOT NULL DEFAULT GETDATE(),
ModifyBy NVARCHAR(100) NOT NULL DEFAULT 'SYSTEM',
ModifyDate DATETIME NOT NULL DEFAULT GETDATE(),
PRIMARY KEY (OrderUID),
FOREIGN KEY (CustomerUID) REFERENCES Customers(CustomerUID)
);
-- Khởi tạo bảng Chi Tiết Đơn Hàng
CREATE TABLE OrderItems (
OrderItemUID UNIQUEIDENTIFIER DEFAULT (NEWID()) NOT NULL,
OrderUID UNIQUEIDENTIFIER,
ProductUID UNIQUEIDENTIFIER,
Quantity INT NOT NULL,
IsDeleted BIT NOT NULL DEFAULT 0,
CreateBy NVARCHAR(100) NOT NULL DEFAULT 'SYSTEM',
CreateDate DATETIME NOT NULL DEFAULT GETDATE(),
ModifyBy NVARCHAR(100) NOT NULL DEFAULT 'SYSTEM',
ModifyDate DATETIME NOT NULL DEFAULT GETDATE(),
PRIMARY KEY (OrderItemUID),
FOREIGN KEY (OrderUID) REFERENCES Orders(OrderUID),
FOREIGN KEY (ProductUID) REFERENCES Products(ProductUID)
);
-- Thêm Khách Hàng
INSERT INTO Customers (LastName, FirstName, DOB) VALUES
('Au Yeung', 'David', '1980-12-31'),
('Chan', 'Peter', '1982-01-15');
-- Thêm Sản Phẩm
INSERT INTO Products (ProductName, ProductCode, AvailableQuantity) VALUES
('Android Phone', 'A0001', 100),
('iPhone', 'I0001', 100);
-- Thêm Đơn Hàng
INSERT INTO Orders (CustomerUID, OrderNumber, OrderDate) VALUES
((SELECT TOP 1 CustomerUID FROM Customers WHERE FirstName = 'David' AND IsDeleted = 0), 'ORD0001', GETDATE());
INSERT INTO OrderItems (OrderUID, ProductUID, Quantity) VALUES
((SELECT TOP 1 OrderUID FROM Orders WHERE OrderNumber = 'ORD0001' AND IsDeleted = 0), (SELECT TOP 1 ProductUID FROM Products WHERE ProductCode = 'I0001' AND IsDeleted = 0), 10);
-- Lấy dữ liệu từ các bảng
SELECT * FROM Customers;
SELECT * FROM Products;
SELECT * FROM Orders;
SELECT * FROM OrderItems;
Kỹ Năng 1: Sử Dụng LEFT JOIN Để Tìm Kiếm Khách Hàng Chưa Đặt Hàng
Một trong những nhiệm vụ phổ biến là xác định những khách hàng chưa có bất kỳ đơn hàng nào. Bạn có thể thực hiện điều này bằng cách sử dụng LEFT JOIN và kiểm tra giá trị NULL. Ví dụ:
sql
SELECT c.*
FROM Customers c
LEFT JOIN Orders o ON o.CustomerUID = c.CustomerUID AND o.IsDeleted = 0
WHERE o.OrderUID IS NULL;
Câu truy vấn này sẽ trả về danh sách tất cả khách hàng không có đơn hàng, giúp bạn nhắm đến họ cho các kế hoạch tiếp thị.
Kỹ Năng 2: Ngăn Chặn Trùng Lặp Với NOT EXISTS
Trong quá trình chèn dữ liệu mới, việc bảo đảm không có bản ghi trùng lặp là rất quan trọng. Bạn có thể sử dụng NOT EXISTS để thực hiện điều này:
sql
IF NOT EXISTS (SELECT 1 FROM Products WHERE ProductName = 'iPhone')
INSERT INTO Products (ProductName, ProductCode) VALUES ('iPhone', 'I0001')
ELSE
PRINT 'Tên sản phẩm đã tồn tại!';
Câu truy vấn này sẽ kiểm tra sự tồn tại của sản phẩm trước khi chèn, giúp duy trì tính toàn vẹn của dữ liệu.
Kỹ Năng 3: Tăng Cường Khả Năng Đọc Với Bảng Tạm Thời
Việc sử dụng bảng tạm thời có thể làm cho các truy vấn phức tạp trở nên dễ đọc hơn. Ví dụ:
sql
SELECT ProductUID
INTO #BestSeller
FROM OrderItems
WHERE IsDeleted = 0
GROUP BY ProductUID
HAVING SUM(Quantity) > 5;
SELECT * FROM Products WHERE ProductUID IN (SELECT * FROM #BestSeller);
DROP TABLE IF EXISTS #BestSeller;
Nhờ sử dụng bảng tạm thời, bạn có thể cải thiện khả năng đọc mã SQL của mình nhiều hơn.
Kỹ Năng 4: Sử Dụng Biểu Thức Bảng Chung (CTE) Cho Các Truy Vấn Tuần Tự
CTE giúp đơn giản hóa cấu trúc của các truy vấn tuần tự hoặc phân cấp:
sql
;WITH cte AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY CustomerUID ORDER BY CreateDate DESC) AS rn
FROM Orders
)
SELECT *
FROM cte
WHERE rn = 1;
Với CTE, bạn có thể dễ dàng lấy được đơn hàng mới nhất cho mỗi khách hàng, giúp cho truy vấn trở nên rõ ràng hơn.
Kỹ Năng 5: Sử Dụng Giao Dịch Để Đảm Bảo Tính Toàn Vẹn Dữ Liệu
Khi thực hiện các cập nhật có quy mô lớn, việc sử dụng giao dịch là rất cần thiết để đảm bảo tính toàn vẹn dữ liệu:
sql
BEGIN TRAN;
UPDATE Products
SET AvailableQuantity = 0
WHERE ProductCode = 'I0001'
AND IsDeleted = 0;
-- Kiểm tra kết quả trước khi COMMIT
SELECT * FROM Products WHERE ProductCode = 'I0001';
-- Bỏ comment để commit hoặc rollback
-- COMMIT;
-- ROLLBACK;
Giao dịch giúp bạn đảm bảo rằng các thay đổi chỉ được thực hiện nếu bạn thực sự hài lòng với kết quả, tránh được những rắc rối không đáng có.
Kết Luận
Năm kỹ năng này — sử dụng LEFT JOIN, ngăn chặn trùng lặp với NOT EXISTS, cải thiện khả năng đọc truy vấn với bảng tạm, sử dụng CTE cho truy vấn phức tạp và đảm bảo tính toàn vẹn dữ liệu với giao dịch — là những kỹ năng cần thiết cho những ai làm việc với SQL. Việc làm chủ các kỹ thuật này không chỉ giúp nâng cao hiệu quả quản lý cơ sở dữ liệu mà còn tăng cường độ tin cậy và chính xác trong công việc của bạn.
Cảm ơn bạn đã theo dõi!
source: viblo