SQL/📘 엑셀보다 쉽고 빠른 SQL

엑셀보다 쉽고 빠른 SQL - 4주차

가지코딩 2025. 3. 21. 16:20

📘 4주차에 배울 내용

  1. 여러번의 연산을 한 번의 SQL 문으로 수행하기 (Subquery)
  2. 필요한 데이터가 서로 다른 테이블에 있을 때 조회하기 (JOIN)
  3. 숙제

💙 수업목표

  • 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;