주문 후 Oracle 쿼리에서 반환되는 행 수를 어떻게 제한합니까?


1032

Oracle쿼리에 MySQL limit절이 포함 된 것처럼 동작하도록 하는 방법이 있습니까?

에서는 MySQL,이 작업을 수행 할 수 있습니다 :

select * 
from sometable
order by name
limit 20,10

21에서 30 번째 줄을 얻으려면 (처음 20 개 건너 뛰고, 다음 10 개 줄). 행은. 다음에 선택 order by되므로 실제로 20 번째 이름에서 알파벳순으로 시작합니다.

에서은 Oracle, 사람들이 말할 수있는 유일한 것은입니다 rownum의사 열하지만, 평가 전에 order by 이 의미 :

select * 
from sometable
where rownum <= 10
order by name

이름순으로 임의의 열 행 10 개를 반환합니다. 일반적으로 내가 원하는 것이 아닙니다. 또한 오프셋을 지정할 수 없습니다.


16
SQL : 2008에서 표준화되었습니다.
dalle

14
제한이 오라클 12C 톰 카이트에 의해 발표되었다 ...
wolφi

14
결과 집합에서 다음 페이지를 가져 오시겠습니까?
Mathieu Longtin

3
@YaroslavShabalin 특히, 페이지 검색은이 패턴을 항상 사용합니다 . 모든 종류의 검색 기능이있는 거의 모든 앱에서 사용합니다. 다른 유스 케이스는 긴 목록 또는 테이블 클라이언트 측의 일부만로드하고 사용자에게 확장 옵션을 제공하는 것입니다.
jpmc26

3
@YaroslavShabalin 기본 데이터가로 변경되지 않으면 다른 결과 집합을 얻을 수 없습니다 ORDER BY. 그게 먼저 주문의 요점입니다. 기본 데이터가 변경되고 결과 집합이 변경되어 오래된 정보 대신 업데이트 된 결과를 사용자에게 표시하지 않는 이유는 무엇입니까? 또한 상태 관리는 가능한 한 피해야 할 전염병입니다. 그것은 합병증과 버그의 지속적인 원천입니다. 이것이 바로 기능성이 널리 보급되는 이유입니다. 그리고 메모리에서 전체 결과 집합을 만료하는 것을 언제 알 수 있습니까? 웹에서는 사용자가 언제 떠날 지 알 수 없습니다.
jpmc26

답변:


620

오라클 12C R1 (12.1)에서 시작, 거기에 있다 절을 제한하는 행 . 익숙한 LIMIT구문을 사용하지 않지만 더 많은 옵션으로 작업을 더 잘 수행 할 수 있습니다. 전체 구문은 여기에서 찾을 수 있습니다 . ( 이 답변 에서 Oracle의 내부 작동 방식에 대해 자세히 읽어보십시오 ).

원래 질문에 대답하기 위해 다음과 같은 쿼리가 있습니다.

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

(이전 Oracle 버전의 경우이 질문의 다른 답변을 참조하십시오)


예 :

링크 부패를 방지하기 위해 링크 된 페이지 에서 다음 예제를 인용했습니다 .

설정

CREATE TABLE rownum_order_test (
  val  NUMBER
);

INSERT ALL
  INTO rownum_order_test
SELECT level
FROM   dual
CONNECT BY level <= 10;

COMMIT;

테이블에 무엇입니까?

SELECT val
FROM   rownum_order_test
ORDER BY val;

       VAL
----------
         1
         1
         2
         2
         3
         3
         4
         4
         5
         5
         6
         6
         7
         7
         8
         8
         9
         9
        10
        10

20 rows selected.

N행 가져 오기

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;

       VAL
----------
        10
        10
         9
         9
         8

5 rows selected.

번째 행을 얻습니다. 행에 연결이 N있으면 묶인 행을 모두 가져옵니다.N

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS WITH TIES;

       VAL
----------
        10
        10
         9
         9
         8
         8

6 rows selected.

x행의 상위 %

SELECT val
FROM   rownum_order_test
ORDER BY val
FETCH FIRST 20 PERCENT ROWS ONLY;

       VAL
----------
         1
         1
         2
         2

4 rows selected.

페이지 매김에 매우 유용한 오프셋 사용

SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

       VAL
----------
         3
         3
         4
         4

4 rows selected.

오프셋과 백분율을 결합 할 수 있습니다

SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 20 PERCENT ROWS ONLY;

       VAL
----------
         3
         3
         4
         4

4 rows selected.


1
확장하자면 : OFFSET FETCH구문은 구문 설탕입니다. 세부 사항
Lukasz Szozda

793

이 같은 하위 쿼리를 사용할 수 있습니다

select *
from  
( select * 
  from emp 
  order by sal desc ) 
where ROWNUM <= 5;

자세한 정보는 On ROWNUM 주제 Oracle / AskTom의 결과 제한 주제 를 참조하십시오.

업데이트 : 하한과 상한으로 결과를 제한하기 위해 약간 더 부풀어 오른다.

select * from 
( select a.*, ROWNUM rnum from 
  ( <your_query_goes_here, with order by> ) a 
  where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum  >= :MIN_ROW_TO_FETCH;

(특정 AskTom 기사에서 복사)

업데이트 2 : Oracle 12c (12.1)부터는 행을 제한하거나 오프셋에서 시작할 수있는 구문이 있습니다.

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

더 많은 예는 이 답변 을 참조하십시오 . 힌트를 준 Krumia에게 감사합니다.


5
이것은 확실히하는 방법이지만 (tom tom 기사에서 알 수 있듯이) 최대 행 개수가 증가함에 따라 쿼리 성능이 저하됩니다. 이 방법은 처음 몇 페이지 만보고 싶은 쿼리 결과에 적합한 솔루션이지만, 전체 테이블을 통해 코드를 페이지 단위로 전환하는 메커니즘으로 사용하는 경우 코드를 리팩토링하는 것이 좋습니다.
Chris Gill

1
+1 하위 / 상위 버전은 실제로 상위 경계 rownum 절이 쿼리 속도를 크게 저하시키는 문제를 해결하는 데 실제로 도움이되었습니다.
Kelvin

1
Leigh Riffel은 "하나의 중첩 된 쿼리 만있는 분석 솔루션"입니다.
대런 cks

7
AskTom 기사에는 SELECT / * + FIRST_ROWS (n) / a 를 사용하는 최적화 힌트도 있습니다 . , rownum rnum 닫는 슬래시 앞에 별표가 있어야합니다. 그래서 그것을 제거하고 있습니다.
David Mann

1
Oracle 11의 경우 ROWNUM을 사용하는 외부 SELECT를 사용하면 UpdatableResultSet (ORA-01446 사용)에서 deleteRow를 호출 할 수 없습니다. 12c R1 변경을 기대하십시오!
nsandersen

185

다음과 같은 접근 방식에 대한 성능 테스트를 수행했습니다.

Asktom

select * from (
  select a.*, ROWNUM rnum from (
    <select statement with order by clause>
  ) a where rownum <= MAX_ROW
) where rnum >= MIN_ROW

분석적

select * from (
  <select statement with order by clause>
) where myrow between MIN_ROW and MAX_ROW

짧은 대안

select * from (
  select statement, rownum as RN with order by clause
) where a.rn >= MIN_ROW and a.rn <= MAX_ROW

결과

테이블에 천만 개의 레코드가 있고 정렬되지 않은 날짜 시간 행에 정렬되었습니다.

  • Explain Plan은 세 선택 모두에 대해 동일한 값을 나타 냈습니다 (323168)
  • 그러나 우승자는 AskTom입니다 (분석이 뒤 따름)

처음 10 개 행을 선택하면 다음이 수행됩니다.

  • AskTom : 28-30 초
  • 분석 : 33-37 초
  • 짧은 대안 : 110-140 초

100,000에서 100,010 사이의 행 선택 :

  • AskTom : 60 초
  • 분석 : 100 초

9,000,000에서 9,000,010 사이의 행 선택 :

  • AskTom : 130 초
  • 분석 : 150 초

잘 했어. > =와 <= 대신에 짧은 대안을 사용해 보셨습니까?
Mathieu Longtin

4
@MathieuLongtin BETWEEN>= AND <=( stackoverflow.com/questions/4809083/between-clause-versus-and ) 의 속기입니다.
wweicker

1
zeldi-어떤 버전입니까? Oracle은 11.1에서 분석 성능을 향상 시켰습니다. 그리고 11.2.
레이 리펠

@Leigh Riffel 10.2.0.5; 언젠가는 시간이 걸리고 11i 버전도 확인할 수 있습니다.
zeldi

5
몇 가지 빠른 테스트를 실행하고 12c에 대해 비슷한 결과를 얻었습니다. 새로운 offset구문은 분석 방식과 동일한 계획 및 성능을 갖습니다.
Jon Heller

55

하나의 중첩 쿼리 만있는 분석 솔루션 :

SELECT * FROM
(
   SELECT t.*, Row_Number() OVER (ORDER BY name) MyRow FROM sometable t
) 
WHERE MyRow BETWEEN 10 AND 20;

Rank()Row_Number()name에 대한 중복 값이있는 경우 예상 한 것보다 많은 레코드를 대체 할 수 있지만 더 많은 레코드를 리턴 할 수 있습니다 .


3
나는 분석을 좋아합니다. Rank ()와 Row_Number ()의 동작 차이가 무엇인지 명확히하고 싶을 수 있습니다.
Dave Costa

실제로, 왜 중복에 대해 생각하지 않았는지 확실하지 않습니다. 따라서이 경우 name에 중복 값이 ​​있으면 RANK가 예상보다 많은 레코드를 제공 할 수 있으므로 Row_Number를 사용해야합니다.
레이 리펠

언급 rank()하면 dense_rank()출력 제어에 더 유용 할 수 있습니다. 후자는 숫자를 건너 뛰지 않기 때문에 rank()할 수 있습니다. 어쨌든이 질문 row_number()에 가장 적합합니다. 다른 하나는이 기술이 언급 된 기능을 지원하는 모든 db에 적용 가능하다는 것입니다.
Used_By_Already

28

Oracle 12c에서 ( SQL 참조의 행 제한 절 참조 ) :

SELECT * 
FROM sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

53
그리고 물론, 그들은 지금까지 다른 사람들과는 완전히 다른 문법을 사용해야했습니다.
Mathieu Longtin

9
LIMITSQL : 2008 에 동의하기 위해 다른 모든 공급 업체들과 함께 앉은 후에 분명히 Microsoft의 책에서 잎을 꺼내 표준을 깨야했습니다.
beldaz

1
흥미롭게도 최근에 가장 최근의 표준에이 구문이 포함되어 있다고 들었습니다. 따라서 오라클은 구현하기 전에 먼저 표준을 푸시했을 것입니다. LIMIT ... OFFSET
의심

3
@Derek : 예, 표준을 따르지 않는 것이 유감입니다. 그러나 12cR1에 새로 도입 된 기능은 단순한 것보다 강력합니다 LIMIT n, m(내 대답 참조). 그런 다음 오라클은 LIMIT n, m구문 설탕으로 구현 했어야 합니다 OFFSET n ROWS FETCH NEXT m ROWS ONLY.
sampathsris

10
@Derek : 사실, PostgreSQL 매뉴얼 postgresql.org/docs/9.0/static/sql-select.html#AEN69535 에서이 설명이 나타났습니다. "LIMIT 및 OFFSET 절은 PostgreSQL 관련 구문이며 MySQL에서도 사용됩니다. SQL : 2008 표준은 동일한 기능에 대해 OFFSET ... FETCH {FIRST | NEXT} ... 절을 도입했습니다. 따라서 LIMIT는 표준의 일부가 아닙니다.
beldaz

14

순서가있는 페이지 매김 쿼리는 Oracle에서 실제로 까다 롭습니다.

Oracle은 데이터베이스가 테이블 또는 조인 된 뷰 집합에서 행을 선택하는 순서를 나타내는 숫자를 반환하는 ROWNUM 의사 열을 제공합니다.

ROWNUM은 많은 사람들을 곤경에 빠뜨리는 의사 열입니다. ROWNUM 값은 행에 영구적으로 할당되지 않습니다 (일반적인 오해). ROWNUM 값이 실제로 할당되면 혼동 될 수 있습니다. ROWNUM 값은 쿼리의 필터 술어통과 한 후 쿼리 집계 또는 정렬 전에 행에 지정됩니다 .

또한 ROWNUM 값은 지정된 후에 만 ​​증가합니다.

이것이 후속 쿼리가 행을 반환하지 않는 이유입니다.

 select * 
 from (select *
       from some_table
       order by some_column)
 where ROWNUM <= 4 and ROWNUM > 1; 

쿼리 결과의 첫 번째 행은 ROWNUM> 1 술어를 전달하지 않으므로 ROWNUM은 2로 증가하지 않습니다. 따라서 ROWNUM 값이 1보다 크지 않으므로 쿼리는 행을 리턴하지 않습니다.

올바르게 정의 된 쿼리는 다음과 같아야합니다.

select *
from (select *, ROWNUM rnum
      from (select *
            from skijump_results
            order by points)
      where ROWNUM <= 4)
where rnum > 1; 

Vertabelo 블로그의 기사에서 페이지 매김 쿼리에 대해 자세히 알아보십시오 .


2
쿼리 결과의 첫 번째 행은 ROWNUM> 1 술어 (…)를 전달하지 않습니다 .이를 설명하는 찬성입니다.
Piotr Dobrogost

6

SQL 표준

이 기사 에서 설명했듯이 SQL : 2008 Standard는 다음과 같은 구문을 제공하여 SQL 결과 집합을 제한합니다.

SELECT
    title
FROM
    post
ORDER BY
    id DESC
FETCH FIRST 50 ROWS ONLY

Oracle 11g 및 이전 버전

버전 12c 이전에는 Top-N 레코드를 가져 오기 위해 파생 테이블과 ROWNUM 의사 열을 사용해야했습니다.

SELECT *
FROM (
    SELECT
        title
    FROM
        post
    ORDER BY
        id DESC
)
WHERE ROWNUM <= 50

5

적은 SELECT 문. 또한 성능 소모가 적습니다. 크레딧 : anibal@upf.br

SELECT *
    FROM   (SELECT t.*,
                   rownum AS rn
            FROM   shhospede t) a
    WHERE  a.rn >= in_first
    AND    a.rn <= in_first;

2
또한, 완전히 잘못된 답변입니다. 정렬 후 제한에 관한 질문이었습니다. 따라서 행 번호는 하위 쿼리에서 벗어나야합니다.
BitLord

5

수용된 답변 의 확장으로서 오라클은 내부적으로 ROW_NUMBER/RANK함수를 사용 합니다. OFFSET FETCH구문은 구문 설탕입니다.

DBMS_UTILITY.EXPAND_SQL_TEXT절차 를 사용하여 관찰 할 수 있습니다 .

샘플 준비 :

CREATE TABLE rownum_order_test (
  val  NUMBER
);

INSERT ALL
  INTO rownum_order_test
SELECT level
FROM   dual
CONNECT BY level <= 10;
COMMIT;

질문:

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;

규칙적이다 :

SELECT "A1"."VAL" "VAL" 
FROM  (SELECT "A2"."VAL" "VAL","A2"."VAL" "rowlimit_$_0",
               ROW_NUMBER() OVER ( ORDER BY "A2"."VAL" DESC ) "rowlimit_$$_rownumber" 
      FROM "ROWNUM_ORDER_TEST" "A2") "A1" 
WHERE "A1"."rowlimit_$$_rownumber"<=5 ORDER BY "A1"."rowlimit_$_0" DESC;

db <> 바이올린 데모

확장 된 SQL 텍스트를 가져 오는 중 :

declare
  x VARCHAR2(1000);
begin
 dbms_utility.expand_sql_text(
        input_sql_text => '
          SELECT val
          FROM   rownum_order_test
          ORDER BY val DESC
          FETCH FIRST 5 ROWS ONLY',
        output_sql_text => x);

  dbms_output.put_line(x);
end;
/

WITH TIES다음과 같이 확장됩니다 RANK.

declare
  x VARCHAR2(1000);
begin
 dbms_utility.expand_sql_text(
        input_sql_text => '
          SELECT val
          FROM   rownum_order_test
          ORDER BY val DESC
          FETCH FIRST 5 ROWS WITH TIES',
        output_sql_text => x);

  dbms_output.put_line(x);
end;
/

SELECT "A1"."VAL" "VAL" 
FROM  (SELECT "A2"."VAL" "VAL","A2"."VAL" "rowlimit_$_0",
              RANK() OVER ( ORDER BY "A2"."VAL" DESC ) "rowlimit_$$_rank" 
       FROM "ROWNUM_ORDER_TEST" "A2") "A1" 
WHERE "A1"."rowlimit_$$_rank"<=5 ORDER BY "A1"."rowlimit_$_0" DESC

오프셋 :

declare
  x VARCHAR2(1000);
begin
 dbms_utility.expand_sql_text(
        input_sql_text => '
          SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY',
        output_sql_text => x);

  dbms_output.put_line(x);
end;
/


SELECT "A1"."VAL" "VAL" 
FROM  (SELECT "A2"."VAL" "VAL","A2"."VAL" "rowlimit_$_0",
             ROW_NUMBER() OVER ( ORDER BY "A2"."VAL") "rowlimit_$$_rownumber" 
       FROM "ROWNUM_ORDER_TEST" "A2") "A1" 
       WHERE "A1"."rowlimit_$$_rownumber"<=CASE  WHEN (4>=0) THEN FLOOR(TO_NUMBER(4)) 
             ELSE 0 END +4 AND "A1"."rowlimit_$$_rownumber">4 
ORDER BY "A1"."rowlimit_$_0"

3

Oracle 12C를 사용하지 않는 경우 아래와 같이 TOP N 쿼리를 사용할 수 있습니다.

SELECT *
 FROM
   ( SELECT rownum rnum
          , a.*
       FROM sometable a 
   ORDER BY name
   )
WHERE rnum BETWEEN 10 AND 20;

다음과 같이 with 절에서 this 절을 이동할 수도 있습니다.

WITH b AS
( SELECT rownum rnum
      , a.* 
   FROM sometable a ORDER BY name
) 
SELECT * FROM b 
WHERE rnum BETWEEN 10 AND 20;

실제로 인라인 뷰를 만들고 행 번호를 rnum으로 바꾸는 중입니다. 기본 쿼리에서 rnum을 필터 기준으로 사용할 수 있습니다.


1
제 경우에는 올바른 행을 반환하지 않았습니다. 내가 고 쳤던 ORDER BY것은 rownum별도로 수행하는 것입니다 . 기본적으로 나는 ORDER BY절이 있는 하위 쿼리를 만들었습니다 .
패트릭 그레고리오

정답이 답답하다. 정렬 후 제한에 대한 질문이므로 rownum하위 쿼리 외부에 있어야합니다.
Piotr Dobrogost

@PiotrDobrogost rownum은 외부에만 있습니다.
sandi

2

12c에 대해 검증 된 Oracle 1z0-047 시험을 준비하기 시작했습니다. 준비하는 동안 'FETCH FIRST'로 알려진 12c 개선 사항을 발견했습니다. 편의성에 따라 행 / 제한 행을 가져올 수 있습니다. 여러 옵션을 사용할 수 있습니다

- FETCH FIRST n ROWS ONLY
 - OFFSET n ROWS FETCH NEXT N1 ROWS ONLY // leave the n rows and display next N1 rows
 - n % rows via FETCH FIRST N PERCENT ROWS ONLY

예:

Select * from XYZ a
order by a.pqr
FETCH FIRST 10 ROWS ONLY

3
stackoverflow.com/a/26051830/635608- 이것은 이미 다른 답변에서 제공되었습니다. 몇 달 전에 이미 게시 된 내용은 게시하지 마십시오.
Mat

1
오, 물론, 모든 대답을 겪지 않았고, 나는 초기에 하위 쿼리를 보았습니다.
arjun gaur 2016 년

1
select * FROM (SELECT 
   ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID, 
 FROM EMP ) EMP  where ROWID=5

값보다 큰 경우

select * FROM (SELECT 
       ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID, 
     FROM EMP ) EMP  where ROWID>5

그보다 적은 값

select * FROM (SELECT 
       ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID, 
     FROM EMP ) EMP  where ROWID=5

ROW_NUMBER()기반 솔루션 으로서의 Downvote는 Leigh Riffel에 의해 이미 게시되었습니다. 중독으로 표시된 코드에 구문 오류가 있습니다.
Piotr Dobrogost

1

쿼리에서 반환 된 각 행에 대해 ROWNUM 의사 열은 Oracle이 테이블 또는 조인 된 행 집합에서 행을 선택하는 순서를 나타내는 숫자를 반환합니다. 선택된 첫 번째 행의 ROWNUM은 1이고 두 번째 행은 2입니다.

  SELECT * FROM sometable1 so
    WHERE so.id IN (
    SELECT so2.id from sometable2 so2
    WHERE ROWNUM <=5
    )
    AND ORDER BY so.somefield AND ROWNUM <= 100 

나는 이것을 oracle서버 에서 구현했다11.2.0.1.0


질문이 정렬 된 행을 제한하는 것에 대해 질문 하고 순서가없는 경우
Piotr Dobrogost

@PiotrDobrogost 큰 작업이 아니라는 것을 이해하십시오. 키워드를 주문하는 것은 모든 rdbms에 공통적입니다.
Sumesh TG

-1

SQL-Developer의 경우 처음 50 개 행만 자동으로 가져옵니다. 그리고 아래로 스크롤하면 50 행을 더 가져옵니다.

따라서 sql-developer 도구의 경우 정의 할 필요가 없습니다!


-3

오라클

SELECT val FROM   rownum_order_test ORDER BY val DESC FETCH FIRST 5 ROWS ONLY;

    10
    10
     9
     9
     8

5 개 행이 선택되었습니다.

SQL>


7
Oracle 12c부터 적용되도록 지정하고 어딘가에서 복사 / 붙여 넣기를 지정해야합니다. 항상 소스를 인용하십시오.
Mat

소스는 @Mat입니다. 그리고 Rakesh, 최소한 원래 질문에 대한 답변을 수정하십시오. 또한 동일한 출처를 인용하는 답변을 제공했지만 포괄적이고 원래 출처를 인용하려고했습니다.
sampathsris

-4

이 같은 일이 일을 할 수도 있습니다

WITH
base AS
(
    select *                   -- get the table
    from sometable
    order by name              -- in the desired order
),
twenty AS
(
    select *                   -- get the first 30 rows
    from base
    where rownum < 30
    order by name              -- in the desired order
)
select *                       -- then get rows 21 .. 30
from twenty
where rownum > 20
order by name                  -- in the desired order

분석 기능 순위도 있으며 주문에 사용할 수 있습니다.


2
ROWNUM이 결과 집합의 열이므로 마지막 WHERE 조건이 항상 거짓이므로 단일 행을 반환하지 않습니다. 또한 ROWNUM 및 ORDER BY 보증 주문을 사용할 수 없습니다.
Ben

2
우수한. 이것을 다른 사람들에게 경고로 남겨 두겠습니다.
EvilTeach

-5

위의 수정 사항과 동일합니다. 작동하지만 확실히 예쁘지 않습니다.

   WITH
    base AS
    (
        select *                   -- get the table
        from sometable
        order by name              -- in the desired order
    ),
    twenty AS
    (
        select *                   -- get the first 30 rows
        from base
        where rownum <= 30
        order by name              -- in the desired order
    )
    select *                       -- then get rows 21 .. 30
    from twenty
    where rownum < 20
    order by name                  -- in the desired order

솔직히 위의 답변을 사용하는 것이 좋습니다.


5
ORDER BY 전에 WHERE 절이 평가되므로 이는 올바르지 않습니다.
Ben

3
흥미롭게도 아래의 나쁜 대답에서 도난당했습니다.
EvilTeach
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.