테이블에 기준을 FROM 절에 나오는 테이블 기준입니다.
JOIN은 두 개 이상의 테이블에서 관련된 데이터를 결합하여 새로운 결과를 생성하는 데이터베이스 연산입니다.
1.1 JOIN이 필요한 이유
-데이터베이스는 중복을 최소화하기 위해 데이터를 여러 테이블에 나눠 저장합니다.
-실제 사용 시, 분산되 데이터를 통합해야 할 때가 많습니다.
-예 : 학생정보(tb_student)와 성적 등급 정보(tb_grade)를 결합하여 학생별 점수를 확인.
1.2 JOIN의 기본 개념
-JOIN은 테이블 간 공통 열(예: 외래 키와 기본 키)을 기준으로 데이터를 결합합니다.
-MySQL에서는 INNER JOIN, LEFT JOIN, RIGHT JOIN을 지원하며 ,FULL OUTER JOIN은 지원하지 않습니다.
2. 테이블 생성

-- drop database school;
create database school;
use school;
-- 학생, 성적 등급 테이블 생성
create table tb_grade(
grade char(1) primary key,
score int
);
create table tb_student(
no int primary key,
name varchar(20) not null,
gender enum('F', 'M') not null,
age int,
grade char(1),
foreign key(grade) references tb_grade(grade)
);
insert into tb_grade(grade, score) values
('A', 100),
('B', 80),
('C', 60),
('D', 40),
('E', 20),
('F', 0);
select * from tb_grade;
-- tb_student 데이터 삽입
INSERT INTO tb_student (no, name, gender, age, grade) VALUES
(20170001, '조이', 'F', 25, 'B'),
(20170020, '앤드류', 'M', 26, 'B'),
(20180800, '데이지', 'F', 24, 'A'),
(20190123, '다나', 'F', 23, 'A'),
(20201000, '스카이', 'M', 22, 'D');
3. 실습
3.1 INNER JOIN
설명 : 두 테이블에서 조건에 맞는 데이터만 결합, 조건에 맞지 않는 데이터는 제외됨.
MySQL 특징 : MySQL에서 JOIN, INNER JOIN, CROSS JOIN은 기본적으로 동일한 결과를 생성,
그러나 ON 조건 여부에 따라 결과가 달라짐.
- ON 조건 없이 사용 시 CROSS JOIN 결과(모든 해의 조합)
- ON 조건 사용 시 조건에 맞는 데이터만 결합.
예제 1. CROSS JOIN (ON 조건 없이 - CROSS JOIN은 INNER JOIN 의 특수한 형태)
select *
From tb_student
JOIN tb_grade;
- 결과 : 학생 5 명 * 등급 6개 = 30행(모든 조합)
예제 2: INNER JOIN (ON 조건 사용)
select *
from tb_student as s
JOIN tb_grade as g
on s.grade = g.grade;
결과 : 학생의 grade와 등급의 grade가 일치하는 데이터만 결합

3.2 OUTER JOIN
3.2.1 LEFT JOIN(LEFT OUTER JOIN)
RIGHT JOIN(LEFT OUTER JOIN)
개념 재확인 요망
연습문제
-- 문제 1 : INNER JOIN - 학년이 'A' 또는 'B'인 학생 조회
select s.no, s.name, s.gender, s.age, s.grade, g.score
from tb_student as s
inner join tb_grade as g
on s.grade = g.grade
where s.grade = 'A' or s.grade = 'B';
-- 문제 2 LEFT JOIN - 모든 여학생 조회 -설명: LEFT JOIN을 사용하여 모든 여학생(gender = 'F')의 이름, 학년, 점수를 조회하세요. 점수가 없는 경우에도 학생 정보가 표시되어야 합니다.
select s.no, s.name, s.gender, s.age, s.grade, g.score
from tb_student as s
left join tb_grade as g
on s.grade = g.grade
where s.gender = 'F';
-- 문제 3: LEFT JOIN - 나이가 24세 이상인 학생 조회
-- LEFT JOIN을 사용하여 나이가 24세 이상인 학생의 이름, 나이, 학년, 점수를 조회하세요. 점수가 없는 경우에도 학생 정보가 표시되어야 합니다.
select s.no, s.name, s.gender, s.age, s.grade, g.score -- select *
from tb_student as s -- from
left join tb_grade as g -- left join
on s.grade = g.grade -- on
where s.age >= 24 ; -- where
-- 문제 4: RIGHT JOIN - 점수가 60 이상인 등급 조회
-- 설명: RIGHT JOIN을 사용하여 점수가 60 이상인 등급과 해당 등급을 가진 학생의 이름, 학년, 점수를 조회하세요. 학생이 없는 등급도 표시되어야 합니다.
select s.no, s.name, s.gender, s.age, s.grade, g.score
from tb_student as s
right join tb_grade as g
on s.grade = g.grade
where g.score >= 60 ;
-- 문제 5: INNER JOIN과 LEFT JOIN 비교
-- 설명: INNER JOIN과 LEFT JOIN을 각각 사용하여 모든 학생의 이름, 학년, 점수를 조회하고 결과를 비교하세요.
select s.no, s.name, s.gender, s.age, s.grade, g.score
from tb_student as s
inner join tb_grade as g
on s.grade = g.grade;
select s.no, s.name, s.gender, s.age, s.grade, g.score
from tb_student as s
left join tb_grade as g
on s.grade = g.grade;
-- 문제 6: RIGHT JOIN - 기준 테이블 변경
-- 설명: RIGHT JOIN을 사용하여 tb_grade를 기준으로 모든 등급과 해당 학생의 이름, 나이를 조회하세요. 학생이 없는 등급도 표시되어야 합니다.
select s.no, s.name, s.gender, s.age, s.grade, g.score
from tb_student as s
right join tb_grade as g
on s.grade = g.grade;
select s.no, s.name, s.gender, s.age, s.grade, g.score
from tb_student as s
left join tb_grade as g
on g.grade = s.grade;
'MySQL' 카테고리의 다른 글
(DB) 트랜잭션 이란 & (COMMIT,ROLLBACK) -19 (0) | 2025.05.16 |
---|---|
(DB) MySQL 별칭, 변수 선언, IF 문 - 18 (0) | 2025.05.16 |
(DB) 블로그에 필요한 DB 간단 버전 (0) | 2025.05.13 |
(DB) ERD 다이어 그램 만들어 보기 - 16 (1) | 2025.05.13 |
(DB)관계 차수란? -15 (0) | 2025.05.13 |