표에서 ID가 가장 큰 전체 행을 어떻게 선택합니까?


답변:


228

부속 선택을 사용할 수 있습니다.

SELECT row 
FROM table 
WHERE id=(
    SELECT max(id) FROM table
    )

의 값이 max(id)고유하지 않으면 여러 행이 반환됩니다.

그러한 행을 하나만 원하면 @MichaelMior의 답변을 사용하십시오.

SELECT row from table ORDER BY id DESC LIMIT 1

6
@AlirezaSoori : 이름에도 불구하고 id테이블의 열입니다. id열의 값 이 고유해야 한다는 보장은 없습니다 .
unutbu

1
@unutbu id기본 또는 고유 키가 아니라고 가정 :) 이름이 주어지면 합리적 일 가능성이 있습니다. 또한 사용중인 DBMS에 따라 subselect를 사용한 접근 방식이 훨씬 덜 효율적일 수 있습니다.
Michael Mior

3
@MichaelMior : id외래 키일 수 있으며,이 경우 고유하지 않을 수 있습니다. 나는 일부 벤치마킹을 사용 set profiling = 1; ...; show profiles했고 우리의 솔루션은 MySQL을 사용하는 것과 동일한 성능을 보입니다. 내 자신의 지식으로, DBMS가 하위 선택에 대한 성능이 떨어지는 것을 알고 있습니까?
unutbu

1
외래 키 일 수는 있지만 말한 것처럼 이름이 아닌 다른 이름으로 추측하고 있습니다. MySQL은 역사적으로 하위 선택에서 성능이 좋지 않은 것으로 알려져 있습니다. 최신 버전에서는 크게 향상되었으므로 사용중인 버전에 따라 다릅니다. 그러나 다시 생각하면이 특정 쿼리는 정상 일 수 있습니다. 프로파일 링을 사용하여 쿼리를 몇 번 실행한다고해서 반드시 상대 성능에 대해 많은 것을 말하지는 않습니다.
Michael Mior

149

당신은 또한 할 수 있습니다

SELECT row FROM table ORDER BY id DESC LIMIT 1;

ID별로 내림차순으로 행을 정렬하고 첫 번째 행을 반환합니다. 이것은 최대 ID를 가진 행을 반환하는 것과 같습니다. 물론 이것은 id모든 행에서 고유 하다고 가정합니다 . 그렇지 않으면 최대 값을 가진 여러 행이있을 수 있으며 id하나만 얻을 수 있습니다.


OP가 요구하는 것을 구체적으로 수행하기 위해이 작업을 수행합니다. 그러나 다른 답변은 SQL 구조에 대한 더 나은 교육을 제공합니다 :)
MatBailie

@Dems 어떻게? 다른 답변에 대한 설명이 없습니까? 물론
그것도

다른 질문은 논리를 리팩토링하지 않고 구문을 수정합니다. 따라서 OP는 특정 SQL을 올바르게 나타내는 방법을 배웁니다.
MatBailie

페어 포인트 :) 다른 답변은 여전히 ​​논리를 수정하고 있습니다.
Michael Mior

성능은 어떻습니까? 나는 이미 나를 위해 일하는 이런 종류의 쿼리로 여기에 왔지만 그것이 올바른 방법인지 궁금했다. O (n * log n) 연산으로 주문하지 않습니까?
12:58에

27
SELECT * 
FROM table 
WHERE id = (SELECT MAX(id) FROM TABLE)

@ shA.t SELECT entry FROM table WHERE id = MAX(id)가 작동하지 않습니까 ?!
oldboy

@ shA.t 또한 다음과 같은 작업을 수행하려고 합니다. 데이터베이스에서 가장 최근 항목이 SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)필요 entry_time합니다. 그 진술은 충분합니까 아니면 다음과 같아야합니다.SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
oldboy

쿼리 결과에서 가장 최근 항목에 대해 신뢰할 수있는 의미가 없으므로 삽입 시간 등의 필드가 필요합니다. BTW, 별도로 질문하십시오. 더 많은 관심을 끌기를 바랍니다 -HTH;).
shA.t

17

테이블에 "전체 스캔"이 order by있기 때문에 줄 수 없습니다 order by.

다음 쿼리가 더 좋습니다.

SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);

18
ORDER BYid이것이 테이블의 기본 키 라고 가정하면 전체 스캔을 수행하지 않습니다 . 그렇지 않은 경우 이름이 잘못 지정됩니다. 그렇지 MAX(id)않은 경우 전체 테이블 스캔없이 어떻게 작업 할 수 있습니까? 인덱스가 없으면 최대 값을 찾기 위해 모든 값을 계속 확인해야합니다.
Michael Mior

@CakeLikeBoss 잘 "실제로"질문과 "SELECT * FROM 테이블 어디에서 id = (SELECT MAX (id) FROM 테이블);" 두 번째 쿼리는 0.0007 0.0010에 초에서했다 동안 114 행의 테이블에 쿼리이 쿼리 내가이 여러 번 반복 할 때마다 정확히 0.0004 초 걸렸다 동안
prabhjot을

1

하나는 항상 분석 기능을 사용할 수 있으며 더 많은 제어 기능을 제공합니다.

select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1

데이터 유형에 따라 rank () 함수에 문제가 발생하면 row_number () 또는 dense_rank () 중에서 선택할 수 있습니다.


0

이것으로 시도

 SELECT top 1  id, Col2,  row_number() over (order by id desc)  FROM Table

9
MySQL에서 TOP 키워드가 작동하지 않습니다. 이 쿼리는 작동하지 않습니다.
애니 루다 굽타

@toddmo : MySQL! 그리고 Sql-Server는 다른 사람들에게도 도움이되지 않습니다. MS-SQL을 의미합니까?
raiserle

@raiserle, 내가이 질문에 대해 의견을 남겼거나 게시 한 곳을 찾도록 도와 줄 수 있습니까? 이 질문에 내 이름이 첨부되어 있지 않습니다.
toddmo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.