限制 SQL 的資料查詢筆數
常常在 SELECT 資料庫時,因為資料量龐大或是某些特殊原因,只想查詢特定筆數的資料,但因為各家資料庫的語法不盡相同,避免每次都要重新查詢一次,所以就整理起來。
Oracle
關鍵字 ROWNUM
,放在 WHERE
後方即可,範例語法如下:
上述語法的作用是查詢前 3 筆資料
1 | SELECT * FROM TABLE_NAME WHERE ROWNUM <= 3; |
需特別注意的地方有:
ROWNUM
會比ORDER BY
,GROUP BY
還要早執行,所以如果有使用這兩個子句的話,會發現顯示結果可能跟預期不同,建議用子查詢先包起來做ORDER BY
,GROUP BY
後再使用。ROWNUM
就像一個序列,把資料一筆一筆放進去,當放進第一筆資料時,其值為 1,並且判斷是否符合條件式。若符合,則留下資料;不符合的話,就將該筆資料刪除,放進下一筆資料,ROWNUM
從 1 開始。
用此語法會查無資料,因為永遠不會出現大於 3 的 ROWNUM
1 | SELECT * FROM TABLE_NAME WHERE ROWNUM > 3; |
查詢第 3 筆以後的資料
1 | SELECT * FROM |
取得第 2、3 筆資料
1 | SELECT * FROM |
MySQL
關鍵字 LIMIT
,可以接受一或兩個參數,範例如下:
查詢前 2 筆資料
1 | SELECT * FROM TABLE_NAME LIMIT 2; |
查詢第 2 到第 4 筆資料
1 | SELECT * FROM TABLE_NAME LIMIT 1, 3; |
SQL Server
在 SQL Server 中,查詢前 N 筆資料的語法為 TOP
,範例如下:
查詢前 3 筆資料
1 | SELECT TOP 3 * FROM TABLE_NAME; |
但若要在 SQL Server 中取出第 x 筆到第 y 筆資料,方法就有非常多種:
ROW_NUMBER
函式法:此函式會根據參數OVER
內的ORDER BY
順序給予資料列序號,再用這些序號當作條件去篩選,只適用於 SQL Server 2005 以上版本。查詢出第 2、3 筆資料1
2
3
4SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY ID) as ROWNUM
FROM TABLE_NAME
) a WHERE ROWNUM >= 2 and ROWNUM <= 3;TOP
相減法:將兩個TOP
查詢結果相減來取得區間資料(TOP 3 - TOP 1 = 第 2、3 筆)。1
2
3SELECT TOP 3 * FROM TABLE_NAME
MINUS
SELECT TOP 1 * FROM TABLE_NAME;- 大
TOP
包小TOP
法:先找出TOP 3
再倒序後找出其TOP 2
。使用這類功能時,切記要多注意1
2
3SELECT TOP 2 * FROM (
SELECT TOP 3 * FROM TABLE_NAME ORDER BY ID
) a ORDER BY ID DESC;ORDER BY
和GROUP BY
的使用,這會大大地影響回傳的資料內容。