Câu trả lời:
Không.
Họ không phải cùng tồn tại, như đã được chứng minh bằng thực tế là truy vấn sau trong Oracle hoạt động:
select * from dual having 1 = 1;
Tương tự, trong PostgreSQL, truy vấn sau đây hoạt động:
select 1 having 1 = 1;
Vì vậy, having
không yêu cầu group by
.
Có được áp dụng sau giai đoạn tổng hợp và phải được sử dụng nếu bạn muốn lọc kết quả tổng hợp. Vì vậy, điều ngược lại là không đúng và những điều sau đây sẽ không hoạt động:
select a, count(*) as c
from mytable
group by a
where c > 1;
Bạn cần thay thế where
bằng having
trong trường hợp này, như sau:
select a, count(*) as c
from mytable
group by a
having c > 1;
NB Mẫu truy vấn sau đây cũng sẽ hoạt động:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Bạn có thể thấy rằng việc sử dụng having
chỉ đơn giản là một phiên bản tốc ký của truy vấn cuối cùng này.
Nói tóm lại, having
được áp dụng sau khi các group by
giai đoạn trong khi where
được áp dụng trước các group by
giai đoạn.
select 1 having count(*) = 1;
mà tôi chưa nắm bắt được.
SELECT 1 AS id, 'Colin' AS name;
trong khi những người khác như Oracle có một dual
bảng đặc biệt . Tôi không nghĩ rằng một trong hai cú pháp này là ANSI / ISO SQL (yêu cầu FROM
).
from
nhưng tham chiếu đến count(*)
trong having
mệnh đề mà không có bất kỳ dấu hiệu nào về việc cột này sẽ được tổng hợp. Có lẽ nó tổng hợp trên tất cả các cột trong select
mệnh đề.
Có được sử dụng để lọc các nhóm.
trong đó mệnh đề được sử dụng để lọc các hàng.
having
được áp dụng sau giai đoạn tổng hợp để có thể được sử dụng để lọc các nhóm.
Trong trường hợp không có mệnh đề GROUP BY, truy vấn coi toàn bộ quan hệ là một nhóm.
ví dụ
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);