공부/SQL

엑셀보다 쉽고 빠른 SQL 4주차(서브쿼리, JOIN)

edcrfv458 2025. 1. 7. 17:46

배울 것

  • 연산을 여러번 해야하는데, 쿼리문에 길게 쓰는 것 말고 다른 방법은 없을지
  • 연산한 결과를 다른 연산이나 조건문에 사용하고 싶은데, 계속 반복해서 연산해야 하는지
  • 필요한 데이터가 여러 테이블에 나누어져 있는데 한 번에 조회해서 사용할 수 있을지

서브쿼리

 

필요한 경우

  • 여러 변의 연산을 수행해야 할 때
  • 조건문에 연산 결과를 사용해야 할 때
  • 조건에 쿼리 결과를 사용하고 싶을 때

 

기본 구조

  • 괄호를 이용해 안에서 SELECT 문을 통해 조회를 하면 column1, column2가 나옴
  • 여기서 나온 column1과 column2 결과를 이용해 메인 쿼리문에서 계산을 함
SELECT column1, special_column 
FROM
	{
    SELECT column1, column2 special_clumn
    FROM table1
    } a

테이블에서 컬럼 가져와 연산

 

서브 쿼리문에서 음식준비시간에 대해 연산을 진행하고 메인 쿼리문에서 if문 이용

 

음식 타입별 지역별 총 주문 수량과 음식점 수를 연산하고, 주문 수량과 음식점 수 별 수수료율 산정

 

음식점의 총 주문 수량과 주문 금액 연산하고, 주문 수량 기반으로 수수료 할인율 구하기


JOIN

 

필요한 경우

  • 필요한 데이터가 서로 다른 테이블에 있을 때 조회

 

기본 원리

  • 엑셀의 Vlookup과 유사
  • 각각 주문 정보와 고객 정보 테이블이 있을 때 두 테이블의 공통되는 고객 ID 컬럼을 이용해 합치는 것

 

종류

  • LEFT JOIN
    • 공통 컬럼을 기준으로, 하나의 테이블에 값이 없더라도 모두 조회되는 경우를 의미
  • INNER 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.공통컬럼명

각 테이블에서 원하는 데이터만 가져오고 cuisine_type이 Korean인 것만 호출

 

  • 중복을 제거하기 위해 c.name 앞에 DISTINCT 작성
    • 값을 세는 것과 동일하게 중복을 제거하고 어떤 값이 있는지만 보여줌

고객 이름, 연령, 성별, 주문 식당 조회하고 고객 명으로 정렬

 

  • JOIN으로 두 테이블의 값 연산
    • 수수료율이 있는 경우만 조회

주문 가격과 수수료율 곱하여 주문별 수수료 구함

 

  • 할인: (나이 - 50) * 0.005
    • 고객 정보가 없는 경우도 포함하여 조회, 할인 금액이 큰 순서대로 정렬

50세 이상 고객의 연령ㄱ에 따라 경로 할인율 적용하고, 음식 타입별 원래 가격과 할인 적용 가격 합


[과제: 식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기]

  • 평균 음식 주문 금액 기준 : 5,000 이하 / ~10,000 / ~30,000 / 30,000 초과
  • 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상
  • 두 테이블 모두에 데이터가 있는 경우만 조회, 식당 이름 순으로 오름차순 정렬