JOIN에 대해 검색하면 위와 같은 그림이 많이 보이는데, 아무것도 모르는 상태에서 보면 무슨 소리인지 이해가 전혀 가지 않는다. 심지어 뭐가 어떤 테이블이 왼쪽 동그라미이고 오른쪽 동그라미에 해당하는지도 몰랐다.
항상 먼저 접근하는 테이블이 기준이 되고, 위의 JOIN 그림에서 왼쪽 동그라미에 해당한다.
INNER JOIN
과 OUTER JOIN
으로 분류된다.LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
(MySQL에서는 지원 X)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);
JOIN
, CROSS JOIN
, INNER JOIN
은 구문적으로 동등하다. 결과가 같고, 서로 대체 가능하다.CROSS JOIN
이란 한 쪽 테이블의 행 하나에 다른 쪽 테이블의 행을 각각 조인시키는 걸 말한다.)CROSS JOIN
의 결과가 나오고, ON 조건을 사용하게 되면 조건을 건 컬럼의 값이 같은 데이터들을 합친 결과가 나온다. 상세 내용은 아래에.MySQL에서는 JOIN 또는 INNER JOIN을 할 때, ON 으로 조건을 지정해주지 않으면 CROSS JOIN의 결과가 나온다.
SELECT *
FROM student
JOIN grade;
SELECT *
FROM student
INNER JOIN grade;
SELECT *
FROM student
CROSS JOIN grade;
위의 3개 쿼리 모두 아래의 화면과 같이 동일한 결과가 나온다. ON 조건이 없기 때문에 모두 CROSS JOIN한 결과가 반환된 것이다.
student
테이블을 기준으로 grade
테이블을 JOIN(INNER JOIN)
하는 것을 요약한 그림이다. grade 컬럼을 조건으로 걸고 조인을 했다.
student 테이블의 각각의 데이터에 같은 grade 값을 가진 데이터를 합친다.
왼쪽 테이블을 기준으로 합치며, ON 절에 있는 조건 컬럼의 값이 같은 데이터를 합친다. 오른쪽 테이블에 값이 같은 데이터가 없다면, NULL이 삽입된다.
합쳐지는 방식은 ON
절에 조건으로 걸어둔 컬럼을 기준으로 같은 값을 가진 데이터를 합치는 것으로 INNER JOIN
과 동일하지만, 같은 값을 가진 데이터가 없더라도 조회한다는 차이점이 있다.
(만약 INNER JOIN이었다면, 위 그림에 나온 결과에서 grade
가 C, E, F에 해당하는 데이터는 조회되지 않았을 것이다.)
오른쪽 테이블을 기준으로 합치며, 나머지 설명은 LEFT JOIN과 같다.