2009-11-04 61 views
13

Có thể sử dụng mệnh đề WHERE sau mệnh đề HAVING không?Có thể có mệnh đề WHERE sau mệnh đề HAVING?

Điều đầu tiên đến với tâm trí của tôi là truy vấn phụ, nhưng tôi không chắc chắn.

P.S. Nếu câu trả lời là khẳng định, bạn có thể đưa ra một số ví dụ không?

+3

Đây có phải là câu hỏi lừa/phỏng vấn hay bạn có vấn đề thực sự cần giải quyết? – itsadok

+1

Có. Câu hỏi đặt ra là từ một cuộc phỏng vấn. –

Trả lời

25

Không, không phải trong cùng một truy vấn.

Điều khoản where trước số havinggroup by.Nếu bạn muốn lọc ra các hồ sơ trước khi nhóm điều kiện đi trong mệnh đề where, và nếu bạn muốn lọc ra nhóm ghi lại tình trạng đi trong having khoản:

select ... 
from ... 
where ... 
group by ... 
having ... 

Nếu không những là có thể sử dụng đối với một số lý do kỳ quặc, bạn phải thực hiện các truy vấn một subquery để bạn có thể đưa mệnh đề where trong truy vấn bên ngoài:

select ... 
from (
    select ... 
    from ... 
    where ... 
    group by ... 
    having ... 
) x 
where ... 
4

Mệnh đề HAVING chỉ là mệnh đề WHERE sau một GROUP BY. Tại sao không đặt điều kiện WHERE của bạn trong mệnh đề HAVING?

+3

+1 Chính xác. Mệnh đề WHERE sau khi HAVING được gọi là AND. – Andomar

+0

Về mặt khái niệm, mệnh đề HAVING được áp dụng sau phép toán GROUP BY, trong khi mệnh đề WHERE được áp dụng trước đó về mặt lý thuyết có thể tối ưu hóa bằng cách 'lọc' trong mệnh đề WHERE. Trong thực tế, bạn sẽ (như mọi khi) phải xem cách trình tối ưu hóa xử lý nó, ví dụ: kiểm tra kế hoạch thực hiện. Ngoài ra, hãy xem xét trình đọc của con người, người thường kỳ vọng sẽ thấy 'lọc' được xác định trong mệnh đề WHERE (chứ không phải là mệnh đề kết nối, mệnh đề HAVING, v.v.). – onedaywhen

2

Từ CHỌN giúp đỡ

Processing Trình tự WHERE, GROUP BY, và HAVING khoản Các bước sau đây hiển thị thứ tự xử lý cho một câu lệnh SELECT với mệnh đề WHERE, GROUP BY khoản, và Mệnh đề HAVING:

Mệnh đề FROM trả về kết quả ban đầu là .

Mệnh đề WHERE loại trừ các hàng không đáp ứng điều kiện tìm kiếm của nó.

Mệnh đề GROUP BY thu thập các hàng được chọn vào một nhóm cho mỗi giá trị duy nhất trong mệnh đề GROUP BY.

Chức năng tổng hợp được chỉ định trong chọn danh sách tính giá trị tóm tắt cho mỗi nhóm.

Điều khoản HAVING bổ sung không bao gồm các hàng không đáp ứng điều kiện tìm kiếm .

Vì vậy, không, bạn không thể.

5

Nếu đó là câu hỏi mẹo, có thể nếu WHERE và HAVING không ở cùng cấp như bạn đã đề cập, với truy vấn phụ.

Tôi đoán một cái gì đó như thế sẽ làm việc

CÓ value = (SELECT max (value) TỪ foo ĐÂU crit = 123)

P.S .: Tại sao được bạn yêu cầu? Bạn có vấn đề cụ thể không?

p.s.s: OK ngớ ngẩn tôi, tôi đã bỏ lỡ thẻ "phỏng vấn *" ...

0

trong phạm vi tương tự, câu trả lời là không. Nếu truy vấn phụ được cho phép thì bạn có thể tránh sử dụng hoàn toàn HAVING.

Tôi nghĩ HAVING là một lỗi thời. Hugh Darwen đề cập đến HAVING là "The Folly của truy vấn có cấu trúc":

Trong SQL cũ, mệnh đề WHERE không thể được sử dụng trên kết quả của sự kết hợp, vì vậy họ đã phát minh ra HAVING (với cùng một ý nghĩa như WHERE):

SELECT D#, AVG(Salary) AS Avg_Sal 
    FROM Emp 
GROUP 
    BY D# 
HAVING AVG(Salary) > 999; 

Nhưng sẽ mà chúng tôi từng có HAVING nếu vào năm 1979 người ta có thể viết:

SELECT * 
    FROM (
     SELECT D#, AVG(Sal) AS Avg_Sal 
      FROM Emp 
     GROUP 
      BY D# 
     ) 
     AS dummy 
WHERE Avg_Sal > 999; 

Tôi nghi ngờ câu trả lời cho câu hỏi của Darwen là không.

Các vấn đề liên quan