[mysql] SQL 데이터베이스 테이블에서 n 번째 행을 선택하는 방법은 무엇입니까?

데이터베이스 테이블에서 n 번째 행 을 선택하는 (이상적으로) 데이터베이스 불가지론 적 방법을 배우고 싶습니다 . 다음 데이터베이스의 고유 기능을 사용하여 이것이 어떻게 달성 될 수 있는지 보는 것도 흥미로울 것입니다.

  • SQL 서버
  • MySQL
  • PostgreSQL
  • SQLite
  • 신탁

현재 SQL Server 2005에서 다음과 같은 작업을 수행하고 있지만 다른 더 독립적 인 접근 방식을 보는 데 관심이 있습니다.

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

위의 SQL에 대한 크레딧 : Firoz Ansari의 웹 로그

업데이트 : SQL 표준에 관한 Troels Arvin의 답변을 참조하십시오 . 트롤, 우리가 인용 할 수있는 링크가 있습니까?



답변

표준의 선택적 부분 에서이 작업을 수행하는 방법이 있지만 많은 데이터베이스가 자체 작업 방식을 지원합니다.

이것과 다른 것들에 대해 이야기하는 정말 좋은 사이트는 http://troels.arvin.dk/db/rdbms/#select-limit 입니다.

기본적으로 PostgreSQL 및 MySQL은 비표준을 지원합니다.

SELECT...
LIMIT y OFFSET x 

Oracle, DB2 및 MSSQL은 표준 윈도우 기능을 지원합니다.

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
) AS foo
WHERE rownumber <= n

(위의 DB를 사용하지 않기 때문에 위의 사이트에서 방금 복사했습니다)

업데이트 : PostgreSQL 8.4부터 표준 윈도우 기능이 지원되므로 PostgreSQL에서도 두 번째 예제가 작동 할 것으로 예상됩니다.

업데이트 : SQLite는 2018-09-15의 버전 3.25.0에서 창 기능 지원을 추가 했으므로 두 형식 모두 SQLite에서 작동합니다.


답변

PostgreSQL은 SQL 표준에 의해 정의 된 윈도우 기능 을 지원 하지만 어색하므로 대부분의 사람들은 (비표준) LIMIT/OFFSET :

SELECT
    *
FROM
    mytable
ORDER BY
    somefield
LIMIT 1 OFFSET 20;

이 예는 21 번째 행을 선택합니다. OFFSET 20Postgres에 처음 20 개의 레코드를 건너 뛰라고 지시합니다. ORDER BY조항을 지정하지 않으면 어떤 레코드를 되 찾을 것이라는 보장이 없으며, 거의 유용하지 않습니다.


답변

나머지는 확실하지 않지만 SQLite와 MySQL에는 “기본”행 순서가 없습니다. 이 두 방언에서 최소한 다음 스 니펫은 추가 된 날짜 / 시간을 기준으로 정렬하여 the_table에서 15 번째 항목을 가져옵니다.

SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15

(물론 DATETIME 필드를 추가하고 항목을 추가 한 날짜 / 시간으로 설정해야합니다.)


답변

SQL 2005 이상에는이 기능이 내장되어 있습니다. ROW_NUMBER () 함수를 사용하십시오. << 이전 및 다음 >> 스타일 브라우징 기능이있는 웹 페이지에 적합합니다.

통사론:

SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
            *
        FROM
            Table_1
    ) sub
WHERE
    RowNum = 23


답변

나는 이것이 비효율적이라고 생각하지만 아주 간단한 접근법이며, 시도한 작은 데이터 세트에서 작동했습니다.

select top 1 field
from table
where field in (select top 5 field from table order by field asc)
order by field desc

이것은 다섯 번째 항목을 얻고 두 번째 최상위 숫자를 변경하여 다른 n 번째 항목을 얻습니다

SQL 서버에서만 (제 생각에는) ROW_NUMBER ()를 지원하지 않는 이전 버전에서 작동해야합니다.


답변

1 작은 변화 : n 대신 n-1.

select *
from thetable
limit n-1, 1


답변

SQL Server에서 확인하십시오.

Select top 10 * From emp
EXCEPT
Select top 9 * From emp

이것은 당신에게 emp 테이블의 10 번째 줄을 줄 것입니다!