출처: https://school.programmers.co.kr/learn/courses/30/lessons/144854?language=oracle
문제 설명
다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(BOOK), 저자 정보(AUTHOR) 테이블입니다.
BOOK 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.
Column name Type Nullable Description
BOOK_ID INTEGER FALSE 도서 ID
CATEGORY VARCHAR(N) FALSE 카테고리 (경제, 인문, 소설, 생활, 기술)
AUTHOR_ID INTEGER FALSE 저자 ID
PRICE INTEGER FALSE 판매가 (원)
PUBLISHED_DATE DATE FALSE 출판일
AUTHOR 테이블은 도서의 저자의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.
Column name Type Nullable Description
AUTHOR_ID INTEGER FALSE 저자 ID
AUTHOR_NAME VARCHAR(N) FALSE 저자명
문제
'경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.
예시
예를 들어 BOOK 테이블과 AUTHOR 테이블이 다음과 같다면
BOOK_ID CATEGORY AUTHOR_ID PRICE PUBLISHED_DATE
1 인문 1 10000 2020-01-01
2 경제 1 9000 2021-04-11
3 경제 2 11000 2021-02-05
AUTHOR_ID AUTHOR_NAME
1 홍길동
2 김영호
'경제' 카테고리에 속하는 도서는 도서 ID가 2, 3인 도서이고, 출판일을 기준으로 오름차순으로 정렬하면 다음과 같은 결과가 나와야 합니다.
BOOK_ID AUTHOR_NAME PUBLISHED_DATE
3 김영호 2021-02-05
2 홍길동 2021-04-11
주의사항
PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.
내가 작성한 코드문
-- 코드를 입력하세요
-- '경제' 카테고리에 속하는 도서는 도서 ID가 2, 3인 도서이고, 출판일을 기준으로 오름차순으로 정렬
SELECT B.BOOK_ID, A.AUTHOR_NAME, TO_CHAR(B.PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK B
INNER JOIN AUTHOR A
ON B.AUTHOR_ID = A.AUTHOR_ID
WHERE B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE
그냥 내 생각대로 하니 딱 됐다.
✅ 1. USING 절 활용
AUTHOR_ID 컬럼명이 두 테이블에 동일하므로 USING을 쓸 수 있다.
SELECT B.BOOK_ID, A.AUTHOR_NAME, TO_CHAR(B.PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK B
JOIN AUTHOR A USING (AUTHOR_ID)
WHERE B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE;
✅ 2. NATURAL JOIN (컬럼명이 같을 때 자동 조인)
컬럼명이 동일하면 자연조인도 가능하다.
다만 실무에서는 명시적인 조인을 더 권장한다.
SELECT B.BOOK_ID, A.AUTHOR_NAME, TO_CHAR(B.PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK B
NATURAL JOIN AUTHOR A
WHERE B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE;
✅ 3. 서브쿼리 활용
저자 이름을 미리 뽑아서 조인하지 않고 SELECT 절에서 서브쿼리로 가져오는 방식이다.
SELECT B.BOOK_ID,
(SELECT A.AUTHOR_NAME
FROM AUTHOR A
WHERE A.AUTHOR_ID = B.AUTHOR_ID) AS AUTHOR_NAME,
TO_CHAR(B.PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK B
WHERE B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE;
✅ 4. ANSI JOIN 대신 오라클 전통 조인 방식
구 오라클 스타일 조인(WHERE 절 사용)도 가능하다.
SELECT B.BOOK_ID, A.AUTHOR_NAME, TO_CHAR(B.PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK B, AUTHOR A
WHERE B.AUTHOR_ID = A.AUTHOR_ID
AND B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE;