본문 바로가기
MySQL/기본 개념 및 지식

[MySQL] 20. JOIN

글: Song hyun 2024. 6. 5.
728x90
반응형

[MySQL] 20. JOIN 

1. JOIN이란?

2. 왜 JOIN을 사용할까?

3. JOIN의 특징

4. 시나리오 코드로 JOIN 이해하기


1. JOIN이란?

 

-데이터베이스에서 조인은 두 개 이상의 테이블에서 관련된 데이터를 결합해, 새로운 결과를 생성할 때 사용하는 중요한 연산이다.

 


2. 왜 JOIN을 사용할까?

 

(1) 데이터베이스에서 정보는 중복을 최소화하고, 효율적으로 저장하기 위해 여러 테이블에 분산되어 저장한다. 그런데 실제로 정보를 사용할 때는 여러 테이블에 흩어져있는 데이터를 통합할 필요가 있다.

(2) ex: 어떤 학생이 어떤 수업을 듣고 있는지 알고 싶을 때, '학생'과 '수업' 테이블을 결합해야만 필요한 정보를 얻을 수 있다.

(3) 조인은 데이터베이스에서 분산된 정보를 효과적으로 통합해, 사용자가 원하는 특정 정보를 얻기 위한 도구이다.

 


3. JOIN의 특징

 

(1) 항상 먼저 접근하는 테이블이 기준이 되고, 아래의 그림에서 왼쪽 동그라미에 해당된다.

(2) JOIN은 크게 INNER JOIN, OUTER JOIN으로 분류된다. 

(3) INNER JOIN은 조건에 해당되는 데이터만 도출한다.

(4) OUTER JOIN은 아래와 같이 분류된다. (MySQL에서는 FULL OUTER JOIN을 지원하지 않음)

-LEFT OUTER JOIN
-RIGHT OUTER JOIN

 

 


4. 시나리오 코드로 JOIN 이해하기

 

(1) 테이블 생성하기

use mydb2;

create table tb_grade(
    grade char(1) primary key,
    score int
);

create table tb_stduent(
    no int not null primary key,
    name varchar(2) not null,
    gender enum('F','M') not null,
    grade char(1),
    foreign key(grade) references tb_grade(grade)
);

 

*ENUM:데이터의 범주화. 들어올 데이터를 규정짓는다.

*위의 코드에서 grade는 성적 단위를 규정하는 테이블이다. (ex: A,B,C,D,E...)

 


(2) 테이블 스키마 추가 및 데이터 생성

-- 오류 발생. 아래에서 스키마 추가
-- insert into tb_stduent(no,name,gender,grade,age) values(100,'길동','F','B',25);
-- 스키마 구조 변경이 필요하다. 
-- 스키마= 테이블 구조, 제약사항

alter table tb_stduent drop agr;
alter table tb_stduent add age int;
insert into tb_stduent(no,name,gender,grade,age)
	values(101,'길동','F','B',25);
insert into tb_stduent(no,name,gender,grade,age)
	values(102,'둘리','M','C',21);
insert into tb_stduent(no,name,gender,grade,age)
	values(103,'도우너','F','D',23);
insert into tb_stduent(no,name,gender,grade,age)
	values(104,'뿌까','M','E',24);

 

 


(3) 1단계 쿼리: 두 개의 테이블을 JOIN 하기(on x)

별개의 테이블이었던 grade, student가 JOIN 된 것을 확인활 수 있다. (3번째 사진)

 

*MySQL에서 JOIN,CROSS JOIN,INNER JOIN은 구문적으로 동등하다. 결과가 같고, 서로 대체 가능하다.

 

-하지만 표준 SQL에서는 동일하지 않다. 보통 INNER JOIN은 ON 절과 함께 쓰이고, CROSS JOIn은 다르게 사용된다. CROSS JOIN은 한 쪽 테이블의 행 하나에 다른 쪽 테이블의 행을 각각 조인시키는 것이다.

-ON 조건 없이 사용하게 되면, CROSS JOIN의 결과가 나오고

-- JOIN 연산에 ON 절 사용 안해보기!!
-- 크로스 JOIN이 된다.
select*
from tb_stduent
join tb_grade;

select*
from tb_grade 
join tb_stduent;

 

 


(4) 1단계 쿼리 : 두 개의 테이블을 JOIN 하기(on)

 아래의 코드를 살펴보면, student 의 grade와 grade의 grade가 join 된 것을 확인할 수 있다.

-- JOIN 연산은 가능한 ON 절과 함께 사용하자.
-- JOIN 연산에는 --> INNER/OUTER
-- -> INNER JOIN: 그냥 JOIN
-- -> OUTER JOIN: 

select *
from tb_stduent
join tb_grade
on tb_stduent.grade=tb_grade.grade;

 


(5) 2단계 쿼리: 필요한 부분만 가져오기

위의 사진과 같이 두 테이블의 항목이 연결되고 있다.

-- 2 단계 쿼리 : 필요한 부분만 가져오기
select s.no, s.name, s.grade, s.age, s.score
from tb_stduent as s
join tb_grade as g
on s.grade=g.grade;
728x90
반응형