Mission Completed

JOIN 종류와 사용(1)-INNER JOIN, CROSS JOIN, JOIN, 콤마 연산자 본문

selfstudy/MySQL

JOIN 종류와 사용(1)-INNER JOIN, CROSS JOIN, JOIN, 콤마 연산자

삼지안☆ 2013. 9. 6. 11:44

SELECT 문의 기본적인 문법

SELECT는 아마 SQL 언어에서 다른 어느 것보다도 가장 자주 사용되는 문장이겠지만, 또한 가장 까다로운 것이기도 하다.
행을 선택할 때 사용하는 구속 조건은 마구 복잡해질 수도 있고 많은 테이블 안에 있는 칼럼 간의 비교를 포함할 수도 있다.


_SELECT 문
SELECT select_list				# 선택할 칼럼
FROM table_list						# 선택할 행이 있는 곳
WHERE row_constraint			# 행이 만족되어야 하는 조건
GROUP BY grouping_cols		# 결과를 그룹으로 만드는 방법
ORDER BY sorting_cols			# 결과를 정렬시키는 방법
HAVING group_constraint		# 그룹이 만족되어야 하는 조건
LIMIT count;							# 결과의 제한

어떤 DB 제품들은 FROM 절까지는 필수로 하기도 한다.
하지만 MySQL은 그렇지 않고 어떠한 테이블에 대한 참조 없이 표현식을 평가할 수 있도록 허용한다.

복수 테이블 SELECT 문의 다른 타입은 서브쿼리(하나의 SELECT,가 다른 것에 중첩되어 있다)와 UNION 문이다. 이것에 대해서는 나중에 다시 논하도록 하겠다.

앞으로 자주 사용할 두 테이블, t1과 t2
CREATE TABLE t1 (
 	i1 int(1) primary key,
	c1 char(1)
);
CREATE TABLE t2 (
 	i2 int(1) primary key,
	c2 char(1)
);
INSERT INTO t1 (i1, c1) values 
	(1, 'a'),
	(2, 'b'),
	(3, 'c');
INSERT INTO t2 (i2, c2) values
	(2, 'c'),
	(3, 'b'),
	(4, 'a');

내부 조인 (INNER JOIN)

SELECT 문에서 FROM 절 내에 복수 테이블을 INNER JOIN에 의해 구분해서 명명하면, MySQL은 내부 조인을 수행하여 어떤 테이블의 행을 다른 테이블의 행과 매칭한다.
예를 들면, t1과 t2를 다음과 같이 조인 시키면, t1에 있는 각 행은 t2에 있는 각 행에 연결된다.


SELECT * FROM t1 INNER JOIN t2;					#이걸 사용하거나
SELECT t1.*, t2.* FROM t1 INNER JOIN t2;	#이걸 사용하거나 결과는 같다.
i1c1i2c2
1a2c
2b2c
3c2c
1a3b
1a2c
1a2c
1a4a
1a2c
1a2c

만약 모든 칼럼을 선택하고 싶지 않으며, 좀 다르게 왼쪽에서 오른쪽 순서로 나타내고 싶다면,
각 칼럼을 콤마로 구분하여 사용해도 된다.


각 테이블의 각 행이 다른 모든 테이블 내의 각 행에 교차시켜서 만들어낸 가능한 모든 조합을 "카르테시안 곱(Cartesian product)"라고도 한다.
하지만 이렇게 되면 많은 수의 행이 있을 수 있기 때문에 통상적으로 WHERE절을 사용해서 결과 세트의 수를 줄여 보다 관리하기 편한 크기로 만들게 된다.

JOIN & CROSS JOIN & ','(콤마) JOIN

JOIN, CROSS JOIN, COMMA JOIN 타입은 INNER JOIN과 같다.
하지만 콤마연산자는 다른 조인 타입과 다른 우선순위를 가지고 있으며, 다른 타입의 불가능한 문법 에러를 발생할 수 있다.
따라서 책의 저자는 콤마 연산자를 사용하지 않을 것을 추천한다.

SELECT t1.*, t2.* FROM t1 INNER JOIN t2 WHERE t1.i1 = t2.i2;
SELECT t1.*, t2.* FROM t1 CROSS JOIN t2 WHERE t1.i1 = t2.i2;
SELECT t1.*, t2.* FROM t1 JOIN t2 WHERE t1.i1 = t2.i2;
SELECT t1.*, t2.* FROM t1, t2 WHERE t1.i1 = t2.i2;

위 네 문장 모두 같은 결과를 출력한다.

i1c1i2c2
2b2c
3c3b

INNER JOIN, CROSS JOIN, JOIN은 테이블 칼럼을 어떻게 매칭해야 하는지를 지정하기 위한 다른 문법을 허용한다.
_WHERE 절보다 ON절을 사용하는 문법_
ON은 조인하고자 하는 칼럼들이 동일한 이름을 가지더라도 이에 상관없이 사용될 수 있다.
다음의 예는 INNER JOIN을 어떻게 사용하는지 나타낸다.

SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ON t1.i1 = t2.i2;

_USING() 절을 포함하는 다른 문법_
이는 ON과 개념이 동일하지만, 조인된 칼럼 또는 칼럼의 이름은 각 테이블에서 동일해야 한다.
예를 들면, 다음의 쿼리는 mytbl1.b를 mytbl2.b에 조인한다.
SELECT mytbl1.*, mytbl2.* FROM mytbl1 INNER JOIN mytbl2 USING(b);

출처: Paul DuBois, 김형훈 역, 2009. 한국어판 MySQL 4th ed., chapter2 section8.