CASE
WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE
THEN "대여중"
ELSE "대여 가능"
END
CASE WHEN THEN ELSE END 문은 java의 switch와 비슷한데,
* WHEN 과 THEN은 무조건 한쌍이어야 한다.
* ELSE는 조건문을 제외한 조건에서 동작한다.
* ELSE가 없을 시 조건에 맞지 않는 데이터는 전부 NULL로 출력된다.
- 프로그래머스 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
SELECT CAR_ID,
MAX(CASE WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE
THEN "대여중" ELSE "대여 가능" END)
AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
문제를 풀다가 쿼리 실행순서에 대해 의문을 가지고 검색해본 결과
쿼리 실행 순서는 FROM/JOIN > WHERE > GROUP BY > HAVING > SELECT > ORDER BY로
1. FROM/JOIN절을 통해 테이블 데이터 결과를 가져온다.
2. WHERE절에서, 조건에 맞는 데이터만 가져온다.
3. GROUP BY절에서, WHERE절에서 추린 데이터를 선택한 컬럼으로 그룹화 한다.(GROUP BY를 사용할때는 집계함수를 사용해준다.)
4. HAVING절은 GROUP BY에서 그룹화 된 이후 사용되는 조건이지만, WHERE절에서 사용되는 조건들을 HAVING절에서 사용하게 되면 쿼리 실행 순서에 의해 퍼포먼스가 떨어질 수 있다.(주의)
5. SELECT절에서, 여러 조건을 처리한 이후 남은 데이터에서 어떤 열을 출력할지 선택한다.
6. ORDER BY절에서, 행의 순서를 어떻게 보여줄지 정렬해준다.
GROUP BY로 묶은 CAR_ID 에서 SELECT로 출력하기 전에, MAX 집계함수를 사용해서 조건에 맞는 데이터만 뽑아서
조건에 맞는 데이터면 "대여중"이라 표시해주고 조건에 맞지 않는 데이터면 "대여 가능"이라고 표시해준다.
여기서 또 의문이 든 것은, MAX 집계함수를 사용하지 않으면?
GROUP BY에서 집계함수를 하나도 사용하지 않을 경우, 단순한 중복제거(SELECT DISTINCT)와 동일한 결과를 출력하게 된다.
즉, 문제에서 원하는 답과 달리 단순 중복제거를 한 값이 출력되게 되는 것.
-- 집계함수를 사용하지 않은 GROUP BY
SELECT CAR_ID,
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID;
-- SELECT DISTINCT
SELCT DISTINCT(CAR_ID)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY;'코테 > 정리' 카테고리의 다른 글
| [MySQL] GROUP BY 1 (0) | 2023.07.05 |
|---|---|
| [MYSQL] 중복제거한 데이터 개수 카운트하기 (0) | 2023.06.07 |
| [MYSQL] JOIN(INNER JOIN, OUTER JOIN) (0) | 2023.06.02 |
| [MySQL] date_format('%Y-%m-%d') (0) | 2023.05.06 |
| [MySQL] LIMIT, ORDER BY, COUNT, MAX MIN SUM (0) | 2023.05.02 |