5.1 Câu lệnh HAVING

Có một toán tử hữu ích khác trong SQL được sử dụng với GROUP BY, nó được gọi là HAVING.

Theo nghĩa của nó, nó hoàn toàn tương tự với toán tử WHERE. Nó chỉ WHEREcho phép bạn đặt bộ lọc hàng trước khi nhóm và với sự trợ giúp, HAVINGbạn có thể đặt bộ lọc được áp dụng cho các bản ghi sau khi nhóm.

Dạng xem chung của truy vấn khi sử dụng kết quả nhóm và lọc nhóm như sau:

SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition

HAVINGchỉ có thể được sử dụng nếu yêu cầu chứa GROUP BY.

Hãy viết một truy vấn trong đó chúng tôi hiển thị số lượng nhân viên được thuê theo năm.

SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year

Và kết quả của truy vấn này:

thuê_năm tổng cộng
2012 1
2013 1
2014 1
2015 2
2018 1

Và bây giờ chúng tôi loại trừ những năm mà một hoặc ít nhân viên được thuê. Ví dụ:

SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1

Và kết quả của truy vấn này:

thuê_năm tổng cộng
2015 2

5.3 Thứ tự thực hiện các câu lệnh

Để viết các truy vấn SQL chính xác và hiệu quả, bạn cần hiểu cách chúng được thực thi bởi máy chủ SQL.

Quy trình thực hiện các hành động được quy định chặt chẽ và không phụ thuộc vào mong muốn của bạn. Bạn không thể sắp xếp lại các toán tử và nhận một thứ tự khác.

Truy vấn SQL được thực hiện trong một số giai đoạn theo thứ tự này.

  1. Giai đoạn 1 - tìm nạp hàng
    • Đầu tiên, tất cả các hàng từ bảng đã chỉ định đều được chọn.
    • Sau đó, các trường được tính toán được thêm vào chúng.
    • Và sau đó trong số tất cả các hàng, chỉ còn lại những hàng thỏa mãn điều kiệnWHERE
  2. Giai đoạn 2 - nhóm
    • Nhóm sau đó được áp dụng cho các kết quả.
    • Trong quá trình nhóm, các trường như COUNT(*).
    • Cuối cùng, một bộ lọc được áp dụng cho kết quả nhóm HAVING.
  3. Giai đoạn 3 - sắp xếp
    • Các hàng thu được trong các bước trước được sắp xếp bằng cách sử dụng ORDER BY.

Cuối cùng, kết quả có thể được cắt bớt với LIMITOFFSET.