[MYSQL] 궁금한 것 정리

kiki·2024년 1월 14일
0

프로그래머스

목록 보기
75/76

궁금증 1 - 없어진 기록 찾기

SELECT ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O
    LEFT JOIN ANIMAL_INS I USING(ANIMAL_ID)
    WHERE I.ANIMAL_ID IS NULL
    ORDER BY ANIMAL_ID;

이렇게 I와 O를 JOIN하고 WHERE절에 I.ANIMAL_ID IS NULL을 지정해주면 어느 테이블을 참조하는 걸까?
그냥 I 테이블을 참조한다면 NULL인 값이 없을텐데!
합치고 나서 O와 I 각각 또 다른 테이블이 생기는건가?

  • LEFT JOIN을 사용했기 때문에 O에는 있지만 I에는 없는 데이터, 즉 I의 animal_id가 null인 값이 생길 것이다. join하고 나서 O와 I 각각 다른 테이블이 생기는게 아니라 I와 O의 각 컬럼(피쳐?)이 있기 때문에 I.ANIMAL_ID와 같이 조회가 가능할 것이다.
  • 근데 USING으로 join 했는데도 I.ANIMAL_ID와 같이 쓸 수 있는건가?

궁금증 2 - 식품분류별 가장 비싼 식품의 정보 조회하기

SELECT CATEGORY, PRICE
    FROM FOOD_PRODUCT
    WHERE CATEGORY IN ('과자','국','김치','식용유')
    GROUP BY CATEGORY
    HAVING PRICE=MAX(PRICE)

HAVING절이 그룹화 후 적용되는 조건문으로 알고있다. 내가 원했던 건 그룹별로 MAX(PRICE) 값을 구하고 그룹에서 PRICE MAX 값을 갖는 데이터만 보고싶었던 건데,
전체에서 MAX(PRICE)를 구해서 하나의 데이터만 조회됐었다.
뭘까?

궁금증 3 - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

SELECT MONTH(START_DATE) AS MONTH,
    CAR_ID, 
    COUNT(*) AS RECORDS
    WHERE CAR_ID IN (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE DATE_FORMAT(START_DATE,'%Y-%m-%d') BETWEEN '2022-08-01' AND '2022-10-31'
        GROUP BY 1 HAVING COUNT(*)>4) F
    GROUP BY 1,2

WHERE절에 사용한 서브쿼리에 alias를 지정해줬는데 얘때문에 오류가 났다!
join 절이 아닌 다른 구문에 있는 서브쿼리에 alias를 지정하면 안되는건가?

  • alias는

궁금증 4 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

SELECT CAR_ID, 
       IF(COUNT(IF('2022-10-16' BETWEEN DATE_FORMAT(START_DATE,'%Y-%m-%d') AND DATE_FORMAT(END_DATE,'%Y-%m-%d'),1,NULL))>0, '대여중','대여 가능') AS AVAILABILITY
       FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
       GROUP BY CAR_ID
       ORDER BY CAR_ID DESC;

IF와 COUNT로 묶인 부분의 반환 타입이 뭔지 궁금했었는데, 대충 뭔지 알 것 같다.
가장 안에 있는 IF문으로 조건에 따라 1과 NULL이 담긴 테이블?이 반환되고, 이를 COUNT하면 NULL 값을 제외하고 COUNT하니까 IF의 조건에 해당하는 데이터만 COUNT될 것이다.

음. 근데 정확히는 모르겠다. 맨 안에 있는 IF문의 반환 타입?이 뭔지.

궁금증 5 - 저자 별 카테고리 별 매출액 집계하기

SELECT A.AUTHOR_ID, AUTHOR_NAME, CATEGORY, SUM(SALES*PRICE) AS TOTAL_SALES FROM BOOK_SALES BS
    INNER JOIN BOOK AS B ON B.BOOK_ID=BS.BOOK_ID
    INNER JOIN AUTHOR AS A ON A.AUTHOR_ID=B.AUTHOR_ID
    WHERE DATE_FORMAT(SALES_DATE,'%Y-%m')='2022-01'
    GROUP BY AUTHOR_ID, AUTHOR_NAME, CATEGORY
    ORDER BY AUTHOR_ID, CATEGORY DESC;

궁금한 것 하나의 그냥 JOIN을 썼을 때 디폴트는 뭔지였는데 그건 INNER였다.
두번째는 여기서 GROUP BY 할 때 AUTHOR_NAME이 있으니까 AUTHOR_ID는 안해도 되는건지 였는데, 이건 AUTHOR_NAME이 중복되니까 해줘야한다.

오 확실히 SQL을 공부한 초반이랑 지금이랑 보이는 정도가 다르구만.

0개의 댓글