
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
구조를 숙지하자.
🅰️쿼리는 실행되지만 확인되지 않는 값들은 'NULL'을 반환한다.
구조
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')
평균 가격을 소수점 둘째 자리까지 반올림
SELECT ROUND(AVG(PRICE), 2) AS avg_price
FROM BOOK;
예시 문제
| 단계 | 설명 |
|---|---|
| 1.FROM | USED_GOODS_BOARD 테이블과 USED_GOODS_USER 테이블을 INNER JOIN 하여 결합 |
| 2.WHERE | B.STATUS = 'DONE' 조건을 만족하는 행 필터링 |
| 3.GROUP BY | B.WRITER_ID를 기준으로 데이터 그룹화 |
| 4.HAVING | 가격 합계가 700,000원을 초과하는 그룹 필터링 |
| 5.SELECT | 각 작가 ID와 가격 합계를 선택 |
240626TIL <- 에서 MAX()를 사용했을 때 해당 행에서 MAX() 칼럼만 따로 노는 문제에 대해 다뤘다.
CODEKATA <- 문제를 풀면서 같은 상황에 처했다. 하지만 이번에는 240626TIL 처럼 WHERE = MAX()를 통해 필터링이 불가능했다.
MAX()의 결과가 여러 줄의 행을 가지고 있기 때문이다. WHERE =같은 단일값 필터링이 불가한 것이다.
Subquery returns more than 1 row
정리
- 서브쿼리의 결과가 다중 행을 반환한다면, WHERE 절에=연산자를 사용하여 필터링하는 방법을 사용할 수 없다.
- 이 경우, 서브쿼리의 결과를 필터링하기 위해JOIN을 사용하는 것이 가장 일반적이다.
JOIN 함수와 AND 연산자를 통해 필터링하는 과정을 살펴보자.
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
문제 설명
음식 종류별로 즐겨찾기가 가장 많은 식당을 구하고, 해당 식당의 음식 종류, ID, 식당 이름, 즐겨찾기 수를 조회합니다. 결과는 음식 종류를 기준으로 내림차순(DESC)으로 정렬합니다.
REST_INFO 데이터 테이블

쿼리 작성
다음은 각 음식 종류별로 즐겨찾기 수가 가장 많은 식당을 찾기 위해 서브쿼리와 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;
쿼리 설명
T는 각 FOOD_TYPE별로 최대 즐겨찾기 수(MAX_FAVORITES)를 계산합니다.REST_INFO 테이블을 서브쿼리 T와 JOIN하여 FOOD_TYPE과 즐겨찾기 수가 일치하는 행을 찾습니다.쿼리 결과
위의 쿼리를 실행하면 다음과 같은 결과가 나옵니다.
| FOOD_TYPE | REST_ID | REST_NAME | FAVORITES |
|---|---|---|---|
| 일식 | 00004 | 스시사카우스 | 230 |
| 양식 | 00003 | 따띠따띠뜨 | 102 |
| 한식 | 00001 | 은돼지식당 | 734 |
💡중요포인트💡
JOIN ON 뿐만 아니라 AND 를 통해 한 번 더 조건을 걸 수 있다.