본문 바로가기
Database/mysql

[MYSQL / Database] Join 조인 연산

by JINJINC 2023. 4. 18.
728x90
반응형

 조인 join

  A = {1,2,3,4}     B = {3,4,5,6,7}   =>  결과 = { ? }

- JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해 것.

- 가장 많이 사용하는 조인은 inner join(☆) > outer join(☆) > self join > cross join > natural join 이다.

 

[ JOIN 예제 테이블]

예제 테이블1

 INNER JOIN : A  와   B의 교집합 

- 조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력
- inner join은 EQUI join 이라고도 하고, 그냥 join 이라고도 하며, 등가 조인 이라고도 표현할 수 있습니다.

-JOIN 만 적었을 경우 기본값으로 INNER JOIN 이 됩니다.

A = {1,2,3,4} B = {3,4,5,6} --> 결과 : {3,4}   교집합 부분만 출력됨 
 SELECT TableA.ID, TableA.NAME, TableB.ID, TableB.NAME 
  FROM TableA (INNER) JOIN TableB 
  ON TableA.NAME = TableB.NAME 
 /* 또는 */
  SELECT A.ID, A.NAME, B.ID, B.NAME 
  FROM TableA A (INNER) JOIN TableB B 
  ON A.NAME = B.NAME
  
  /* INNER 은 생략가능 */

INNER JOIN 결과
INNER JOIN 결과

WHERE 절 추가 하기 

select ta.id, ta.name, tb.id, tb.name
from ta inner join tb
on ta.name = tb.name
where ta.name = '서길동';

=> 이미 JOIN 된 이후의 데이터에서 WHERE조건을 적용한다.

WHERE절 추가

 LEFT JOIN (= LEFT OUTER JOIN)

- LEFT JOIN은 두 테이블이 있을 경우, 첫 번째 테이블을 기준으로 두 번째 테이블을 조합하는 JOIN이다.

A = {1,2,3,4} B = {3,4,5,6} --> 결과 : {1,2,3,4}
SELECT TableA.ID, TableA.NAME, TableB.ID, TableB.NAME 
  FROM TableA LEFT JOIN TableB 
  ON TableA.NAME = TableB.NAME;
  /* 또는 */
SELECT A.ID, A.NAME, B.ID, B.NAME 
  FROM TableA A LEFT JOIN TableB B 
  ON A.NAME = B.NAME;

LEFT JOIN 결과

왼쪽의 테이블은 다 나오지만 두번째 테이블은 교집합이 아닌 부분은 NULL로 표시된다.

 

 RIGHT JOIN ( = RIGHT OUTER JOIN)

- RIGHT JOIN은 두 테이블이 있을 경우, 두 번째 테이블을 기준으로 첫 번째 테이블을 조합하는 JOIN이다.

- RIGHT JOIN은 A와 B 테이블 중에 B 값 + A와 B의 NAME값이 같은 결과 를 리턴하는 것이다.

A = {1,2,3,4} B = {3,4,5,6} --> 결과 : {3,4,5,6}
SELECT TableA.ID, TableA.NAME, TableB.ID, TableB.NAME 
  FROM TableA RIGHT JOIN TableB 
  ON TableA.NAME = TableB.NAME;
  /* 또는 */
SELECT TableA.ID, TableA.NAME, TableB.ID, TableB.NAME 
  FROM TableA RIGHT JOIN TableB 
  ON TableA.NAME = TableB.NAME;

RIGHT JOIN 결과

 FULL OUTER JOIN 

A = {1,2,3,4} B = {3,4,5,6} --> 결과 : {1,2,3,4,3,4,5,6}

- 이름에서도 알수있는 FULL의 의미는 A와 B 전체를 구하는 것이다.
- MySQL은 FULL OUTER JOIN을 지원하지 않는다고 한다.

 

  SELECT * FROM TableA A FULL OUTER JOIN TableB B ON A.NAME = B.NAME;

 

 CROSS JOIN : 두 집합의 곱집합 출력

- 한 테이블의 모든 행과 다른 테이블의 모든 행이 연결되는 모든 경우를 반환

A 튜플의 수* B 튜플의 수 =  CROSS JOIN 튜플 수 

A = {1, 2, 3} B = {A ,B ,C} --> 결과 : {1A, 1B, 1C, 2A, 2B, 2C, 3A, 3B, 3C}
SELECT TableA.ID, TableA.NAME, TableB.ID, TableB.NAME 
  FROM TableA CROSS JOIN TableB 
  ORDER BY TableA.ID, TableB.ID;
  /* 또는 */
SELECT A.ID, A.NAME, B.ID, B.NAME 
  FROM TableA A INNER JOIN TableB B 
  ORDER BY A.ID, B.ID;

SELF JOIN

-동일 집합끼리 특정 컬럼 기준으로 집합 출력
- 말 그대로 테이블 자기자신을 조인 한 것

 

 SELECT A.ID, A.NAME, B.ID, B.NAME 
  FROM TableA A JOIN TableA B 
  ON A.NAME <> B.NAME order by A.ID;

 

 

 UNION 과 UNION ALL

- UNION은 여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용
- 이때 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 같아야 하며, 필드의 순서 또한 같아야 한다.
UNION은 여러 테이블의 쿼리의 결과를 합칠때 중복된 행은 제거한다.
- UNION ALL은  여러 테이블의 쿼리의 결과를 합칠때 중복된 행은 제거하지 않는다.

select * from ta 
union 
select * from tb;

select * from ta 
union all
select * from tb;

UNION 한 결과

지금은 겹치는 내용이 없기 때문에 UNION ALL과 UNION한 결과값이 동일함 

728x90
반응형

댓글