inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[백문이불여일타] 데이터 분석을 위한 고급 SQL

사용자정의함수 리트코드 문제풀이 3 + LIMIT, OFFSET

NULL 처리

254

miji.lee

작성한 질문수 11

1

강사님 안녕하세요.

1. 저는 다음과 같이 코드를 작성했어요.

CREATE FUNCTION getNthHighestSalary (N INT)

    returns INT

    BEGIN

    RETURN(

        SELECT DISTINCT MIN(salary)

        FROM employee

        ORDER BY salary DESC

        LIMIT O, N);

END

큰 순서대로 0번 이후부터 (1번부터) N개 나열 후 최소값을 찾을 생각이었는데, 자꾸 200이 아닌 100이 나옵니다. 

아무래도 ORDER BY DESC가 제대로 작동하지 않는 것 같은데 이유가 뭘까요??

2. LIMIT에서 결과가 나오지 않으면 NULL을 돌려주기때문에  서브쿼리에서 IF문/CASE문을 안써도 된다고 하셨는데,(6:00) 이 부분이 잘 이해가 안가요.

CASE문 쿼리 (함수 부분은 생략하겠습니다)

SELECT CASE WHEN count(sal.salary) <n THEN null

 ELSE min(sal.salary)

 END

FROM

            (SELECT DISTINCT salary

            FROM employee

            ORDER BY salary desc

            LIMIT n) as sal)

LIMIT OFFSET 쿼리 

SELECT DISTINCT salary

FROM employee

ORDER BY salary DESC

LIMIT 1,N

은 크게 다를 것 없는 것 같은데,

첫번째는 NULL 나오게 하려고 서브쿼리 & CASE WHEN 처리를 하는 반면, 두번째는 그냥 NULL이 나온다고 하시는데 왜 두개가 다른건지 잘 모르겠습니다.

sql

답변 1

0

송혜정

안녕하세요 miji.lee님, 답변 드립니다.


1. SQL 실행 순서에 익숙치 않아, 생각하신 로직을 쿼리에 정확히 반영되지 않은 것으로 보입니다.
SQL의 여러 절에는 실행 순서가 존재합니다. 작성해주신 쿼리에서는 FROM > SELECT > ORDER BY > LIMIT의 순서로 실행이 됩니다. 따라서 MIN()함수가 먼저 실행된 후 ORDER BY와 LIMIT이 실행되기 때문에 의도하신 결과와 다르게 실행이 된 것으로 보입니다.
이 경우, 서브쿼리를 사용하여 MIN()함수가 가장 마지막에 실행될 수 있도록 하면 정답 '200'이 출력됩니다.

참고하실 수 있도록 쿼리 실행 순서를 설명한 웹사이트의 링크를 첨부합니다.
Defining SQL order of execution

2. 적어주신 쿼리에서 LIMIT OFFSET 쿼리 의 경우, LIMIT 1,N 이 아닌 LIMIT N,1로 바꿔주셔야 합니다.
LIMIT N,1은 N+1번째의 데이터를 가져온다는 의미이기 때문에, 애초에 그만큼의 데이터가 없다면 NULL로 출력될 것입니다.
CASE문 쿼리에서는 LIMIT N,1의 역할을 CASE문이 하고 있습니다. (DISTINCT한 salary의 개수가 N개 미만이라면 NULL을 출력, 그렇지 않으면 salary의 최솟값 출력)

감사합니다.

순위 함수 연습 문제 - 스테디셀러 작가 찾기

0

84

1

문제 내용이 잘못된 것 같습니다.

0

57

2

서브쿼리 질문

0

59

2

[수업질문] 서브쿼리 > null데이터 avg사용 주의

0

72

1

서브쿼리는 언제 작성하는건가요?

0

66

1

안녕하세요 질문드립니다.

0

66

2

Top Earners 문제관련 질문

0

95

2

고급반 cheetsheet

0

145

2

196. Delete Duplicate Emails 좋은 코드 질문

0

140

1

a.id = 1과 b.id=1이 없어도 되는 이유

0

125

0

강의 플랫폼

0

197

3

리트코드 177번 function 풀이중 case when 활용을 위한 서브쿼리 구문을 제출 시 검증에 통과되지 않도록 보강된 듯 하네요

0

203

2

ERD 읽는법에 추가 질문 있어요

0

249

1

lead, lag로 풀이할 시 id 값이 존재하지 않는 경우의 오답

0

355

2

사용자정의함수

0

230

1

이 문제 inner join이 이해가 안됩니다.

0

294

1

평균 함수 사용할 때 주의점과 해결법

0

259

1

196. subquery로 풀 때, 궁금한 점

0

382

2

쿼리성능 질문드립니다.

0

311

1

리트코드 highest department salary 문제

0

257

2

The report 문제 order by부분 질문

0

268

2

리트코드 서브쿼리 문제 질문

0

418

1

DEPARTMENT HIGHEST SALARY 서브쿼리 문제 문의

0

233

1

서브쿼리의 활용사례 및 조인관련질문

0

281

1