[MySQL] JOIN

김유정·2022년 11월 27일
0
post-custom-banner


JOIN에 대해 검색하면 위와 같은 그림이 많이 보이는데, 아무것도 모르는 상태에서 보면 무슨 소리인지 이해가 전혀 가지 않는다. 심지어 뭐가 어떤 테이블이 왼쪽 동그라미이고 오른쪽 동그라미에 해당하는지도 몰랐다.

항상 먼저 접근하는 테이블이 기준이 되고, 위의 JOIN 그림에서 왼쪽 동그라미에 해당한다.

  • JOIN은 크게 INNER JOINOUTER JOIN으로 분류된다.
  • INNER JOIN은 조건에 해당하는 데이터만 뽑아낸다.
  • OUTER JOIN 에는 다음과 같이 분류되지만, MySQL에서는 FULL OUTER JOIN을 지원하지 않는다.
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
    • FULL OUTER JOIN (MySQL에서는 지원 X)

실습 준비


  • 실습을 위한 sql 쿼리문
create table student (
	no int primary key,
    name varchar(20),
    gender ENUM('F', 'M'),
    age int,
    grade char(1),
    foreign key(grade) references grade (grade)
);

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

insert into student
values('20170001', 'Joy', 'F', 25, 'B');
insert into student
values('20170020', 'Andrew', 'M', 26, 'B');
insert into student
values('20180800', 'Daisy', 'F', 24, 'A');
insert into student
values('20190123', 'Dana', 'F', 23, 'A');
insert into student
values('20201000', 'Sky', 'M', 22, 'D');

insert into grade
values('A', 100);
insert into grade
values('B', 80);
insert into grade
values('C', 60);
insert into grade
values('D', 40);
insert into grade
values('E', 20);
insert into grade
values('F', 0);
  • student 테이블
  • grade 테이블

INNER JOIN (= JOIN, CROSS JOIN)


  • MySQL에서 JOIN, CROSS JOIN, INNER JOIN은 구문적으로 동등하다. 결과가 같고, 서로 대체 가능하다.
    (표준 SQL에서는 동일하지 않다. 보통 INNER JOIN은 ON절과 함께 쓰이고, CROSS JOIN은 다르게 사용된다. CROSS JOIN이란 한 쪽 테이블의 행 하나에 다른 쪽 테이블의 행을 각각 조인시키는 걸 말한다.)
  • ON 조건 없이 사용하게 되면 CROSS JOIN의 결과가 나오고, ON 조건을 사용하게 되면 조건을 건 컬럼의 값이 같은 데이터들을 합친 결과가 나온다. 상세 내용은 아래에.

ON 조건 없이 사용

MySQL에서는 JOIN 또는 INNER JOIN을 할 때, ON 으로 조건을 지정해주지 않으면 CROSS JOIN의 결과가 나온다.

  • JOIN
SELECT *
FROM student
JOIN grade;
  • INNER JOIN
SELECT *
FROM student
INNER JOIN grade;
  • CROSS JOIN
SELECT *
FROM student
CROSS JOIN grade;

위의 3개 쿼리 모두 아래의 화면과 같이 동일한 결과가 나온다. ON 조건이 없기 때문에 모두 CROSS JOIN한 결과가 반환된 것이다.

ON 조건과 함께 사용

student 테이블을 기준으로 grade 테이블을 JOIN(INNER JOIN) 하는 것을 요약한 그림이다. grade 컬럼을 조건으로 걸고 조인을 했다.
student 테이블의 각각의 데이터에 같은 grade 값을 가진 데이터를 합친다.

OUTER JOIN


LEFT JOIN(= LEFT OUTER JOIN)

왼쪽 테이블을 기준으로 합치며, ON 절에 있는 조건 컬럼의 값이 같은 데이터를 합친다. 오른쪽 테이블에 값이 같은 데이터가 없다면, NULL이 삽입된다.

합쳐지는 방식은 ON 절에 조건으로 걸어둔 컬럼을 기준으로 같은 값을 가진 데이터를 합치는 것으로 INNER JOIN과 동일하지만, 같은 값을 가진 데이터가 없더라도 조회한다는 차이점이 있다.
(만약 INNER JOIN이었다면, 위 그림에 나온 결과에서 grade가 C, E, F에 해당하는 데이터는 조회되지 않았을 것이다.)

RIGHT JOIN(= RIGHT OUTER JOIN)

오른쪽 테이블을 기준으로 합치며, 나머지 설명은 LEFT JOIN과 같다.

참고


post-custom-banner

0개의 댓글