Truy vấn con

Cải thiện hiệu năng truy vấn trong SQL Server

Dean Smith

Founder, Atamai Analytics

Truy vấn con trông thế nào?

Truy vấn con

Cải thiện hiệu năng truy vấn trong SQL Server

Truy vấn con trông thế nào?

Truy vấn con với truy vấn ngoài

Cải thiện hiệu năng truy vấn trong SQL Server

Truy vấn con với FROM

Truy vấn con với FROM

Cải thiện hiệu năng truy vấn trong SQL Server

Truy vấn con với FROM

SELECT OrderID, 
       CustomerID, 
       NumDays
FROM 
    (SELECT *, 
     DATEDIFF(DAY,OrderDate,ShippedDate) AS NumDays 
     FROM Orders) AS o
WHERE NumDays >= 35;
OrderID CustomerID NumDays
10380 HUNGO 35
10427 PICCO 35
10545 LAZYK 35
10593 LEHMS 35
10660 HUNGC 37
10777 GOURL 37
10924 BERGS 35
Cải thiện hiệu năng truy vấn trong SQL Server

Truy vấn con với WHERE

Truy vấn con với WHERE

Cải thiện hiệu năng truy vấn trong SQL Server

Truy vấn con với WHERE

SELECT CustomerID
       ,CompanyName 
FROM Customers
WHERE CustomerID 
         IN (SELECT CustomerID 
         FROM Orders 
         WHERE Freight > 800);
CustomerID CompanyName
QUEEN Queen Cozinha
QUICK QUICK-Stop
SAVEA Save-a-lot Markets
Cải thiện hiệu năng truy vấn trong SQL Server

Truy vấn con với SELECT

Truy vấn con với SELECT

Cải thiện hiệu năng truy vấn trong SQL Server

Truy vấn con với SELECT

SELECT CustomerID, 
       CompanyName, 
        (SELECT AVG(Freight) 
        FROM Orders o 
        WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;
CustomerID CompanyName AvgFreight
ALFKI Alfreds Futterkiste 37.6
ANATR Ana Trujillo Emparedados y helados 24.4
ANTON Antonio Moreno Taquería 38.4
... ... ...
Cải thiện hiệu năng truy vấn trong SQL Server

Các loại truy vấn con

Truy vấn con không tương quan

SELECT CustomerID
       ,CompanyName 
FROM Customers
WHERE CustomerID IN

(SELECT CustomerID FROM Orders WHERE Freight > 800);
  • Truy vấn con không tham chiếu truy vấn ngoài
  • Truy vấn con có thể chạy độc lập
  • Dùng với WHEREFROM

Truy vấn con tương quan

SELECT CustomerID, 
       CompanyName,

(SELECT AVG(Freight) FROM Orders o WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;
  • Truy vấn con _có_ tham chiếu truy vấn ngoài
  • Truy vấn con không thể chạy độc lập
  • Dùng với WHERESELECT
Cải thiện hiệu năng truy vấn trong SQL Server

Hiệu năng truy vấn con

Tương quan

  • Truy vấn con chạy cho từng hàng của truy vấn ngoài

Không tương quan

  • Truy vấn con chỉ chạy một lần và trả kết quả cho truy vấn ngoài
Cải thiện hiệu năng truy vấn trong SQL Server

Truy vấn con vs. INNER JOIN

Truy vấn con tương quan

SELECT CustomerID, 
       CompanyName, 
        (SELECT AVG(Freight) 
        FROM Orders o 
        WHERE c.CustomerID = o.CustomerID) AS AvgFreight
FROM Customers c;

INNER JOIN

SELECT c.CustomerID,
       c.CompanyName, 
       AVG(o.Freight)
FROM Customers c
INNER JOIN Orders o
    ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID,
         c.CompanyName;
Cải thiện hiệu năng truy vấn trong SQL Server

Ayo berlatih!

Cải thiện hiệu năng truy vấn trong SQL Server

Preparing Video For Download...