240628

Gi Woon Lee·2024년 6월 28일
1

TIL

목록 보기
6/78
post-thumbnail

SQL

CASE WHEN ~조건~ THEN ~출력~ ELSE END

CODEKATA

CASE 
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default_result
END

구조를 숙지하자.

ELSE를 안적으면 안돼?

🅰️쿼리는 실행되지만 확인되지 않는 값들은 'NULL'을 반환한다.

날짜 형식DATE_FORMAT()은 '%Y-%m-%d' 가 가장 많이 쓰이는 듯.

문제만 잘 읽으면 넘 쉽구요

IN 연산자

구조

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);

CODEKATA
ex) 특정 이름들이 포함된 칼럼 조회

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty')

ROUND() 반올림

평균 가격을 소수점 둘째 자리까지 반올림

SELECT ROUND(AVG(PRICE), 2) AS avg_price
FROM BOOK;

🔥SQL 쿼리 동작 순서

예시 문제

CODEKATA

단계설명
1.FROMUSED_GOODS_BOARD 테이블과 USED_GOODS_USER 테이블을 INNER JOIN 하여 결합
2.WHEREB.STATUS = 'DONE' 조건을 만족하는 행 필터링
3.GROUP BYB.WRITER_ID를 기준으로 데이터 그룹화
4.HAVING가격 합계가 700,000원을 초과하는 그룹 필터링
5.SELECT각 작가 ID와 가격 합계를 선택

JOIN 시 기준 칼럼 이름이 달라도 칼럼 내용이 동일하면 JOIN이 가능하다!

CODEKATA

⭐오늘의 하이라이트 JOIN 시 AND 연산자로 필터링하기⭐

복습1. 복습2.

240626TIL <- 에서 MAX()를 사용했을 때 해당 행에서 MAX() 칼럼만 따로 노는 문제에 대해 다뤘다.
CODEKATA <- 문제를 풀면서 같은 상황에 처했다. 하지만 이번에는 240626TIL 처럼 WHERE = MAX()를 통해 필터링이 불가능했다.

MAX()의 결과가 여러 줄의 행을 가지고 있기 때문이다. WHERE =같은 단일값 필터링이 불가한 것이다.
Subquery returns more than 1 row

정리
- 서브쿼리의 결과가 다중 행을 반환한다면, WHERE 절에 = 연산자를 사용하여 필터링하는 방법을 사용할 수 없다.
- 이 경우, 서브쿼리의 결과를 필터링하기 위해JOIN을 사용하는 것이 가장 일반적이다.

JOIN 함수와 AND 연산자를 통해 필터링하는 과정을 살펴보자.

🔥JOIN_ON_AND🔥 로 JOIN절에서 필터링 조건 걸어버리기.. 신통방통

SELECT MAIN.FOOD_TYPE,
       MAIN.REST_ID,
       MAIN.REST_NAME,
       SUB.FAVORITES
FROM REST_INFO MAIN INNER JOIN 
(
SELECT FOOD_TYPE,
       MAX(FAVORITES) FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
) SUB ON MAIN.FOOD_TYPE = SUB.FOOD_TYPE AND MAIN.FAVORITES = SUB.FAVORITES
ORDER BY 1 DESC
  1. 문제 설명

    음식 종류별로 즐겨찾기가 가장 많은 식당을 구하고, 해당 식당의 음식 종류, ID, 식당 이름, 즐겨찾기 수를 조회합니다. 결과는 음식 종류를 기준으로 내림차순(DESC)으로 정렬합니다.

  2. REST_INFO 데이터 테이블

  1. 쿼리 작성

    다음은 각 음식 종류별로 즐겨찾기 수가 가장 많은 식당을 찾기 위해 서브쿼리와 JOIN을 사용하는 쿼리입니다.

    SELECT R.FOOD_TYPE, R.REST_ID, R.REST_NAME, R.FAVORITES
    FROM REST_INFO R
    JOIN (
        SELECT FOOD_TYPE, MAX(FAVORITES) AS MAX_FAVORITES
        FROM REST_INFO
        GROUP BY FOOD_TYPE
    ) AS T
    ON R.FOOD_TYPE = T.FOOD_TYPE AND R.FAVORITES = T.MAX_FAVORITES
    ORDER BY R.FOOD_TYPE DESC;
  2. 쿼리 설명

    • 서브쿼리 T는 각 FOOD_TYPE별로 최대 즐겨찾기 수(MAX_FAVORITES)를 계산합니다.
    • 메인 쿼리는 REST_INFO 테이블을 서브쿼리 T와 JOIN하여 FOOD_TYPE과 즐겨찾기 수가 일치하는 행을 찾습니다.
    • 결과는 음식 종류를 기준으로 내림차순으로 정렬됩니다.
  3. 쿼리 결과

    위의 쿼리를 실행하면 다음과 같은 결과가 나옵니다.

    FOOD_TYPEREST_IDREST_NAMEFAVORITES
    일식00004스시사카우스230
    양식00003따띠따띠뜨102
    한식00001은돼지식당734
  4. 💡중요포인트💡
    JOIN ON 뿐만 아니라 AND 를 통해 한 번 더 조건을 걸 수 있다.


CODEKATA

0개의 댓글