[MYSQL] CASE 조건처리, 쿼리 실행순서, GROUP BY 집계함수

2023. 6. 1. 16:20·코테/정리
728x90
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;
728x90

'코테 > 정리' 카테고리의 다른 글

[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
'코테/정리' 카테고리의 다른 글
  • [MYSQL] 중복제거한 데이터 개수 카운트하기
  • [MYSQL] JOIN(INNER JOIN, OUTER JOIN)
  • [MySQL] date_format('%Y-%m-%d')
  • [MySQL] LIMIT, ORDER BY, COUNT, MAX MIN SUM
DROPDEW
DROPDEW
💻 Developer | 기록하지 않으면 존재하지 않는다
  • DROPDEW
    제 2장 1막
    DROPDEW
  • 전체
    오늘
    어제
    • Dev (443)
      • App·Android (1)
      • BE (50)
        • HTTP 웹 기본 지식 (8)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (12)
        • 스프링부트와 JPA 활용 (11)
        • 스프링부트 시큐리티 & JWT (0)
        • 실전 자바 기본, 중급 (1)
        • PHP (11)
      • FE·Client (23)
        • HTML (1)
        • React (19)
        • Unity (1)
      • Data (28)
        • AI (7)
        • Bigdata (6)
        • Database (1)
        • Python (0)
        • 빅데이터분석기사 (13)
      • Infra (1)
      • Activity (9)
        • Intern (0)
        • SK AI Dream Camp (2)
        • 구름톤 유니브 4기 (1)
        • 리모트 인턴십 6기 (3)
        • 봉사활동 (0)
        • 부스트캠프 AI Tech 8기 (3)
      • CS (8)
      • 취준 (12)
        • 자격증 (4)
        • 인적성·NCS (6)
        • 코테·필기·면접 후기 (2)
      • 코테 (270)
        • Algorithm (222)
        • SQL (35)
        • 정리 (13)
      • 인사이트 (27)
        • 금융경제뉴스 (7)
        • 금융용어·지식 (2)
        • 북마크 (7)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    최단경로
    그래프이론
    시뮬레이션
    이분탐색
    브루트포스 알고리즘
    다이나믹프로그래밍
    매개변수탐색
    수학
    정렬
    누적합
    그래프탐색
    백준
    그리디알고리즘
    자료구조
    문자열
    너비우선탐색
    투포인터
    오블완
    구현
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
DROPDEW
[MYSQL] CASE 조건처리, 쿼리 실행순서, GROUP BY 집계함수
상단으로

티스토리툴바