0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

5 Kỹ Năng SQL Quan Trọng Đúc Kết Từ Một Thập Kỷ Kinh Nghiệm Quản Lý Dữ Liệu

Đăng vào 3 tháng trước

• 8 phút đọc

Chủ đề:

Development

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 Copy
-- 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 Copy
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 Copy
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 Copy
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 Copy
;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 Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào