포스트

오랜 기간 보호한 동물(1)

https://school.programmers.co.kr/learn/courses/30/lessons/59044

문제

  • 문제 풀이
    • ANIMAL_INS 테이블에 있는 동물 중 ANIMAL_OUTS 테이블에 없는 동물의 이름과 날짜를 검색하며, 결과를 DATETIME 기준으로 정렬하고 상위 3개 행만 반환한다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
        SELECT NAME, DATETIME
        FROM (
              SELECT I.NAME, I.DATETIME
              FROM ANIMAL_INS I
              LEFT JOIN ANIMAL_OUTS O
              ON I.ANIMAL_ID = O.ANIMAL_ID
              WHERE O.ANIMAL_ID IS NULL
              ORDER BY I.DATETIME ASC
        ) 
        FETCH FIRST 3 ROWS ONLY;
      
      • 서브쿼리를 사용한 형태로, 외부 쿼리에서는 서브쿼리의 결과 중 상위 3개 행을 선택하기 위해 FETCH FIRST 3 ROWS ONLY를 사용했다.


      1
      2
      3
      4
      5
      6
      7
      
        SELECT I.NAME, I.DATETIME
        FROM ANIMAL_INS I
        LEFT JOIN ANIMAL_OUTS O
        ON I.ANIMAL_ID = O.ANIMAL_ID
        WHERE O.ANIMAL_ID IS NULL
        ORDER BY I.DATETIME
        FETCH FIRST 3 ROWS ONLY;
      
      • LEFT JOIN: ANIMAL_INS 테이블을 기준으로 보고 있으며, 왼쪽 테이블(ANIMAL_INS)의 모든 행을 포함하고 오른쪽 테이블(ANIMAL_OUTS)과 조건에 맞는 행이 있는 경우 해당 행을 함께 반환한다. 실행 결과


      1
      2
      3
      4
      5
      6
      7
      
        SELECT I.NAME, I.DATETIME
        FROM ANIMAL_OUTS O
        RIGHT JOIN ANIMAL_INS I
        ON O.ANIMAL_ID = I.ANIMAL_ID
        WHERE O.ANIMAL_ID IS NULL
        ORDER BY I.DATETIME
        FETCH FIRST 3 ROWS ONLY;
      
      • RIGHT JOIN: ANIMAL_OUTS 테이블을 기준으로 보고 있으며, 오른쪽 테이블(ANIMAL_INS)의 모든 행을 포함하고 왼쪽 테이블(ANIMAL_OUTS)과 조건에 맞는 행이 있는 경우 해당 행을 함께 반환한다.

        실행 결과

      • 결과적으로 두 쿼리는 같은 결과를 반환하지만, 기준이 되는 테이블과 방향성에 차이가 있다. 보통은 LEFT JOIN을 더 자주 사용하며, RIGHT JOIN을 사용할 때는 쿼리를 더 읽기 쉽게 만들기 위해 LEFT JOIN으로 바꿀 수 있는지 고려하는 것이 일반적이다.


  • Oracle 조인 문법
    • (+) 기호를 사용하여 오른쪽 테이블에 대한 외부 조인을 나타낸다.
1
2
3
4
5
6
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE (I.ANIMAL_ID = O.ANIMAL_ID(+)) AND
       O.ANIMAL_ID IS NULL
ORDER BY DATETIME
FETCH FIRST 3 ROW ONLY;


  • SQL 표준의 조인 문법
    • LEFT JOINON을 사용하여 왼쪽 테이블과 오른쪽 테이블을 조인
1
2
3
4
5
6
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
FETCH FIRST 3 ROWS ONLY;


  • FETCH FIRST n ROWS ONLY
    • 결과 집합에서 처음 n개의 행만을 선택하도록 하는 SQL 구문이다. 이는 특정 쿼리의 결과에서 상위 n개의 행만 필요할 때 사용된다.
    • 예를 들어, ORDER BY 절을 사용하여 정렬된 결과에서 처음 몇 개의 행만 가져오고 싶을 때 유용하다.


  • 실행 결과 실행 결과 실행 결과
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.