Bạn có thể sử dụng ở đâu và có với nhau không?

Mệnh đề HAVING đã được thêm vào SQL vì không thể sử dụng từ khóa WHERE với các hàm tổng hợp

CÓ Cú pháp

CHỌN [các] tên_cột
TỪ_tên_bảng
Điều kiện WHERE
NHÓM THEO [các] tên_cột
HAVING condition
ORDER BY column_name[s];

Cơ sở dữ liệu demo

Dưới đây là một lựa chọn từ bảng "Khách hàng" trong cơ sở dữ liệu mẫu của Northwind

ID khách hàng Tên khách hàng Tên liên hệĐịa chỉThành phốMã bưu chínhQuốc gia1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Đức2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222Mexico D. F. 05021Mexico3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D. F. 05023Mexico4Xung quanh Sừng Thomas Hardy120 Hanover Sq. Luân ĐônWA1 1DPUK5Berglunds snbbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Thụy Điển

Các ví dụ về SQL HAVING

Câu lệnh SQL sau liệt kê nếu nhân viên "Davolio" hoặc "Fuller" đã đăng ký hơn 25 đơn đặt hàng

Bởi vì COUNT chỉ hiển thị cho chúng tôi các hàng không có giá trị trống. Và nếu trong một cột nào đó có một giá trị trống và chúng tôi đã sử dụng cột đó làm đối số để COUNT [như trong “COUNT[some_column]”], thì hàng đó sẽ không được tính và kết quả của chúng tôi sẽ bị hỏng. Nhưng với dấu hoa thị, chúng tôi sẽ kiểm tra tất cả các cột để tìm giá trị. Và thêm +1 cho toàn bộ hàng nếu chúng tôi tìm thấy một số

Nếu bạn đã quen thuộc với mệnh đề HAVING, bạn có thể rơi vào tình huống không biết nên dùng WHERE hay HAVING. Bạn thậm chí có thể tự hỏi mình - nếu chúng ta có thể sử dụng WHERE, tại sao mệnh đề HAVING lại tồn tại?

Mệnh đề HAVING thường được triển khai với GROUP BY vì nó tinh chỉnh đầu ra từ các bản ghi không thỏa mãn một điều kiện nhất định

Nội bộ hóa cú pháp tương ứng sẽ giúp chúng tôi giải thích sự khác biệt giữa hai từ khóa, vì vậy hãy bắt đầu từ đó

HAVING cần được chèn vào giữa mệnh đề GROUP BY và ORDER BY. Ngoài ra, HAVING giống như WHERE nhưng được áp dụng cho khối GROUP BY

Sự khác biệt có thể được hiểu rõ hơn với một ví dụ

lưu ý bên lề. Chúng tôi sẽ làm việc với cơ sở dữ liệu 'nhân viên', vì vậy nếu bạn chưa tải xuống, hãy đảm bảo xem hướng dẫn giải thích về cơ sở dữ liệu của chúng tôi.  

Cung cấp một trường hợp tại điểm

Đầu tiên, trong một số trường hợp, có thể thu được kết quả giống hệt nhau bằng cách thực hiện cùng một điều kiện, với mệnh đề WHERE hoặc HAVING

Chẳng hạn, nếu chúng ta chọn tất cả nhân viên được thuê sau ngày 1 tháng 1 năm 2000, bảng được truy xuất sẽ giống nhau, cho dù chúng ta đang sử dụng WHERE hay HAVING

Nếu chúng ta đang sử dụng WHERE, mã sẽ là

SELECT
    *
FROM
    employees
WHERE
    hire_date > ‘2000-01-01’;

Và nếu chúng ta quyết định sử dụng mệnh đề HAVING, chúng ta chỉ cần thay thế WHERE

SELECT
     *
FROM
    employees
HAVING
    hire_date > ‘2000-01-01’;

Kết quả giống nhau, như thể hiện trong hình bên dưới

Ưu điểm chính của mệnh đề HAVING so với mệnh đề WHERE

Chà, sự khác biệt chính giữa hai mệnh đề là HAVING có thể được áp dụng cho các tập hợp con của các nhóm tổng hợp, trong khi ở khối WHERE, điều này bị cấm. Nói một cách đơn giản hơn, sau HAVING, chúng ta có thể có một điều kiện với hàm tổng hợp, trong khi WHERE không thể sử dụng hàm tổng hợp trong các điều kiện của nó

Một ví dụ

Giả sử chúng tôi muốn trích xuất một danh sách có tất cả các tên xuất hiện hơn 250 lần trong bảng “nhân viên”

Nếu chúng ta cố đặt điều kiện này trong mệnh đề WHERE, Workbench sẽ không chỉ ra rằng có lỗi trong mã của chúng ta, bởi vì đây là cú pháp đúng.

Chúng tôi sẽ hiển thị thông báo lỗi khi cố gắng thực hiện truy vấn. Và nó sẽ rất hùng hồn. sử dụng chức năng nhóm không hợp lệ.

Sửa lỗi

Chúng ta có thể thay đổi từ khóa thành HAVING và thêm dòng mã vào đúng vị trí, ngay sau câu lệnh GROUP BY

SELECT
    first_name, COUNT[first_name] as names_count
FROM
    employees
GROUP BY first_name
HAVING COUNT[first_name] > 250
ORDER BY first_name;

 

Bây giờ, hãy chạy lại truy vấn

Chúng tôi đã truy xuất 193 tên có thể gặp hơn 250 lần trong bảng “nhân viên”

ĐÂU hay CÓ?

Vì vậy, khi nào là thời điểm thích hợp để sử dụng WHERE và khi nào bạn nên sử dụng HAVING?

Không quá khó để quyết định. Hãy xem lại bài toán mà chúng ta vừa giải quyết một lần nữa, “Trích xuất tất cả các tên xuất hiện hơn 250 lần trong bảng “nhân viên””. Trước tiên bạn phải phát hiện ra cụm từ “250 lần”. Nó dẫn đến việc đếm số lần thứ gì đó xuất hiện trong bảng dữ liệu. Và việc đếm số được thực hiện thông qua hàm COUNT[] phải không?

COUNT[] là một hàm tổng hợp

Bạn phải sử dụng HAVING, không phải WHERE

nó đơn giản như vậy. Logic tương tự phải được áp dụng bất cứ khi nào hàm tổng hợp được yêu cầu để giải quyết nhiệm vụ của bạn

Tóm tắt WHERE và HAVING

Điều quan trọng là quyết định nên sử dụng WHERE hay HAVING trong một số tình huống nhất định

WHERE cho phép chúng tôi đặt các điều kiện đề cập đến các tập hợp con của các hàng riêng lẻ. Các điều kiện này được áp dụng trước khi sắp xếp lại đầu ra thành các nhóm

Khi các hàng thỏa mãn các điều kiện WHERE được chọn, chúng sẽ tiếp tục trong quá trình truy xuất dữ liệu và có thể được nhóm theo các giá trị riêng biệt được ghi trong một hoặc nhiều trường nhất định

Mãi cho đến thời điểm này, khi đầu ra có thể được cải thiện hơn nữa hoặc được lọc, với một điều kiện được chỉ định trong mệnh đề HAVING

Cuối cùng, bạn có thể sắp xếp các bản ghi của danh sách cuối cùng thông qua mệnh đề ORDER BY.

Giải quyết một nhiệm vụ

Để củng cố hiểu biết của bạn về quy trình truy xuất dữ liệu, hãy xem một ví dụ chứa cả điều kiện WHERE và HAVING

Nhiệm vụ là trích xuất danh sách tất cả các tên gặp ít hơn 200 lần. Chỉ để dữ liệu đề cập đến những người được tuyển dụng sau ngày 1 tháng 1 năm 1999

Hãy tạo truy vấn, từng bước một

Rõ ràng, chúng ta phải chọn tên đầu tiên và số lần gặp phải tên đầu tiên, đổi tên lựa chọn thứ hai thành “names_count”

Điều thứ hai cần làm là chỉ định bảng mà chúng tôi sẽ lấy dữ liệu từ - “nhân viên”

Mã sẽ trông như thế này

SELECT
    first_name, COUNT[first_name] AS names_count
FROM
    employees;

Những gì để sử dụng

Chúng ta có nên chỉ sử dụng WHERE hoặc HAVING hoặc cả hai từ khóa trong khi đặt điều kiện của mình không?

Vâng, có hai điều kiện để đáp ứng để giải quyết vấn đề của chúng tôi

Điều kiện đầu tiên

Một là tên phải được gặp ít hơn 200 lần. “200 lần” ngay lập tức có nghĩa là chúng ta phải sử dụng COUNT[], hàm này sẽ đếm số lần một tên nào đó xuất hiện trong bảng dữ liệu “nhân viên”

COUNT[] là một hàm tổng hợp và, như chúng ta đã nói trước đó, vì vậy nó phải đi cùng với HAVING.

Điều kiện thứ hai

Điều kiện khác để đáp ứng là chung. “Tất cả các hàng được trích xuất phải là của những người được thuê sau ngày 1 tháng 1 năm 1999. ” Điều kiện này đề cập đến tất cả các hàng riêng lẻ trong bảng “nhân viên”. Không có chức năng tổng hợp cụ thể phải được áp dụng. Do đó, điều kiện này phải đi với mệnh đề WHERE

Quan trọng. Giữa các khối WHERE và HAVING, chúng ta không nên quên chèn phân đoạn GROUP BY. Chúng tôi phải nhóm theo “first_name”, không phải theo một số trường khác, vì nhiệm vụ của chúng tôi yêu cầu chúng tôi tổng hợp đầu ra của mình theo số lần gặp phải một tên nhất định

Trên thực tế, hãy sắp xếp đầu ra theo “first_name” theo thứ tự giảm dần

Giải pháp cuối cùng

Toàn bộ truy vấn có thể được viết theo cách sau

SELECT
    first_name, COUNT[first_name] AS names_count
FROM
    employees
WHERE
    hire_date > ‘1999-01-01’
GROUP BY first_name
HAVING COUNT[first_name] < 200
ORDER BY first_name DESC;

Truy vấn đã hoạt động và giải quyết vấn đề của chúng tôi – chúng tôi có một danh sách với số lượng tên riêng biệt của những người được thuê sau ngày 1 tháng 1 năm 1999

Một vài quan sát

Hàm “COUNT[first_name]” đã được áp dụng hai lần – một lần trong câu lệnh SELECT và một lần trong khối HAVING

Sử dụng nhiều lần

Trên màn hình, hai cụm từ dường như cách xa nhau. Tuy nhiên, về mặt logic, chúng gần. Thông thường, bạn cũng muốn hàm tổng hợp mà bạn đã đính kèm với một điều kiện cụ thể xuất hiện trong kết quả của mình. Vì vậy, thật hợp lý khi nhìn thấy cùng một cụm từ hai lần

Mặt khác, “first_name” xuất hiện trong truy vấn ba lần. Một lần, vì bạn nhóm theo trường này. Lần thứ hai vì việc nhóm theo trường yêu cầu nêu tên cột trong khối CHỌN. Và lần thứ ba, ở cuối truy vấn, vì chúng tôi sắp xếp dữ liệu theo cùng một lựa chọn

Tìm kiếm đơn đặt hàng

Có vẻ như bạn đang sử dụng “first_name” và COUNT[] quá thường xuyên trong truy vấn. Vâng, điều này là tốt. Điều này không phải lúc nào cũng đúng, nhưng không sao nếu nó xảy ra. Do đó, bạn phải nắm vững cấu trúc truy vấn;

Một điểm đặc biệt khác của từ khóa HAVING

Ngoài ra, như một bài tập, bạn có thể thử đặt điều kiện “hire_date” trong mệnh đề HAVING, thay vì trong mệnh đề WHERE, nhưng bạn sẽ gặp lỗi

Bạn đã thấy HAVING có thể chứa điều kiện như “hire_date” lớn hơn ngày 1 tháng 1 năm 2000. ” Trong một truy vấn khác, nó hoạt động bình thường với hàm tổng hợp

Quan trọng. Cả hai tình huống đều khả thi đối với MySQL, nhưng bạn không thể có cả điều kiện tổng hợp và không tổng hợp trong mệnh đề HAVING. Mặc dù đây có vẻ là một chi tiết nhỏ, nhưng đôi khi, điều quan trọng là bạn phải biết điều này. Không trộn lẫn các điều kiện trong khối HAVING. Đây là một cạm bẫy mà bạn nên biết và đó là lý do tại sao chúng tôi chia sẻ nó với bạn.

Khi nào nên sử dụng mệnh đề HAVING

Để tổng hợp hướng dẫn này, hãy nhớ quy tắc đơn giản

Nếu bạn cần làm việc với các hàm tổng hợp, hãy sử dụng GROUP BY và HAVING. Và nếu bạn cần áp dụng các điều kiện chung, hãy sử dụng WHERE

Bạn sẽ đồng ý rằng dường như có quá nhiều mệnh đề và thủ thuật cần nhớ về câu lệnh SELECT phải không?

Đừng lo lắng – khi bạn đọc thêm các hướng dẫn và thực hành trong các bài tập đính kèm trong bài học, bạn sẽ bắt đầu sử dụng các câu lệnh này của ngôn ngữ thao tác dữ liệu một cách thoải mái

Vì vậy, bạn có thể không ngạc nhiên khi có những câu lệnh mạnh mẽ khác trong SQL. Thoải mái đi sâu vào thế giới chưa biết của câu lệnh GIỚI HẠN

Chúng ta có thể sử dụng WHERE sau HAVING không?

Không, không phải trong cùng một truy vấn . Mệnh đề where đứng trước có và nhóm theo.

Có thể dùng HAVING thay cho WHERE không?

Chúng ta không thể sử dụng mệnh đề HAVING mà không có câu lệnh SELECT trong khi mệnh đề WHERE có thể được sử dụng với SELECT, UPDATE, DELETE, v.v. CHÚNG TÔI có thể sử dụng các hàm tổng hợp như sum, min, max, avg, v.v. với mệnh đề HAVING nhưng chúng không bao giờ được sử dụng với mệnh đề WHERE . Mệnh đề HAVING thường được sử dụng với GROUP BY.

HAVING có thể được sử dụng mà không có WHERE không?

Có Mệnh đề về cơ bản giống như hàm tổng hợp với mệnh đề GROUP BY. Mệnh đề HAVING được sử dụng thay cho WHERE với các hàm tổng hợp .

Làm cách nào để sử dụng GROUP BY HAVING và WHERE cùng nhau trong SQL?

Mệnh đề GROUP BY được sử dụng với câu lệnh SELECT. Trong truy vấn, mệnh đề GROUP BY được đặt sau mệnh đề WHERE . Trong truy vấn, mệnh đề GROUP BY được đặt trước mệnh đề ORDER BY nếu được sử dụng bất kỳ. Trong truy vấn, mệnh đề Nhóm BY được đặt trước mệnh đề Có.

Chủ Đề