Nghiêm túc, có, FROM
mệnh đề của một SELECT
tuyên bố không phải là tùy chọn. Cú pháp cho SQL-99 nêu chi tiết về thống kê cơ bản SELECT
và FROM
mệnh đề không có bất kỳ dấu ngoặc vuông nào xung quanh nó. Điều đó cho thấy tiêu chuẩn coi nó là không tùy chọn:
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]
Trong sử dụng thực tế, các lập trình viên và DBA thường thấy hữu ích khi làm những việc khác ngoài thao tác dữ liệu trong bảng hoặc thao tác với bảng và cấu trúc dữ liệu. Loại điều này phần lớn nằm ngoài phạm vi của tiêu chuẩn SQL, liên quan đến các tính năng dữ liệu nhiều hơn các loại hạt và bu lông của việc triển khai cụ thể. Cho dù chúng ta muốn chạy SELECT getdate()
hoặc SELECT 1
hoặc SELECT DB_NAME()
(hoặc bất kỳ phương ngữ của bạn thích), chúng tôi không thực sự muốn dữ liệu từ một bảng.
Oracle chọn giải quyết sự khác biệt về tiêu chuẩn và triển khai bằng cách sử dụng bảng giả với định nghĩa hiệu quả sau:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Các RDBMS khác về cơ bản giả định rằng một bảng giả được sử dụng nếu không FROM
được chỉ định.
Các lịch sử của bảng DUAL là trên Wikipedia:
Bảng DUAL được tạo bởi Charles Weiss của tập đoàn Oracle để cung cấp một bảng để tham gia vào các khung nhìn nội bộ:
Tôi đã tạo bảng DUAL như một đối tượng cơ bản trong Từ điển dữ liệu Oracle. Nó không bao giờ có nghĩa là được nhìn thấy chính nó, mà thay vào đó được sử dụng trong một khung nhìn dự kiến sẽ được truy vấn. Ý tưởng là bạn có thể thực hiện THAM GIA với bảng DUAL và tạo hai hàng trong kết quả cho mỗi một hàng trong bảng của bạn. Sau đó, bằng cách sử dụng GROUP BY, phép nối kết quả có thể được tóm tắt để hiển thị dung lượng lưu trữ cho phạm vi DATA và cho phạm vi INDEX. Tên, DUAL, dường như thích hợp cho quá trình tạo một cặp hàng chỉ từ một.
Bảng DUAL ban đầu có hai hàng trong đó (vì vậy tên của nó), nhưng sau đó nó chỉ có một hàng.
select
mà không có afrom
. DB2 có một bảng giả tương tự được gọi là SYSIBM.SYSDUMMY1 . Ngoài ra, bạn có thể đã biết điều này, nhưng khi bạnselect 'A' from dual
,dual
bảng không thực sự được truy cập , câu trả lời cho câu hỏi trong chỉnh sửa của bạn (có công cho một câu hỏi mới btw).