📘 4주차에 배울 내용
💙 수업목표
- Subquery 를 활용하여 복잡한 연산을 수행한다
- Join 을 활용하여 여러개의 테이블에 있는 데이터를 한 번에 조회하고 연산한다
1. 여러번의 연산을 한 번의 SQL 문으로 수행하기 (SubQuery)
서브쿼리(SubQuery)란?
부모 쿼리 안에 작성하는 내부의 SELECT 쿼리
서브쿼리(SubQuery)가 필요한 경우
- 여러번의 연산을 수행해야 할 때
- 조건문에 연산 결과를 사용해야 할 때
- 조건에 Query 결과를 사용하고 싶을 때
서브쿼리(SubQuery) 문의 기본 구조
SELECT column1, special_column
FROM
( /* subquery */
SELECT column1, column2 special_column
FROM table1
) a;
SELECT column1, column2
FROM table1
WHERE column1 = (SELECT col1 FROM table2);
[예제]
SELECT order_id, restaurant_name, food_preparation_time
FROM (
SELECT order_id, restaurant_name, food_preparation_time
FROM food_orders
) a;
2. 필요한 데이터가 서로 다른 테이블에 있을 때 조회하기 (JOIN)
JOIN 이란?
두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것
JOIN 의 종류
- LEFT JOIN: 공통 컬럼 (키값) 을 기준으로, 하나의 테이블에 값이 없더라도 모두 조회된다.
- INNER JOIN: 통 컬럼 (키값) 을 기준으로, 두 테이블 모두에 있는 값만 조회된다.
JOIN 의 기본 구조
-- LEFT JOIN
SELECT 조회 할 컬럼
FROM 테이블1 a LEFT JOIN 테이블2 b ON a.공통컬럼명=b.공통컬럼명;
-- INNER JOIN
SELECT 조회 할 컬럼
FROM 테이블1 a INNER JOIN 테이블2 b ON a.공통컬럼명=b.공통컬럼명;
-- INNER JOIN (키워드 생략)
SELECT 조회 할 컬럼
FROM 테이블1, 테이블2 b WHERE a.공통컬럼명=b.공통컬럼명;
[예제]
SELECT a.order_id, a.customer_id, a.restaurant_name, a.price, b.name, b.age, b.gender
FROM food_orders a
LEFT JOIN customers b
ON a.customer_id=b.customer_id;
SELECT a.order_id, a.customer_id, a.restaurant_name, a.price, b.name, b.age, b.gender
FROM food_orders a, customers b
WHERE a.customer_id=b.customer_id;
3. 숙제
식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기
- 평균 음식 주문 금액 기준 : 5,000 이하 / ~10,000 / ~30,000 / 30,000 초과
- 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상
- 두 테이블 모두에 데이터가 있는 경우만 조회, 식당 이름 순으로 오름차순 정렬
SELECT restaurant_name,
( CASE WHEN price <=5000 THEN 'price_group1'
WHEN price >5000 AND price <=10000 THEN 'price_group2'
WHEN price >10000 AND price <=30000 THEN 'price_group3'
ELSE 'price_group4' END
) price_group,
( CASE WHEN age <30 THEN 'age_group1'
WHEN age BETWEEN 30 AND 39 THEN 'age_group2'
WHEN age BETWEEN 40 AND 49 THEN 'age_group3'
ELSE 'age_group4' END
) age_group
FROM (
SELECT restaurant_name, avg(price) price, avg(age) age
FROM food_orders a, customers b WHERE a.customer_id=b.customer_id
GROUP BY restaurant_name
) t
ORDER BY restaurant_name;
'SQL > 📘 엑셀보다 쉽고 빠른 SQL' 카테고리의 다른 글
엑셀보다 쉽고 빠른 SQL - 5주차 (0) | 2025.03.21 |
---|---|
엑셀보다 쉽고 빠른 SQL - 3주차 (0) | 2025.03.21 |
엑셀보다 쉽고 빠른 SQL - 2주차 (0) | 2025.03.21 |
엑셀보다 쉽고 빠른 SQL - 1주차 (0) | 2025.03.20 |