Theo tiêu chuẩn:
SELECT 1 FROM r HAVING 1=1
có nghĩa
SELECT 1 FROM r GROUP BY () HAVING 1=1
Trích dẫn ISO / IEC 9075-2: 2011 7.10 Quy tắc cú pháp 1 (Một phần định nghĩa của mệnh đề HAVING):
Để cho HCđược <having clause>. Hãy TElà cái <table expression>mà ngay lập tức chứa HC. Nếu TEkhông ngay lập tức chứa a
<group by clause>, thì thì GROUP BY ()CHUYỆN ẩn. Hãy Tlà mô tả của bảng được xác định bởi <group by clause> GBCngay lập tức có trong TEvà Rlà kết quả của GBC.
Ok rất nhiều điều đó là khá rõ ràng.
Khẳng định: 1=1là điều kiện tìm kiếm thực sự. Tôi sẽ không cung cấp trích dẫn cho việc này.
Hiện nay
SELECT 1 FROM r GROUP BY () HAVING 1=1
tương đương với
SELECT 1 FROM r GROUP BY ()
Trích dẫn ISO / IEC 9075-2: 2011 7.10 Quy tắc chung 1:
Các <search condition>được đánh giá cho từng nhóm R. Kết quả của <having clause>một bảng được nhóm của các nhóm R mà kết quả của
<search condition>nó là True.
Logic: Vì điều kiện tìm kiếm luôn luôn đúng, kết quả là R, là kết quả của nhóm theo biểu thức.
Sau đây là một đoạn trích từ Quy tắc chung của 7.9 (định nghĩa của NHÓM THEO YÊU CẦU)
1) Nếu không <where clause>được chỉ định, thì hãy Tlà kết quả của trước đó <from clause>; mặt khác, hãy Tlà kết quả của trước đó <where clause>.
2) Trường hợp:
a) Nếu không có các nhóm nhóm, thì kết quả của bảng <group by clause>là nhóm được bao gồm Tnhư là nhóm duy nhất của nó.
Do đó chúng ta có thể kết luận rằng
FROM r GROUP BY ()
kết quả trong một bảng được nhóm, bao gồm một nhóm, với các hàng bằng không (vì R trống).
Một đoạn trích từ Quy tắc chung của 7.12, định nghĩa Đặc tả truy vấn (còn gọi là câu lệnh CHỌN):
1) Trường hợp:
a) Nếu Tkhông phải là bảng được nhóm, thì [...]
b) Nếu Tlà một bảng được nhóm, thì
Trường hợp:
i) Nếu Tcó 0 (không) nhóm, thì hãy để TEMP là một bảng trống.
ii) Nếu Tcó một hoặc nhiều nhóm, thì mỗi nhóm <value expression>được áp dụng cho mỗi nhóm Tmang lại một bảng TEMPcác Mhàng, trong đó Msố lượng nhóm trong đó T. Các icột -thứ của TEMP chứa các giá trị thu được bằng cách đánh giá của i-thứ <value expression>. [...]
2) Trường hợp:
a) Nếu <set quantifier> DISTINCTkhông được chỉ định, thì kết quả của <query specification>là TEMP.
Do đó, vì bảng có một nhóm, nên nó phải có một hàng kết quả.
Như vậy
SELECT 1 FROM r HAVING 1=1
sẽ trả về một tập kết quả 1 hàng.
QED
SELECT COUNT(*) FROM r;trả về 1 hàng (với0), trong khiSELECT COUNT(*) FROM r GROUP BY ();trả về không có hàng.