| Truy Vấn SQL Nâng Cao trong SQL Server

Được viết bởi Đặng Trí Thanh vào ngày 26/09/2026 lúc 14:48 | 11 lượt xem

Truy Vấn SQL Nâng Cao trong SQL Server

Trong bài viết này, chúng ta sẽ tìm hiểu về các kỹ thuật truy vấn SQL nâng cao trong SQL Server, bao gồm JOIN, Subquery, và Common Table Expressions (CTE).

JOIN – Kết hợp dữ liệu từ nhiều bảng

INNER JOIN

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

LEFT JOIN

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

RIGHT JOIN

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

FULL JOIN

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

Subquery – Truy vấn lồng nhau

Trong mệnh đề WHERE

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice > (
    SELECT AVG(UnitPrice)
    FROM Products
);

Trong mệnh đề FROM

SELECT CategoryName, AvgPrice
FROM (
    SELECT CategoryID, AVG(UnitPrice) as AvgPrice
    FROM Products
    GROUP BY CategoryID
) AS CategoryAvg
JOIN Categories ON CategoryAvg.CategoryID = Categories.CategoryID;

Trong mệnh đề SELECT

SELECT 
    ProductName,
    UnitPrice,
    (SELECT AVG(UnitPrice) FROM Products) as AvgPrice
FROM Products;

Common Table Expressions (CTE)

CTE cơ bản

WITH SalesCTE AS (
    SELECT 
        ProductID,
        SUM(Quantity) as TotalQuantity
    FROM OrderDetails
    GROUP BY ProductID
)
SELECT 
    p.ProductName,
    s.TotalQuantity
FROM Products p
JOIN SalesCTE s ON p.ProductID = s.ProductID;

CTE đệ quy

WITH EmployeeHierarchy AS (
    -- Anchor member
    SELECT 
        EmployeeID,
        ManagerID,
        EmployeeName,
        1 as Level
    FROM Employees
    WHERE ManagerID IS NULL

    UNION ALL

    -- Recursive member
    SELECT 
        e.EmployeeID,
        e.ManagerID,
        e.EmployeeName,
        eh.Level + 1
    FROM Employees e
    JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID
)
SELECT * FROM EmployeeHierarchy;

Window Functions

ROW_NUMBER()

SELECT 
    ProductName,
    UnitPrice,
    ROW_NUMBER() OVER (ORDER BY UnitPrice DESC) as PriceRank
FROM Products;

RANK() và DENSE_RANK()

SELECT 
    ProductName,
    UnitPrice,
    RANK() OVER (ORDER BY UnitPrice DESC) as PriceRank,
    DENSE_RANK() OVER (ORDER BY UnitPrice DESC) as DensePriceRank
FROM Products;

LAG() và LEAD()

SELECT 
    OrderID,
    OrderDate,
    LAG(OrderDate) OVER (ORDER BY OrderDate) as PreviousOrder,
    LEAD(OrderDate) OVER (ORDER BY OrderDate) as NextOrder
FROM Orders;

Best Practices

  1. Sử dụng JOIN thay vì Subquery khi có thể
  2. Tối ưu hiệu suất với Index
  3. Tránh SELECT *
  4. Sử dụng CTE để cải thiện khả năng đọc
  5. Kiểm tra Execution Plan

Kết luận

Các kỹ thuật truy vấn SQL nâng cao giúp bạn xử lý dữ liệu phức tạp một cách hiệu quả. Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về Stored Procedures và Functions trong SQL Server.

Đặng Trí Thanh

Đặng Trí Thanh

Giám đốc Công nghệ · DNT Digital · Giảng viên HNDL Hướng Nghiệp Dữ Liệu
1.390 Bài viết
15.4k Người theo dõi
120k+ Lượt đọc

Đặng Trí Thanh — Founder & CTO · Hướng Nghiệp Dữ Liệu - DNT Digital. Chuyên đào tạo và triển khai thực chiến Python, MT5 và hệ thống bot auto trading / IB cho học viên và doanh nghiệp.

Đội ngũ hỗ trợ

Đặng Trí Thanh
Đặng Trí Thanh
Giám đốc Công nghệ DNT Digital
Zalo 0934145100
Mộng Cầm
Mộng Cầm
Hỗ trợ khách hàng · Huấn luyện viên
Zalo 0927909257
Khánh Linh
Khánh Linh
Hỗ trợ khách hàng · Huấn luyện viên
Zalo 0927909582