2011-09-16 115 views
5

tôi có một cái nhìn (viewX) dựa trên tham gia của một số bảng:Sự khác biệt giữa HAVING và WHERE trong Truy vấn MySQL là gì?

Khi tôi sử dụng WHERE, truy vấn bị chậm trễ, sử dụng bộ vi xử lý đi đến 50% và cuối cùng tôi cần phải đóng mysqld.exe dịch vụ và khởi động lại để cố gắng giải quyết vấn đề một lần nữa.

Khi tôi sử dụng HAVING, truy vấn thực hiện hoàn hảo và nhanh chóng, tôi nhận được kết quả và tất cả đã sẵn sàng.

Truy vấn là tương tự như sau:

SELECT * FROM viewX WHERE column_of_view = 'foo' 

SELECT * FROM viewX HAVING column_of_view = 'foo' 

gì đang xảy ra?

Giải pháp tôi thấy là để làm một cái gì đó như thế này:

SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo' 

SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo' 

cả hai truy vấn hoạt động tốt, NHƯNG, tôi nghĩ rằng đây là BAD! (SELECT * FROM (... viewX) ????)

+0

bạn có thể đăng một số kế hoạch thực hiện không? – Thilo

+0

Dự đoán tốt nhất của tôi là bằng cách sử dụng HAVING, bạn đang bối rối với trình tối ưu hóa truy vấn giống như bạn đang bối rối và sự nhầm lẫn này dẫn đến một kế hoạch thực hiện khác (thứ tự và phương thức tham gia khác nhau), trong trường hợp này thực sự có lợi nhiều người tham gia, tiềm năng cho một thứ tự tham gia tối ưu là rất lớn). Liệu nó chỉ trả về một vài hàng đầu tiên nhanh hơn, hay toàn bộ lựa chọn cho tất cả các hàng cũng nhanh hơn? – Thilo

+0

Điều gì sẽ xảy ra nếu bạn chỉ định cả hai? – Thilo

Trả lời

5

WHERE là để lọc kết quả truy vấn dựa trên điều kiện.

HAVING là để áp dụng bộ lọc cho kết quả của hàm tổng hợp. Trong trường hợp không có hàm tổng hợp, nó hoạt động giống như WHERE.

http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

+1

Đó là chính xác, nhưng không giải thích những gì đang xảy ra. Trong thực tế, nó lập luận rằng không nên có sự khác biệt. – Thilo

0

Nó phụ thuộc vào định nghĩa của quan điểm - có khoản chỉ nên áp dụng đối với một truy vấn tổng hợp và nó áp dụng sau khi nhóm. Bạn đã xem xét hai kế hoạch truy vấn (có giải thích) chưa?

0

ĐÂU được sử dụng trong khi niêm yết và không có tên ALIAS có sẵn chưa

lọc hàng sau khi niêm yết tất cả các hàng càng tốt để tên ALIAS được tạo

Nên có một vấn đề trong khi lọc hàng inline .

1

Có được sử dụng cho các hàm tổng hợp như tổng, avg, và nó có thể chỉ sử dụng trong mệnh đề statement.where chọn sẽ không hoạt động trong điều kiện tổng hợp ví dụ: trong đó tổng (đánh dấu)> 300 // không đúng

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