ตามมาตรฐาน:
SELECT 1 FROM r HAVING 1=1
วิธี
SELECT 1 FROM r GROUP BY () HAVING 1=1
การอ้างอิง ISO / IEC 9075-2: 2011 7.10 กฎไวยากรณ์ 1 (ส่วนหนึ่งของคำนิยามของส่วนคำสั่ง HAVING):
อนุญาตเป็นHC
<having clause>
อนุญาตTE
เป็นทันทีที่มี<table expression>
HC
หากTE
ไม่มีทันทีหมายความว่า
<group by clause>
" GROUP BY ()
" เป็นนัย อนุญาตT
เป็นตัวบ่งชี้ของตารางที่กำหนดโดย<group by clause>
GBC
ทันทีที่มีอยู่ในTE
และแจ้งให้R
เป็นผลมาจากGBC
.
ตกลงเพื่อที่ชัดเจนมาก
การยืนยัน: 1=1
เป็นเงื่อนไขการค้นหาที่แท้จริง ฉันจะไม่ให้การอ้างอิงสำหรับสิ่งนี้
ตอนนี้
SELECT 1 FROM r GROUP BY () HAVING 1=1
เทียบเท่ากับ
SELECT 1 FROM r GROUP BY ()
การอ้างอิง ISO / IEC 9075-2: 2011 7.10 กฎทั่วไป 1:
ได้รับการประเมินในแต่ละกลุ่ม<search condition>
R
ผลลัพธ์ของการ<having clause>
เป็นตารางที่จัดกลุ่มของกลุ่มเหล่านั้นของ R ซึ่งผลลัพธ์ของการ
<search condition>
เป็นจริง
ลอจิก: เนื่องจากเงื่อนไขการค้นหาเป็นจริงเสมอผลคือR
ซึ่งเป็นผลลัพธ์ของกลุ่มโดยการแสดงออก
ต่อไปนี้เป็นข้อความที่ตัดตอนมาจากกฎทั่วไป 7.9 (คำจำกัดความของกลุ่มตาม CLAUSE)
1) ถ้าไม่<where clause>
ได้ระบุไว้ให้T
เป็นผลของการก่อนหน้า<from clause>
; มิฉะนั้นให้เป็นผลมาจากก่อนหน้านี้T
<where clause>
2) กรณี:
ก) หากไม่มีคอลัมน์การจัดกลุ่มผลลัพธ์ของการ<group by clause>
คือตารางที่จัดกลุ่มซึ่งประกอบด้วยT
กลุ่มเดียว
ดังนั้นเราสามารถสรุปได้ว่า
FROM r GROUP BY ()
แสดงผลลัพธ์ในตารางที่จัดกลุ่มซึ่งประกอบด้วยหนึ่งกลุ่มโดยมีศูนย์แถว (เนื่องจาก R ว่างเปล่า)
ข้อความที่ตัดตอนมาจากกฎทั่วไปที่ 7.12 ซึ่งกำหนดข้อกำหนดการสืบค้น (หรือคำสั่ง SELECT):
1) กรณี:
a) หากT
ไม่ใช่ตารางที่จัดกลุ่มดังนั้น [... ]
b) ถ้าT
เป็นตารางที่จัดกลุ่มแล้ว
กรณี:
i) หากT
มีกลุ่ม 0 (ศูนย์) จากนั้นให้ TEMP เป็นตารางว่าง
ii) ถ้าT
มีหนึ่งหรือมากกว่าหนึ่งกลุ่มแล้วแต่ละคน<value expression>
จะถูกนำไปใช้กับแต่ละกลุ่มT
ให้ผลผลิตตารางTEMP
ของM
แถวที่เป็นจำนวนของกลุ่มในM
คอลัมน์ -th ของ TEMP มีค่าที่ได้มาจากการประเมินผลของ-th [ ... ]T
i
i
<value expression>
2) กรณี:
ก) ในกรณีที่<set quantifier>
DISTINCT
ไม่ได้ระบุไว้แล้วผลมาจากการที่เป็น<query specification>
TEMP
ดังนั้นเนื่องจากตารางมีกลุ่มหนึ่งจึงต้องมีแถวผลลัพธ์หนึ่งแถว
ดังนั้น
SELECT 1 FROM r HAVING 1=1
ควรส่งคืนชุดผลลัพธ์ 1 แถว
QED
SELECT COUNT(*) FROM r;
ส่งคืน 1 แถว (พร้อม0
) ในขณะที่SELECT COUNT(*) FROM r GROUP BY ();
ไม่ส่งคืนแถว