본문 바로가기

프로그래밍/mySQL

[mySQL] 조인(JOIN)과 유니온(UNION)

SELECT A.name, B.toy

FROM  my_table A
LEFT OUTER JOIN toys B
ON A.id = B.id;
// 왼쪽 외부 조인
// 왼쪽 테이블의 모든 행을 가지고 오른쪽 테이블 행과 비교
// 조건에 맞는 값이 오른쪽에 없으면 NULL값이 셀에 출력된다.

SELECT A.name, B.toy
FROM my_table A
RIGHT OUTER JOIN toys B
ON A.id = B.id;
// 오른쪽 외부 조인

SELECT A.name name, B.name boss
FROM clown_info1 A
INNER JOIN clown_info2 B
ON A.boss_id = B.id;
// 두 테이블의 데이터는 완벽히 같다, 즉 동일한 테이블 -> 셀프 조인
// 아래와 같다

SELECT A.name, B.name boss
FROM clown_info A
INNER JOIN clown_info B
ON A.boss_id = B.id;
// 이런식으로 하나의 테이블을 여러 별명으로 사용하여 구성 가능하다.
// 셀프 조인



두 개 이상의 테이블을 묶는 방법 유니온
SELECT name FROM my_table1
UNION
SELECT name FROM my_table2
UNION
SELECT name FROM my_table3;
// 모든 결과를 name열에 출력함.
// 모든 결과를 합치는 동작.
// 중복 데이터는 없다.
// 열의 개수는 같아야 한다.
// 위에서 한 개 이면 밑에도 동일해야 한다.


SELECT name FROM my_table1
UNION
SELECT name FROM my_table2
UNION
SELECT name FROM my_table3
ORDER BY name;
// 정렬은 마지막에 한번만 가능하다.
// 그 이유는 유니온이 모드 결과를 합치기 때문


SELECT name FROM my_table1
UNION ALL
SELECT name FROMy_table2
UNION ALL
SELECT name FROM my_table3;
// UNION ALL을 사용하면 중복된 값들도 전부 출력한다.


CREATE TABLE test_table
AS 
SELECT profession FROM my_table
UNION
SELECT profession FROM pro_table;
// UNION을 이용하여 새 테이블 생성



SELECT name FROM my_table
INTERSECT
SELECT name FROM sub_table;
// 중복 부분만 반환



SELECT name FROM my_table

EXCEPT

SELECT name FROM sub_table;

// 두 번째 테이블에 없는 열을 반환





서브 쿼리와 조인의 변환 예제

SELECT B.last_name, B.first_name, A.profession

FROM my_table A

NATURAL JOIN sub_table B

WHERE A.profession IN ( SELECT profession FROM pro_table);

// A와 B테이블을 자연 조인하고

// A의 profession열과 pro_table의 항목이 일치하는 부분을 출력한다.

// 아래로 변경이 가능하다.


SELECT B.last_name, B.first_name, A.profession

FROM my_table A

NATURAL JOIN sub_table B

INNER JOIN pro_table C
ON A.profession = C.profession;




SELECT A.name AS name, B.name AS boss

FROM my_table A

INNER JOIN my_table B

ON A.boss_id = B.id;

//아래로 변경 가능


SELECT A.name name,

  (SELECT name FROM my_table WHERE A.boss_id = id) AS boss

FROM my_table A;