ANSI/ISO SQL 標準(如 SQL:2011)存在,但 Oracle、SQL Server、MySQL、PostgreSQL、DB2 各自實現差異巨大,類比 C 語言標準庫在 Windows/Linux 下的差異。如何獲取標準?學哪個方言?
SELECT select_list
FROM table_expression
WHERE search_condition
GROUP BY grouping_columns
HAVING group_condition
ORDER BY sort_specification
[LIMIT n OFFSET m] -- 標準寫法:FETCH FIRST n ROWS ONLY
| 功能 | 標準 SQL | PostgreSQL | MySQL | SQL Server | Oracle |
|---|---|---|---|---|---|
| 當前時間 | CURRENT_TIMESTAMP | NOW() / CURRENT_TIMESTAMP | NOW() / CURRENT_TIMESTAMP | GETDATE() / SYSDATETIME() | SYSDATE / CURRENT_TIMESTAMP |
| 分頁 | OFFSET m ROWS FETCH FIRST n ROWS ONLY | LIMIT n OFFSET m | LIMIT n OFFSET m | OFFSET m ROWS FETCH NEXT n ROWS ONLY | OFFSET m ROWS FETCH NEXT n ROWS ONLY (12c+) |
| 自增主鍵 | GENERATED ALWAYS AS IDENTITY | GENERATED ALWAYS AS IDENTITY / SERIAL | AUTO_INCREMENT | IDENTITY(1,1) | GENERATED ALWAYS AS IDENTITY (12c+) / SEQUENCE |
| 字符串拼接 | \|\| | \|\| | CONCAT() / \|\| (SQL_MODE=PIPES_AS_CONCAT) | + | \|\| |
| IF/ELSE | CASE WHEN ... THEN ... ELSE ... END | CASE / IF() | IF() / CASE | CASE / IIF() | CASE / DECODE() |
「至少 select 的語法都是一樣的,除了少數差異外:select / from / where / group by / having / order by」—— 最佳回答強調核心 DML 統一性。