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 TE
là cái <table expression>
mà ngay lập tức chứa HC
. Nếu TE
không ngay lập tức chứa a
<group by clause>
, thì thì GROUP BY ()
CHUYỆN ẩn. Hãy T
là mô tả của bảng được xác định bởi <group by clause>
GBC
ngay lập tức có trong TE
và R
là kết quả của GBC
.
Ok rất nhiều điều đó là khá rõ ràng.
Khẳng định: 1=1
là đ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 T
là kết quả của trước đó <from clause>
; mặt khác, hãy T
là 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 T
như 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 T
không phải là bảng được nhóm, thì [...]
b) Nếu T
là một bảng được nhóm, thì
Trường hợp:
i) Nếu T
có 0 (không) nhóm, thì hãy để TEMP là một bảng trống.
ii) Nếu T
có một hoặc nhiều nhóm, thì mỗi nhóm <value expression>
được áp dụng cho mỗi nhóm T
mang lại một bảng TEMP
các M
hàng, trong đó M
số lượng nhóm trong đó T
. Các i
cộ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>
DISTINCT
khô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.