SQL JOIN의 이해

haejun-kim·2020년 9월 17일
0

[DATABASE]

목록 보기
5/7

JOIN

Join이란 두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어 내는 것을 말한다. 데이터베이스의 테이블은 중복과 공간 낭비를 피하고 데이터의 무결성을 위해서 여러 개의 테이블로 분리하여 저장한다. 그리고 이 분리 된 테이블들은 서로 관계를 맺고 있다.
그렇기 때문에 이러한 여러개의 테이블 간의 관계에서 두 개 이상의 테이블을 묶어서 하나의 결과 집합으로 나타내는 조인이라는 과정은 굉장히 중요하다.

INNER JOIN(내부 조인)

INNER JOIN은 JOIN 중에서 가장 많이 사용되는 JOIN이다.

예를 들어보자. 상품의 구매와 관련 된 구매 테이블이 있고, 구매 한 회원에 대한 정보를 알기 위한 회원에 관련 된 테이블이 있다고 가정해보자. 이 경우, 물건을 배송하기 위해서는 구매 한 회원의 주소를 알아야 한다. 이 회원의 주소 정보를 알기 위해 주소 정보가 있는 회원 테이블과 결합하는 조인이 INNER JOIN이다.

--형식
SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블>
	ON <조인 될 조건>
WHERE 검색조건

위의 형식에서 INNER JOIN을 그냥 JOIN으로 적어도 INNER JOIN으로 인식한다.

구매 테이블 중에서 JYP라는 아이디를 가진 사람이 구매 한 물건을 발송하기 위해서 이름/주소/연락처 등을 조인해서 검색하는 경우 다음과 같이 작성하면 된다.

SELECT *
	 FROM buyTbl
		INNER JOIN userTbl
			ON buyTbl.userID = userTbl.userID
		WHERE buyTbl.userID = 'JYP';

ON 구문과 WHERE 구문에는 '테이블이름.열이름'의 형식으로 되어 있다. 그렇게 해야 하는 이유는 두 개의 테이블에 동일한 열 이름이 모두 존재하기 때문이다. 그래서 두 개의 테이블을 결합하는 경우에 동일한 열 이름이 있다면 꼭 '테이블명.열이름' 형식으로 표기해주어야 한다.

위의 구문은 다음과 같은 과정을 거친다.

구매 테이블의 userIDJYP를 추출한다. 그리고 JYP와 동일한 값을 판매 테이블의 userID열에서 검색 한 후, JYP라는 아이디를 찾으면 구매 테이블과 판매 테이블의 두 행을 결합한다.

만약 WHERE buyTBl.userID = 'JYP' 를 생략하면 buyTbl의 모든 행에 대해서 위와 동일한 방식으로 반복하게 된다.

OUTER JOIN(외부 조인)

OUTER JOIN은 조인의 조건에 만족되지 않는 행까지도 포함시키는 JOIN이다. INNER JOIN은 양쪽 테이블에 모두 내용이 있는 것만 조인되는 방식이고 OUTER JOININNER JOIN과 마찬가지로 양쪽에 내용이 있으면 당연히 조인되고, 한쪽에만 내용이 있어도 그 결과가 표시되는 방식이다.

가끔 유용하게 사용되는 방식이기 때문에 기억 해 두자.

SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
		ON <조인 될 조건>
	WHERE 검색조건;

예를 들어 보자. 전체 회원의 구매 기록을 보는데 단, 구매 기록이 없는 회원도 출력해야 한다. 이럴 경우의 쿼리문은 다음과 같다.

SELECT U.userID, U.name, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '연락처'
	FROM userTbl U
		LEFT OUTER JOIN buyTbl B
			ON U.userID = B.userID
	ORDER BY U.userID;

LEFT OUTER JOIN문의 의미를 왼쪽 테이블(userTbl)의 것은 모두 출력되어야 한다 정도로 해석하면 기억하기 쉽다. 동일한 결과를 RIGHT OUTER JOIN으로 얻기 위해서는 단순히 왼쪽과 오른쪽 테이블의 위치만 바꿔주면 된다.

FULL JOIN(전체 조인 또는 전체 외부 조인)

FULL JOIN은 간단히 LEFT JOIN + RIGHT JOIN이라고 생각하면 된다. 즉, 한쪽을 기준으로 조건과 일치하지 않는 것을 출력하는 것이 아니라, 양쪽 모두에 조건이 일치하지 않는 것을 모두 출력하는 개념이다.

UNION JOIN

UNION JOIN은 두 쿼리의 결과를 행으로 합치는 것을 말한다.

SELECT 문장1
	UNION ALL
SELECT 문장2
  • SELECT 문장1과 SELECT 문장2의 결과 열의 개수가 같아야 한다.
  • 데이터 형식도 각 열 단위로 같거나 서로 호환되는 데이터 형식이어야 한다. 예를 들어 문장 1의 결과는 INT인데 문장1의 결과는 CHAR이라면 오류가 발생할 것이다.
  • 열 이름은 문장1의 열 이름에 따른다.
  • UNION만 사용하면 중복 된 열은 제거되고 데이터만 정렬되어 나오며, UNION ALL을 사용하면 중복된 열까지 모두 출력된다.

NOT IN / IN

NOT IN은 첫 번째 쿼리의 결과 중에서 두 번째 쿼리에 해당하는 것을 제외하기 위한 구문이다. 예를들어, 사용자를 모두 조회하되 전화가 없는 사람을 제외하고자 한다면 다음과 같이 사용하면 된다.

SELECT name, CONCAT(mobile1, mobile2) AS '전화번호' FROM userTbl
	WHERE name NOT IN ( SELECT name FROM userTbl WHERE mobile1 IS NULL );

반대로 첫 번째 쿼리의 결과 중에서 두 번째 쿼리에 해당되는 것만 조회하기 위해서는 IN을 사용하면 된다.

예를 들어 전화가 없는 사람만 조회하고자 할 때 다음과 같이 사용한다.

SELECT name, CONCAT(mobile1, mobile2) AS '전화번호' FROM userTbl
	WHERE name IN (SELECT name FROM userTbl WHERE mobile1 IS NULL);

0개의 댓글