Sử dụng Group By, Having, Exists trong SQL

Bài hôm nay mình sẽ hướng dẫn các bạn sử dụng: GROUP BY, HAVING, EXISTS trong SQL

Mục Lục:

1. Mệnh đề GROUP BY

Mệnh đề GROUP BY thường được sử dụng với các hàm tổng hợp (COUNT, MAX, MIN, SUM, AVG) để nhóm các tập hợp kết quả theo một hoặc nhiều cột.

Cú pháp:

        SELECT column_name(s)
        FROM table_name
        WHERE condition
        GROUP BY column_name(s)
        ORDER BY column_name(s);
    

Ví dụ: ta có bảng sau

CustomerID CustomerName ContactName Address City PostalCode Country
1

Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
4

Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

Ví dụ: Câu lệnh SQL sau liệt kê số lượng khách hàng ở mỗi quốc gia:

        SELECT COUNT(CustomerID), Country
        FROM Customers
        GROUP BY Country;
    

Ví dụ: Câu lệnh SQL sau liệt kê số lượng khách hàng ở mỗi quốc gia, được sắp xếp từ cao đến thấp:

        SELECT COUNT(CustomerID), Country
        FROM Customers
        GROUP BY Country
        ORDER BY COUNT(CustomerID) DESC;
    

Ví dụ: ta có 2 bảng sau

Bảng "Orders"

OrderID CustomerID EmployeeID OrderDate ShipperID
10248 90 5 1996-07-04 3
10249 81 6 1996-07-05 1
10250 34 4 1996-07-08 2

Bảng "Shippers"

ShipperID ShipperName
1 Speedy Express
2 United Package
3 Federal Shipping

Ví dụ: Lệnh SQL sau đây liệt kê số lượng đơn đặt hàng được gửi bởi shipper:

        SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
        LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
        GROUP BY ShipperName;
    

2. Mệnh đề HAVING

Mệnh đề HAVING được sử dụng khi không thể sử dụng WHERE.

Cú pháp:

        SELECT column_name(s)
        FROM table_name
        WHERE condition
        GROUP BY column_name(s)
        HAVING condition
        ORDER BY column_name(s);
    

Ví dụ: ta có 2 bảng sau

Bảng "Orders"

OrderID CustomerID EmployeeID OrderDate ShipperID
10248 90 5 1996-07-04 3
10249 81 6 1996-07-05 1
10250 34 4 1996-07-08 2

Bảng "Employees"

EmployeeID LastName FirstName BirthDate Photo Notes
1 Davolio Nancy 1968-12-08 EmpID1.pic Education includes a BA....
2 Fuller Andrew 1952-02-19 EmpID2.pic Andrew received his BTS....
3 Leverling Janet 1963-08-30 EmpID3.pic Janet has a BS degree....

Ví dụ: Câu lệnh SQL sau liệt kê các nhân viên đã đăng ký trên 10 đơn đặt hàng:

        SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
        FROM (Orders
        INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID)
        GROUP BY LastName
        HAVING COUNT(Orders.OrderID) > 10;
    

Ví dụ: Các câu lệnh SQL sau đây liệt kê các nhân viên "Davolio" hoặc "Fuller" đã đăng ký trên 25 đơn đặt hàng:

        SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
        FROM Orders
        INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
        WHERE LastName = 'Davolio' OR LastName = 'Fuller'
        GROUP BY LastName
        HAVING COUNT(Orders.OrderID) > 25;
    

3. Toán tử EXISTS

Toán tử EXISTS được sử dụng để kiểm tra sự tồn tại của bất kỳ bản ghi nào trong một truy vấn con.

Toán tử EXISTS trả về true nếu yêu cầu truy vấn phụ trả về một hoặc nhiều bản ghi.

Cú pháp:

        SELECT column_name(s)
        FROM table_name
        WHERE EXISTS
        (SELECT column_name FROM table_name WHERE condition);
    

Ví dụ: ta có 2 bảng sau

Bảng "Products"

ProductID ProductName SupplierID CategoryID Unit Price
1 Chais 1 1 10 boxes x 20 bags 18
2 Chang 1 1 24 - 12 oz bottles 19
3 Aniseed Syrup 1 2 12 - 550 ml bottles 10
4 Chef Anton's Cajun Seasoning 2 2 48 - 6 oz jars 22
5 Chef Anton's Gumbo Mix 2 2 36 boxes 21.35

Bảng "Suppliers"

SupplierID SupplierName ContactName Address City PostalCode Country
1 Exotic Liquid Charlotte Cooper 49 Gilbert St. London EC1 4SD UK
2 New Orleans Cajun Delights Shelley Burke P.O. Box 78934 New Orleans 70117 USA
3 Grandma Kelly's Homestead Regina Murphy 707 Oxford Rd. Ann Arbor 48104 USA
4 Tokyo Traders Yoshi Nagase 9-8 Sekimai Musashino-shi Tokyo 100 Japan

Ví dụ: Câu lệnh SQL sau trả về TRUE và liệt kê các nhà cung cấp với giá sản phẩm dưới 20:

        SELECT SupplierName
        FROM Suppliers
        WHERE EXISTS (SELECT ProductName FROM Products WHERE SupplierId = Suppliers.supplierId AND Price < 20);
    

Ví dụ: Câu lệnh SQL sau trả về TRUE và liệt kê các nhà cung cấp với giá sản phẩm bằng 22:

        SELECT SupplierName
        FROM Suppliers
        WHERE EXISTS (SELECT ProductName FROM Products WHERE SupplierId = Suppliers.supplierId AND Price = 22);