인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

mijileekr1491's profile image
mijileekr1491

asked

[A hundred words are not as good as seeing once] Advanced SQL for data analysis

User-defined function LeetCode Problem Solving 3 + LIMIT, OFFSET

NULL 처리

Written on

·

241

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

Answer 1

0

sdatarian님의 프로필 이미지
sdatarian
Instructor

안녕하세요 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의 최솟값 출력)

감사합니다.

mijileekr1491's profile image
mijileekr1491

asked

Ask a question