본 글은 아사이 아츠시 저 '하루 30분 36강으로 배우는 완전 초보의 SQL 따라잡기'를 기반으로 작성되었습니다.
select * from sample71_a
union
select * from sample71_b;
select a from sample71_a
union
select b from sample71_b
union
select age from sample31;
중복을 제거한 합집합을 구하는 UNION 명령어이다. 주의할 점은 합쳐지는 테이블에서 선택된 열의 개수와 각각의 자료형이 일치해야 한다는 점이다.
결과 테이블은 먼저 select하는 순서대로 나열된다.
select a as c from sample71_a
union
select b as c from sample71_b order by c;
UNION으로 SELECT 명령을 연결하는 경우, 가장 마지막 SELECT 명령에 대해서만 ORDER BY 구를 지정할 수 있다. ORDER BY 구에 지정하는 열은 별명을 붙여 이름을 일치시켜야 한다.
select * from sample71_a
union all
select * from sample71_b;
중복 포함하여 합집합을 구하는 UNION ALL 명령어이다.
참고로 MySQL에서는 교집합과 차집합을 지원하지 않는다. Oracle, SQL server 등에서 INTERSECT, EXCEPT(Oracle에서는 MINUS)로 지원한다.
Cartesian Product를 통해 스포츠 대진표를 만든다고 생각하면 쉽다. 모든 팀이 한 번씩 전부 경기를 하는 경우를 나열하는 방식이다.
select * from sample72_x, sample72_y;
명령어는 간단하게 FROM 구에 두 개 이상의 테이블을 쉼표(,)로 연결해주면 된다.
코딩테스트에서 가장 많이 출제되면서 헷갈리는 명령어가 아닐까 한다. 내부결합을 통해 Join하려는 기본키가 두 테이블 중 하나에 없으면 검색 결과에 나타나지 않게 된다.
기본키(Primary Key, PK)란 테이블의 행마다 유일성이 보장되는 키라고 생각하면 된다. 예를 들어 상품코드, id 등이 있을 수 있다. 반드시 유일성이 보장되어야만 기본키 설정을 할 수 있다.
외부키(Foreign Key, FK)란 테이블 B가 테이블 A와 조인하기 위해 사용하는 테이블 A의 PK가 테이블 B의 외부키가 된다.
select *
from tableA A
inner join tableB B
on A.pk = B.pk
where A.col1 = 'ABC';
LEFT JOIN이란 Join을 하기위한 기본키가 왼쪽 테이블에는 존재하지만, 오른쪽 테이블에는 존재하지 않을 때, 오른쪽 테이블에서 부족한 기본키를 제외한 모든 열에 전부 NULL(혹은 기본값)으로 채워넣고 Join하는 방식이다. 그 반대로 하게 되면 RIGHT JOIN이 된다.
select *
from tableA A
left join tableB B
on A.pk = B.pk
where A.col1 = 'ABC';