MySQL : JOIN (vs UNION)

msung99·2022년 10월 27일
0
post-thumbnail

이번 포스팅에서는 SELECT 문에서 자주 활용되는 JOIN 에 대해 알아봅시다. JOIN 은 수학에서 배우는 "집합(Set)" 의 개념이 활용되니, 집합과 관련한 개념을 잘 모르신다면 학습을 미리 하시는 것을 권장드립니다.


JOIN

JOIN 은 SELECT 를 위해 2개 이상의 테이블을 연결시키기 위한 명령어입니다.

  • 2개 이상의 테이블을 결합해서 나타내는 명령

  • 형태 : SELECT [원하는 컬럼] FROM [테이블] JOIN [테이블] ON [조건문]

JOIN 의 다양한 표현방식

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 으로 구분됩니다.


INNER JOIN (JOIN)

테이블 1,2가 있을때 안에 있는 교집합들로만 JOIN 하는 명령어
( 교집합적인 데이터만 연결시켜주고 나머지는 버린다 )

즉, 테이블 1,2 모두 가지고 있는 레코드(데이터)만 검색됩니다.
그냥 JOIN 으로 선언하는 명령어는 곧 INNER JOIN 을 의미합니다.
(즉, 평소에 그냥 사용하는 JOIN 도 INNER JOIN 입니다!)

INNER JOIN 의 형태

SELECT table1.col1, table1.col2, ... , table2.col1, table2.col2, ....
FROM table1 [table1의 별칭]
JOIN table2 [table2의 별칭] ON table1.col1 = table2.col2

  • JOIN 시에 table1과 table2 의 어떤 컬럼을 기준으로 할지는 ON 뒤에 작성합니다.
  • 즉, 위 형태에서는 table1 의 col1 컬럼과 table2 의 col2 컬럼이 같은 행들에 대해서 JOIN 을 실행합니다.
예시

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 컬럼이 출력된다.

예시2


OUTER JOIN 의 3가지 종류

  • OUTER JOIN 에 대해 본격적으로 알아보기 전에 OUTER JOIN 은 위에서 설명했듯이 총 3가지로 나뉩니다.

  • FULL OUTER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN 으로 구분되며,
    여기서 OUTER JOIN 은 통상적으로 FULL 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

예시2


LEFT JOIN (LEFT OUTER JOIN)

테이블 1,2가 있을때 테이블 1의 모든 레코드(데이터) 와 두 테이블(테이블 1,2) 이 일치하는 값을 가진 레코드를 반환( = 교집합 부분)
( 왼쪽은 모두 연결, 오른쪽은 교집합 부분만 연결 )

=> 쉽게말해, 테이블 1에 있는 것들을 위주로 가져오는 명령어입니다.

select employee.empName, department.deptName
from employee
left outer join department on employee.deptNo = department.deptNo

예시2


RIGHT JOIN (RIGHT OUTER JOIN)

LEFT JOIN 과 반대로, 테이블 2에 있는 것들을 위주로 가져온다.
( 오른쪽은 모두 연결, 왼쪽은 교집합 부분만 연결 )

딱히 설명드릴게 없죠? table1 에 대해서 RIGHT JOIN 을 했다면 table2 에 있는 것들을 위주로 가져오는 것입니다.

select employee.empName, department.deptName
from employee
right outer join department on employee.deptNo = department.deptNo

예시2


CROSS JOIN 절

두 데이터의 모든 경우의 수 를 가져온다.

위처럼 모든 경우에 대해서 다 생각하고 가져오는 것이 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


UNION, UNION ALL 연산자

2개 이상의 테이블(정확히는 SQL 쿼리문을) 합치는 연산자

예를들어 아래처럼 테이블이 있다고 가정해봅시다.

SELECT ID, NAME FROM table1;
SELECT ID, NAME FROM table2;

UNION ALL

이 둘을 한번에 출력할 수 있는 것이 바로 UNION ALL 입니다. 아래와 같이 사용하면 됩니다.

SELECT ID, NAME FROM table1;
UNION ALL
SELECT ID, NAME FROM table2;

UNION ALL 연산결과

UNION

그런데 UNION ALL 연산은 중복되는 값도 그대로 출력됩니다.
중복되는 값을 제거해주고 출력 해주고 싶다면 UNION 을 사용하면 됩니다.

SELECT ID, NAME FROM TABLE1 ; 
UNION 
SELECT ID, NAME FROM TABLE2 ;

UNION 연산 결과


JOIN 과 UNION 의 차이

그렇다면 JOIN 과 UNION 에 대해 알아볼 필요가 있습니다. 이 둘은 비슷해보이면서도 다소 차이점을 보입니다.

  • 공통점 : 테이블의 데이터를 연결
  • 차이점 : 연결하는 방법이 다르다.

결합되는 방식의 차이점

  • JOIN 은 테이블의 컬럼이 추가되는 형식으로 데이터가 옆으로 연결됩니다.
  • UNION 은 데이터가 추가되는 형식으로 아래에 연결됩니다.

JOIN 의 결합방식

UNION 의 결합방식


서브퀄

0개의 댓글