SELECT [ALL | DISTINCT] <列表達式1> [, <列表達式2> ...] FROM <表1> [, <表2> ...] [WHERE <篩選條件>] [GROUP BY <分組表達式> [HAVING <分組條件>]] [ORDER BY <列> [ASC | DESC]]
hkb_test_score (score_id, score)SELECT a.score_id, a.score FROM (SELECT * FROM hkb_test_score ORDER BY score DESC) a WHERE ROWNUM <= 5;
SELECT a.score_id, a.score FROM (SELECT * FROM hkb_test_score ORDER BY score DESC) a WHERE ROWNUM <= 5 MINUS SELECT a.score_id, a.score FROM (SELECT * FROM hkb_test_score ORDER BY score DESC) a WHERE ROWNUM <= 4;
SELECT * FROM hkb_test_score a WHERE a.score IN ( SELECT score FROM hkb_test_score GROUP BY score HAVING COUNT(*) = 2 );
測試資料:
hkb_test2: (a,1) (b,2) (c,3) (g,4) hkb_test3: (a,1) (b,2) (e,3) (f,4)
| 運算子 | 結果筆數 | 說明 |
|---|---|---|
UNION | 6 | 合併並去重 (排序) |
UNION ALL | 8 | 合併保留重複 (不排序,效能最佳) |
INTERSECT | 2 | 交集 (去重) |
MINUS | 2 | 差集 (test2 - test3,去重) |
-- 建表 CREATE TABLE Employee ( ID VARCHAR2(4) PRIMARY KEY, First_Name VARCHAR2(10), Last_Name VARCHAR2(10), Start_Date DATE, End_Date DATE, Salary NUMBER(8,2), City VARCHAR2(10), Description VARCHAR2(15) ); -- 插入 8 筆測試資料 (略) -- 基本查詢 SELECT id, first_name, last_name FROM employee;
Oracle 無 `LIMIT`/`TOP`,標準模式:內層排序 → 外層 ROWNUM 過濾。
SELECT * FROM ( SELECT * FROM customer ORDER BY name ) WHERE ROWNUM <= 3 ORDER BY ROWNUM ASC;
結果:按 name 字母序前 3 筆 (eighth, fifth, first)。
SELECT id, name FROM (
SELECT ROWNUM recno, id, name FROM (
SELECT * FROM customer ORDER BY name
) WHERE ROWNUM <= 3
ORDER BY ROWNUM ASC
) WHERE recno = 2;
結果:第 2 筆 → fifth。
SELECT id, name FROM (
SELECT ROWNUM recno, id, name FROM (
SELECT * FROM customer ORDER BY name
) WHERE ROWNUM <= 2
ORDER BY ROWNUM ASC
) WHERE recno = 2;
SELECT id, name FROM (
SELECT ROWNUM recno, id, name FROM (
SELECT * FROM customer ORDER BY name
) WHERE ROWNUM <= (M + X - 1)
ORDER BY ROWNUM ASC
) WHERE recno BETWEEN M AND (M + X - 1);
範例:第 2 筆起 3 筆 → `WHERE ROWNUM <= 4` + `recno BETWEEN 2 AND 4`。
-- 12c 標準 SQL 分頁 SELECT * FROM customer ORDER BY name OFFSET 1 ROWS FETCH NEXT 3 ROWS ONLY; -- 跳過 1 筆,取 3 筆