나는매일가운데

SQL JOIN LV2. 저자와 책 본문

코테준비

SQL JOIN LV2. 저자와 책

전로찡 2024. 1. 8. 23:03
반응형

1. 문제

'경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

 

2. 테이블 구조

BOOK TBALE COLUMN 구성

BOOK_ID INTEGER FALSE 도서 ID
CATEGORY VARCHAR(N) FALSE 카테고리 (경제, 인문, 소설, 생활, 기술)
AUTHOR_ID INTEGER FALSE 저자 ID
PRICE INTEGER FALSE 판매가 (원)
PUBLISHED_DATE DATE FALSE 출판일

 

AUTHOR TABLE 구성

AUTHOR_ID INTEGER FALSE 저자 ID
AUTHOR_NAME VARCHAR(N) FALSE 저자명

 

 

3 - 1. SQL (1)

 - MYSQL을 사용해서 풀었다

 - 놓친 부분 PUBLISHED_DATE를 구할 때 날짜 형식을 잘 봐야했다.

 - ORACLE에서는 TO_CHAR('날짜', '날짜형식')으로 사용했지만, MySQL에서는 DATE_FORMAT(날짜', '날짜형식') 함수를 사용한다. 

SELECT 
        B.BOOK_ID AS BOOK_ID
      , A.AUTHOR_NAME AS AUTHOR_NAME
      , DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE <!-- 날짜 변환은 ORAClE이 더 간편 -->
 FROM 
        BOOK AS B
      , AUTHOR AS A
 WHERE 1=1
   AND B.AUTHOR_ID = A.AUTHOR_ID
   AND B.CATEGORY LIKE '%경제%'  <!-- 혹시 경제란 단어가 속한 다른 카테고리가 있을 수 있으므로-->
 ORDER BY PUBLISHED_DATE ASC;

 

 

3 - 2. SQL(2)

- MySQL을 사용해서 풀었지만 JOIN을 다른 방식으로 사용해 보았다.

- 위의 쿼리 방법이 더 간편하지만, 회사에서는 이런 식으로 사용하고 있기 때문에...

 

SELECT 
        B.BOOK_ID AS BOOK_ID
      , A.AUTHOR_NAME AS AUTHOR_NAME
      , DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
  FROM BOOK AS B
 RIGHT OUTER JOIN AUTHOR AS A ON B.AUTHOR_ID = A.AUTHOR_ID
 WHERE B.CATEGORY LIKE '%경제%'
 ORDER BY PUBLISHED_DATE ASC;

 

- 이 때, OUTER은 굳이 안써줘도 되지만, 명확성을 위해 씀 (안쓸 경우 자동적으로 OUTER JOIN으로 인식)

- AUTHOR 테이블에 맞춰 RIGHT JOIN을 해주었다.

 

4. MySQL 에서 DATE_FORMAT 형식 정리

포맷 설명
%a 일(Sun ~ Sat)
%b 월(Jan ~ Dec)
%c 월(0 ~ 12)
%D 일(1st, 2nd, 3rd, ...)
%d 일(01 ~ 31)
%e 일(0 ~ 31)
%f Microseconds (000000 to 999999)
%H 시간(00 ~ 23)
%h 시간(00 ~ 12)
%I 시간(00 ~ 12)
%i 분(00 ~ 59)
%j Day of the year (001 to 366)
%k 시간(0 ~ 23)
%l 시간(1 ~ 12)
%M 월(January ~ December)
%m 월(00 ~ 12)
%p AM or PM
%r 시간(12시)을 hh:mm:ss AM/PM 형식으로
%S 초(00 ~ 59)
%s 초(00 ~ 59)
%T 시간(24시)을 hh:mm:ss 형식으로
%U Week where Sunday is the first day of the week (00 ~ 53)
%u Week where Monday is the first day of the week (00 ~ 53)
%V Week where Sunday is the first day of the week (01 ~ 53). Used with %X
%v Week where Monday is the first day of the week (01 ~ 53). Used with %x
%W 일(Sunday ~ Saturday)
%w Day of the week where Sunday=0 and Saturday=6
%X Year for the week where Sunday is the first day of the week. Used with %V
%x Year for the week where Monday is the first day of the week. Used with %v
%Y 연도(4자리)
%y 연도(2자리)

 

반응형