2009-02-27 4 views
26

Có một thay thế ANSI SQL nào cho từ khóa MYSQL LIMIT không?Có một thay thế ANSI SQL nào cho từ khóa MYSQL LIMIT không?

giới hạn từ khóa giới hạn số lượng hàng trả lại do một ví dụ CHỌN:

SELECT * FROM People WHERE Age > 18 LIMIT 2; 

returns 2 hàng.

SELECT * FROM People WHERE Age > 18 LIMIT 10, 2; 

returns 2 hàng sau khi người đầu tiên 10.

+0

Um ... Những ai biết Ansi SQL có thể giúp bạn nếu bạn nói với chúng tôi những gì MySql LIMIT từ khóa đã ... –

+0

James, SELECT * FROM tên_bảng LIMIT x trả về x đầu tiên kết quả, và SELECT * FROM bảng LIMIT x, y trả về kết quả y với độ lệch của x. – Aistina

+0

@Aistina: Huh. Tôi không biết phiên bản LIMIT x, y - rất tiện dụng! – Ben

Trả lời

31

this shows the different ways:

-- DB2 
select * from table fetch first 10 rows only 
-- Informix 
select first 10 * from table 
-- Microsoft SQL Server and Access 
select top 10 * from table 
-- MySQL and PostgreSQL 
select * from table limit 10 
-- Oracle 
select * from (select * from table) where rownum <= 10 
+7

Tôi luôn nghĩ nó là vô lý mà Oracle làm cho bạn làm một subselect để làm điều đó theo cách này, nhưng tài sản rownum được giao trước khi sắp xếp lại với ORDER BY. – Powerlord

+0

'oraclese' có ưu và nhược điểm của nó? Tôi thích cách viết tắt của Oracle (+) để tham gia bên ngoài ... – jle

+2

+1 tóm tắt thú vị! SQLite hỗ trợ LIMIT, như MySQL/PostgreSQL. Hỗ trợ InterBase/Firebird SELECT FIRST và SKIP, như Informix. –

3

Tôi không tin như vậy. Tất cả các cơ sở dữ liệu mà tôi biết sử dụng từ khóa dành riêng cho nhà cung cấp cho chức năng đó.

20

Không có trong SQL: 1999.

Có hai cách tiếp cận có thể bạn có thể sử dụng trong các tiêu chuẩn sau, với mức hỗ trợ thường thấp trong DBMS ngày nay.

Trong SQL: 2008 bạn có thể sử dụng cú pháp DB/2:

SELECT * FROM things 
ORDER BY smell 
FETCH FIRST n ROWS ONLY 

chỉ này hoạt động cho “LIMIT n” và không phải là mở rộng “LIMIT m, n” bù đắp cú pháp. Trong SQL: 2003, bạn có thể sử dụng các hàm cửa sổ, có thể hỗ trợ cú pháp mở rộng nhưng là một siêu PITA:

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY smell) AS rn, 
    FROM things 
) 
WHERE rn<=n -- or rn BETWEEN m+1 AND m+n 

Bạn sẽ thường sử dụng các phương pháp cụ thể DBMS ngày hôm nay.

1

HSQL/H2 sử dụng LIMIT như MySQL

6

cũng thấy http://en.wikipedia.org/wiki/Select_(SQL)#FETCH_FIRST_clause

SELECT * FROM T LIMIT 10 OFFSET 20 -- Netezza, MySQL, PostgreSQL (also supports the standard, since version 8.4), SQLite, HSQLDB, H2 

SELECT * from T WHERE ROWNUM <= 10 -- Oracle (also supports the standard, since Oracle8i) 

SELECT FIRST 10 * from T -- Ingres 

SELECT FIRST 10 * FROM T order by a -- Informix 

SELECT SKIP 20 FIRST 10 * FROM T order by c, d -- Informix (row numbers are filtered after order by is evaluated. SKIP clause was introduced in a v10.00.xC4 fixpack) 

SELECT TOP 10 * FROM T -- MS SQL Server, Sybase ASE, MS Access 

SELECT TOP 10 START AT 20 * FROM T -- Sybase SQL Anywhere (also supports the standard, since version 9.0.1) 

SELECT FIRST 10 SKIP 20 * FROM T -- Interbase, Firebird 

SELECT * FROM T ROWS 20 TO 30 -- Firebird (since version 2.1) 

SELECT * FROM T 
WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY -- DB2 

SELECT * FROM T 
WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY -- DB2 (new rows are filtered after comparing with key column of table T) 
0

Hãy để tôi liên kết ở đây một câu hỏi liên quan SO, với một great answer by Lukas Edergood answer by bobince khác:

How universal is the LIMIT statement in SQL?

chỉnh sửa: Một vài chi tiết liên kết tài liệu tham khảo tốt, giá trị để xem trong các trường hợp tương tự: