อย่างเคร่งครัดใช่FROM
ประโยคของSELECT
คำสั่งนั้นไม่จำเป็น ไวยากรณ์สำหรับ SQL-99 ให้รายละเอียดเกี่ยวกับสถานะพื้นฐานSELECT
และส่วนFROM
คำสั่งไม่มีวงเล็บเหลี่ยมอยู่รอบ ๆ ที่ระบุว่ามาตรฐานถือว่าเป็นตัวเลือก:
SELECT [ DISTINCT | ALL ]
{Column expression [ AS name ]} [ ,... ] | *
FROM <Table reference> [ {,<Table reference>} ... ]
[ WHERE search condition ]
[ GROUP BY Columns [ HAVING condition ] ]
[ORDER BY {col_name | expr | position} [ASC | DESC],...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options |
INTO DUMPFILE 'file_name' |
INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]
ในการใช้งานจริงโปรแกรมเมอร์และ DBA มักจะพบว่ามีประโยชน์ในการทำสิ่งอื่นนอกเหนือจากการจัดการข้อมูลในตารางหรือจัดการกับตารางและโครงสร้างข้อมูล สิ่งประเภทนี้ส่วนใหญ่อยู่นอกเหนือขอบเขตของมาตรฐาน SQL ซึ่งเกี่ยวข้องกับคุณลักษณะของข้อมูลมากกว่าการใช้งานเฉพาะของน็อตและสลักเกลียว ไม่ว่าเราต้องการที่จะทำงานSELECT getdate()
หรือSELECT 1
หรือSELECT DB_NAME()
(หรือสิ่งที่ภาษาของคุณชอบ) เราไม่ต้องการจริงข้อมูลจากตาราง
ออราเคิลเลือกที่จะแก้ไขความคลาดเคลื่อนมาตรฐานและการนำไปใช้งานโดยใช้ตารางดัมมีคำจำกัดความที่มีประสิทธิภาพต่อไปนี้:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
RDBMS อื่น ๆ โดยพื้นฐานแล้วถือว่าสมมติว่ามีการใช้ตารางจำลองหากไม่มีการFROM
ระบุ
ประวัติศาสตร์ของตารางคู่อยู่ในวิกิพีเดีย:
ตาราง DUAL สร้างโดย Charles Weiss ของ บริษัท Oracle เพื่อจัดทำตารางสำหรับการเข้าร่วมในมุมมองภายใน:
ฉันสร้างตาราง DUAL เป็นวัตถุพื้นฐานใน Oracle Data Dictionary มันไม่ได้ตั้งใจจะมองเห็นตัวเอง แต่ใช้ในมุมมองที่คาดว่าจะถูกถามแทน แนวคิดคือคุณสามารถเข้าร่วมกับตาราง DUAL และสร้างสองแถวในผลลัพธ์สำหรับทุก ๆ แถวในตารางของคุณ จากนั้นโดยใช้ GROUP BY การสรุปผลการเข้าร่วมสามารถแสดงจำนวนหน่วยเก็บข้อมูลสำหรับขอบเขตข้อมูลและขอบเขตดัชนี ชื่อ DUAL ดูเหมือนจะเหมาะสำหรับกระบวนการสร้างแถวหนึ่งแถวจากแถวเดียว
ตาราง DUAL ดั้งเดิมมีสองแถวในนั้น (ด้วยเหตุนี้ชื่อ) แต่ต่อมามันมีเพียงหนึ่งแถว
select
from
DB2 มีตารางหุ่นคล้ายกันเรียกว่าSYSIBM.SYSDUMMY1 นอกจากนี้คุณอาจจะรู้อยู่แล้วว่านี้ แต่เมื่อคุณselect 'A' from dual
ที่dual
โต๊ะไม่สามารถเข้าถึงจริงๆซึ่งเป็นคำตอบคำถามในการแก้ไขของคุณ (ซึ่งสมควรได้รับคำถามใหม่ครับ)