회원 이름과 주문 정보를 함께 보고 싶다면?
member 테이블에 이름이 있고
orders 테이블에 주문 정보가 있음
→ JOIN 으로 두 테이블을 연결
샘플 데이터
-- 15장 join 쓰는 법
-- 결과 확인
SELECT * FROM student;
SELECT * FROM subject;
SELECT * FROM enrollment;
-- INNER JOIN : 매칭되는 데이터만
-- 두 테이블 모두에 매칭되는 행만 결합합니다. 조건이 맞지 않으면 결과에서 제외됩니다.
-- 학생 이름 + 수강한 과목명 + 점수
select
s.name as 학생이름,
su.subject_name as 과목명,
e.score
from enrollment as e
inner join student as s on e.student_id = s.student_id
inner join subject as su on e.subject_id = su.subject_id;
select * from student;
insert into student(student_id,name,grade,major)
values (10,'티모', 3,'몰라');
-- LEFT JOIN (왼쪽 테이블 전체 포함)
-- 왼쪽 테이블의 모든 행을 포함합니다
-- 오른쪽 테이블에 매칭 데이터가 없으면 NULL로 채움
-- 모든 학생을 조회, 수강 기록이 없는 학생도 포함, 과목명도 포함
select
s.name as 학생이름,
su.subject_name as 과목명,
e.score as 점수
from student s
left join enrollment e on s.student_id = e.student_id
left join subject su on e.subject_id = su.subject_id;
-- RIGHT JOIN : 오른쪽 테이블 기준으로 모든 행을 포함합니다.
select
s.name as 학생이름,
su.subject_name as 과목명,
e.score as 점수
from student s
right join enrollment e on s.student_id = e.student_id
right join subject su on e.subject_id = su.subject_id;
-- student -> enrollment -> subject 순서로 오른쪽으로 밀어가면 RIGHT JOIN을 걸면
-- 기준이 되는 subject 의 모든 행이 보존됩니다.
insert into subject(subject_id, subject_name, credit, professor)
values (105, '과학', 3, '정교수');
-- 위 right join 쿼리와 동일한 결과를 left join으로 표현해 보자
select
s.name as 학생이름,
su.subject_name as 과목명,
e.score as 점수
from subject su
left join enrollment e on su.subject_id = e.subject_id
left join student s on e.student_id = s.student_id;
-- subject 를 기준 (왼쪽) 에 두고 left join 으로 연결하는 것이 더 직관적이다.
-- right join은 기준 테이블 오른쪽에 있어 가독성이 떨어지므로
-- 실무에서는 left join으로 방향을 통일하는 것을 권장한다
실습 코드
use shop;
-- 전체 확인
SELECT * FROM member;
SELECT * FROM product;
SELECT * FROM orders;
-- 1. 회원 이름 + 주문 정보 (주문한 회원만 보고 싶음) - 기준 테이블 orders
-- 기준 테이블 선정이 상관이 없을 때. 작은 양에 데이터를
-- 가지고 있는 테이블 기준으로 하는 것 관례
select
m.name as 회원명,
o.id as 주문번호,
o.total_price as 주문금액,
o.status as 주문상태
from orders o
inner join member m on o.member_id = m.id;
-- 2. 모든 회원 + 주문 정보(주문 없는 회원도 포함)
select m.*, o.status
from member m
left join orders o on m.id = o.member_id;
-- 3. 주문 상세: 주문번호 + 상품명 + 수량 + 가격 + 회원명
select * from order_item;
select * from orders;
select * from product;
select * from order_item;
select * from orders;
select
m.name as 회원명,
oi.id as 주문번호,
o.total_price as 주문금액,
o.status as 주문상태
from order_item oi
inner join orders o on oi.order_id = o.id
inner join product p on oi.product_id = p.id
inner join member m on o.member_id = m.id;
-- 카테고리별 - 상품 전체 목록 출력
select * from category;
select * from product;
-- 카테고리, 상품명, 가격, 재고
select
c.name as 카테고리,
p.name as 상품명,
p.price as 가격,
p.stock as 재고
from product p
inner join category c on p.category_id = c.id
order by c.name, p.price desc
limit 5;
INNER JOIN : 두 테이블 모두에 매칭되는 행만
→ 주문이 없는 회원은 제외
LEFT JOIN : 왼쪽 테이블 전체 포함
→ 주문이 없는 회원도 포함, 주문 정보는 NULL
언제 LEFT JOIN 을 쓸까?
"주문한 이력이 없는 회원도 목록에 보여야 한다"
"수강 기록이 없는 학생도 표시해야 한다"
→ 기준 테이블의 전체 데이터가 필요할 때
ON 조건 생략시
-- ON 없이 JOIN 하면 모든 행의 조합이 나옴 (Cartesian Product)
SELECT * FROM student JOIN enrollment;
-- 학생 6명 × 수강기록 8건 = 48행 (의미 없는 데이터)
-- ON 조건은 항상 명시해야 합니다
핵심 요약
INNER JOIN : 두 테이블 모두에 매칭 → 가장 많이 사용
LEFT JOIN : 왼쪽 테이블 전체 + 오른쪽은 NULL 허용
RIGHT JOIN : 오른쪽 테이블 전체 + 왼쪽은 NULL 허용
ON 조건 필수
생략하면 모든 조합이 나와서 의미 없는 결과
실무 패턴
회원 + 주문 → INNER JOIN (주문한 회원만 필요할 때)
회원 + 주문 → LEFT JOIN (모든 회원 조회 필요할 때)