이번 포스팅에서는 SELECT 문에서 자주 활용되는 JOIN 에 대해 알아봅시다. JOIN 은 수학에서 배우는 "집합(Set)" 의 개념이 활용되니, 집합과 관련한 개념을 잘 모르신다면 학습을 미리 하시는 것을 권장드립니다.
JOIN 은 SELECT 를 위해 2개 이상의 테이블을 연결시키기 위한 명령어입니다.
- 2개 이상의 테이블을 결합해서 나타내는 명령
- 형태 : SELECT [원하는 컬럼] FROM [테이블] JOIN [테이블] ON [조건문]
JOIN 에는 다양한 표현으로써의 JOIN 들이 존재합니다. 동일한 JOIN 표현 결과임에도 다양한 표현식으로 표현이 가능하기 떄문에 다소 혼동이 올 수 있습니다. 미리 정리해보자면 아래와 같습니다.
INNER JOIN = JOIN
OUTER JOIN = FULL OUTER JOIN
LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN
또한 OUTER JOIN 에는 총 3가지 종류로 나눠짐 을 기억합시다.
=> FULL OUTER JOIN, LEFT JOIN, RIGHT JOIN 으로 구분됩니다.
테이블 1,2가 있을때 안에 있는 교집합들로만 JOIN 하는 명령어
( 교집합적인 데이터만 연결시켜주고 나머지는 버린다 )
즉, 테이블 1,2 모두 가지고 있는 레코드(데이터)만 검색됩니다.
그냥 JOIN 으로 선언하는 명령어는 곧 INNER JOIN 을 의미합니다.
(즉, 평소에 그냥 사용하는 JOIN 도 INNER JOIN 입니다!)
SELECT table1.col1, table1.col2, ... , table2.col1, table2.col2, ....
FROM table1 [table1의 별칭]
JOIN table2 [table2의 별칭] ON table1.col1 = table2.col2
예시
SELECT employee.name, employee.job_number, department.location, department.depart_number
FROM employee
JOIN department ON employee.job_number = department.dpart_number
# employee.job_number 와 department.dpart_number 가 같은 행들에 대해 JOIN 을 실행.
# => JOIN 을 실행하면 employee 의 name 과 job_number 컬럼이 출력되고,
# department 의 location 과 depart_number 컬럼이 출력된다.
OUTER JOIN 에 대해 본격적으로 알아보기 전에 OUTER JOIN 은 위에서 설명했듯이 총 3가지로 나뉩니다.
FULL OUTER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN 으로 구분되며,
여기서 OUTER JOIN 은 통상적으로 FULL OUTER JOIN 을 통칭합니다.
이에 이어서 OUTER JOIN 절을 사용하는 것은 곧 FULL OUTER JOIN 절을 사용하는 것과 동일합니다.
테이블 1과 2의 "합집합"
두 테이블의 모든 필드를 조회하는 합집합의 개념입니다. OUTER JOIN 은 곧 FULL OUTER JOIN 이라는 점을 기억해두시길 바랍니다.
즉, INNER JOIN 의 경우 테이블1과 2가 공통적으로 같은 값을 가지는 컬럼들에 대해서만 원하는 값을 SELECT 문으로 원하는 컬럼들을 출력하는 것이지만,
OUTER JOIN 은 같은 값을 가지는 컬럼외에도 다른 값을 가지는 것도 모두 SELECT 문으로 원하는 컬럼들을 출력하는 것입니다.
예시
select employee.empName, department.deptName
from employee
full outer join department on employee.deptNo = department.deptNo
테이블 1,2가 있을때 테이블 1의 모든 레코드(데이터) 와 두 테이블(테이블 1,2) 이 일치하는 값을 가진 레코드를 반환( = 교집합 부분)
( 왼쪽은 모두 연결, 오른쪽은 교집합 부분만 연결 )
=> 쉽게말해, 테이블 1에 있는 것들을 위주로 가져오는 명령어입니다.
select employee.empName, department.deptName
from employee
left outer join department on employee.deptNo = department.deptNo
LEFT JOIN 과 반대로, 테이블 2에 있는 것들을 위주로 가져온다.
( 오른쪽은 모두 연결, 왼쪽은 교집합 부분만 연결 )
딱히 설명드릴게 없죠? table1 에 대해서 RIGHT JOIN 을 했다면 table2 에 있는 것들을 위주로 가져오는 것입니다.
select employee.empName, department.deptName
from employee
right outer join department on employee.deptNo = department.deptNo
두 데이터의 모든 경우의 수 를 가져온다.
위처럼 모든 경우에 대해서 다 생각하고 가져오는 것이 CROSS JOIN 입니다.
크게 어려운 내용은 아니니, 충분히 이해하실 것이라고 생각합니다.
형태1
SELECT [별칭.필드1], [별칭.필드2]... FROM [Table 이름] AS [별칭] CROSS JOIN [Table 이름] AS [별칭]
ex) SELECT a.myAge, a.myName, b.myId FROM mytable AS a CROSS JOIN testtable AS b
=========================================
형태2
SELECT [별칭.필드1], [별칭.필드2]... FROM [Table 이름] AS [별칭], [Table 이름] AS [별칭] CROSS JOIN 대신 ,(콤마) 로도 가능
ex) SELECT a.myAge, a.myName, b.myId FROM mytable AS a, testtable AS b
2개 이상의 테이블(정확히는 SQL 쿼리문을) 합치는 연산자
예를들어 아래처럼 테이블이 있다고 가정해봅시다.
SELECT ID, NAME FROM table1;
SELECT ID, NAME FROM table2;
이 둘을 한번에 출력할 수 있는 것이 바로 UNION ALL 입니다. 아래와 같이 사용하면 됩니다.
SELECT ID, NAME FROM table1;
UNION ALL
SELECT ID, NAME FROM table2;
UNION ALL 연산결과
그런데 UNION ALL 연산은 중복되는 값도 그대로 출력됩니다.
중복되는 값을 제거해주고 출력 해주고 싶다면 UNION 을 사용하면 됩니다.
SELECT ID, NAME FROM TABLE1 ;
UNION
SELECT ID, NAME FROM TABLE2 ;
UNION 연산 결과
그렇다면 JOIN 과 UNION 에 대해 알아볼 필요가 있습니다. 이 둘은 비슷해보이면서도 다소 차이점을 보입니다.
JOIN 의 결합방식
UNION 의 결합방식