본문 바로가기
SQL

[TIL] SQL_8일차(JOIN,LEFT JOIN,INNER JOIN)

by 공부하죠 2024. 4. 3.
반응형

열공 중🔥

✍🏻배운내용🌞

1. JOIN 이란?


1. JOIN 이란? 

1) 필요한 데이터가 하나의 테이블에만 있지 않고 여러 테이블에 있을 경우 씁니다.

이때 필수 조건은 공통으로 갖고 있는 컬럼이 반드시 있어야 합니다.

즉, 공통 컬럼을 기준으로 두 테이블을 합쳐서, 각각 테이블에서 필요한 데이터를 조회할 수 있도록 만들어주는 것입니다.

JOIN 은 기본적으로 엑셀의 Vlookup 과 비슷합니다.

 

2) 조인은 하는 방법

 

 

LEFT JOIN : 공통 컬럼 (키값) 을 기준으로, 하나의 테이블에 값이 없더라도 모두 조회되는 경우를 의미합니다. 우리의 예시로 보 면 아래와 같습니다. 부분집합

LEFT JOIN
select 조회 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
select *
from food_orders fo left join payments pm on fo.order_id = pm.order_id

 

 

INNER JOIN : 공통 컬럼 (키값) 을 기준으로, 두 테이블 모두에 있는 값만 조회합니다. 교집합

즉, 위의 예시에서 주문번호 14의 경우, 고객에 대한 정보가 고객 정보에 없으므로 조회 시 제외됩니다.

INNER JOIN
select 조회 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명
select *
from food_orders fo inner join payments pm on fo.order_id = pm.order_id

 

 

 

 

[실습] JOIN

1. 주문 테이블과 고객 테이블cusomer_id 를 기준으로 left join 으로 묶어보기

(조회 컬럼 : order_id, customer_id, restaurant_name, price, name, age, gender)

select f.order_id,
f.customer_id,
f.restaurant_name,
f.price,
c.name,
c.age,
c.gender
from food_orders f left join customers c on f.customer_id=c.customer_id

 

2. 한국 음식의 주문별 결제 수단과 수수료율을 조회하기

(조회 컬럼 : 주문 번호, 식당 이름, 주문 가격, 결제 수단, 수수료율)

*결제 정보가 없는 경우도 포함하여 조회 → left join

select f.order_id, f.restaurant_name, f.price, p.pay_type, p.vat
from food_orders f left join payments p on f.order_id = p.order_id
where cuisine_type ='Korean'

 

3.  고객의 주문 식당 조회하기

(조회 컬럼 : 고객 이름, 연령, 성별, 주문 식당)

*고객명으로 정렬 order by c.name , 중복 없도록 조회 distinct

 left join을 사용할 경우, 10~59세의 나이에 해당하더라도 food 테이블의 값들을 가지고 있지 않은 즉, NULL 값을 가지게 되는 행이 선별 될 수 있습니다.
하지만 inner join을 사용한다면 교집합이기 때문에 food 테이블의 값과 customers 테이블의 값을 모두 갖고 있는 행들을 선별하여 NULL 값은 없게 되겠습니다.
따라서 left join 사용 시, 10~59세에 해당하는 행이더라도 food 테이블의 컬럼 중 NULL값을 가진 행이 도출 될 수 있으므로 inner join을 사용하는 것입니다.

select distinct c.name , c.age, c.gender, f.restaurant_name
from food_orders f left join customers c on f.customer_id = c.customer_id
order by c.name

 

select distinct c.name , c.age, c.gender, f.restaurant_name
from food_orders f inner join customers c on f.customer_id = c.customer_id
order by c.name

 

4. 주문 가격과 수수료율을 곱하여 주문별 수수료 구하기

(조회 컬럼 : 주문 번호, 식당 이름, 주문 가격, 수수료율, 수수료)

*수수료율이 있는 경우만 조회   inner join

select f.order_id, f.restaurant_name, f.price, p.vat, f.price * p.vat vat2
from food_orders f inner join payments p on f.order_id = p.order_id

 

 

 

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

(조회 컬럼 : 음식 타입, 원래 가격, 할인 적용 가격, 할인 가격) 

*할인 : (나이- 50) * 0.005

* 고객 정보가 없는 경우도 포함하여 조회  left join , 할인 금액이 큰 순서대로(내림차순) 정렬  order by ~ desc

범주별로 group by 1

select cuisine_type, sum(price) total_pri, sum(price*discount_rate) discount_pri
from
(select f.cuisine_type, f.price, c.age, (c.age - 50) * 0.005 discount_rate
from food_orders f left join customers c on f.customer_id = c.customer_id
where c.age >= 50) a
group by 1
order by sum(price*discount_rate) desc

 

[ 🚨 Tip ]

공통컬럼은 묶어주기 위한 ‘공통 값’ 이기 때문에 두 테이블의 컬럼명은 달라도 괜찮습니다.

예를 들어 주문정보에는 ‘고객ID’, 고객정보에는 ‘고객아이디’ 라고 컬럼명이 되어있다면,

테이블1.고객ID=테이블2.고객아이디 와 같이 묶어줄 수 있습니다.


💡[ Tip ] SQL생각 흐름 🧠 

1. 기본구조를 적기 : select from where

2. 어떤 데이터를 가져올 테이블을 적기 : from 테이블

 → 만약 조건이 잘 파악이 안 되면 (전체) 테이블만 우선 실행하여 결과를 보고 조건 찾기

3. 어떤 컬럼을 이용할 것인지 선택 : select 컬럼

4. 어떤 조건을 지정할 지 적기 : where 조건, group by / order by

5. 어떤 함수(수식) 을 이용해야 하는가 → 갯수 구하는 수식

 

[🔎복습 ]

💡replace(바꿀 컬럼, 현재 , 바꿀 )

💡 substr(조회  컬럼, 시작 위치, 글자 )

💡 concat if (붙이고 싶은 값1, 값2, 값3, .....)

💡 if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)

💡 case when 조건1 then 값(수식)1

             when 조건2 then 값(수식)2

             else 값(수식)3

             end


ADsP 시험 정보가 궁금하신 분들은 여기를 클릭 💨

이전 내용이 궁금하다면 여기를 클릭 💨

replace, substr, concat, if/case에 대해 더 알고싶다면 여기를 클릭🔥

 

🌸 오늘 하루도 즐거운 하루 되세요🌄

 

반응형