mySQL의 union, join 문법
1. UNION 문법
- 여러개의 SQL 문을 합쳐서 하나의 SQL 문으로 만들어준다. 이때, 컬럼의 개수가 같아야한다.
- union all : 중복된 값을 포함하여 조회.
- union : 중복된 값은 제거하고 조회.
- test1 테이블과 test2 테이블을 만들고, 각각 1,2,3 데이터와 5,6,3이라는 데이터값을 넣었다.
- test1 테이블과 test2 테이블을 union all 하면, 중복된 데이터 값 일지라도 전부 조회하고,
union 을 하면, 중복된 값은 한번만 조회하고 두번 조회하지 않는다.
- sex 값이 f 인 데이터와 agenecy 값이 yg엔터 인 데이터를 출력하는데, union all 을 할경우와 union을 할 경우, 두번 중복되는 '이수현' 의 값이 한번만 조회된 것을 볼 수 있다.
- union 을 하는 두 가지 경우 다 * 로 모든 컬럼을 출력했다. 한 가지는 name만 출력 한 가지는 age 만 출력하듯이 두 경우에서 출력하는 컬럼이 다르다면 union 은 에러가 난다.
2. JOIN 문법
1) inner join :
교집합만 가져오는것. 두 개의 테이블에서 공통된 요소들을 통해 결합하는 방법.
- celeb 테이블과 snl 테이블에서, 교집합으로 겹치는 공통요소의 데이터만 가져왔다. celeb.name 과 snl.host의 값이 같은것을 공통요소로 보았고, celeb 테이블에서 id,name 값 그리고 snl 테이블의 id,host값을 출력했다.
2) left join :
왼쪽을 기준으로 겹치는 부분까지 가져오는것.
- inner join 과 마찬가지로 요소들을 설정했고, celeb을 기준으로 left join 했으므로 celeb 테이블은 그대로 출력되고,거기에 겹치는 값이 있는 snl 데이터만 옆에 붙어 나온다.
3) right join :
오른쪽을 기준으로 겹치는 부분까지 가져오는것.
- inner join 과 마찬가지로 요소들을 설정했고, celeb을 기준으로 right join 했으므로 snl 테이블은 그대로 출력되고, 거기에 겹치는 값이 있는 celeb 데이터만 옆에 붙어 나온다.
4) full outer join :
합집합을 가져오는것. (교집합 + 그외)
mysql 에서는 full outer join 을 지원하지 않아서,
left join 값과 right join 값을 union 해야한다.
- 위의 left join 값과 right join 값을 union 했으므로, 겹치는 값만 삭제되고 하나로 출력된다.
5) self join :
join 문법을 사용할 때 가장 기본적으로 많이 쓰는 방식으로, 두 개의 테이블에서 겹치는 내용을 가져올때 원하는 조건만으로 쉽게 가져올수있다.
- 두개의 테이블의 모든 컬럼명이 다르다면, select 컬럼명 으로 써도 되지만, 중복되는 컬럼명이 있을경우 테이블.컬럼명 으로 써야한다.
- where 뒤에는 원하는 조건을 작성하면 된다. celeb 테이블의 name과 snl테이블의 host 가 같은 경우를 조건으로 두었다.
- celeb 테이블의 사람들중, snl의 host에도 있고 job이 배우는 아니면서 yg 소속이거나, 40세 이상이면서 yg 소속이 아닌 사람의 이름,나이,직업,소속사,시즌,에피소드 정보를 검색한다. 마지막 where 조건문에서, and 가 or 보다 먼저 실행되기 때문에 항상 이 순서에 유의하여 () 괄호를 쳐야한다.
- snl 출연한 celeb 사람들중, 에피소드 7,9,10 에 출연했거나 소속사가 yg로 시작하는 사람중에서 20200915이후에 출연한 사람 검색. 에피소드 7,9,10중 출연한것이므로 in 문법 사용한다. 에피소드 출연 OR 소속사 yg 중에서 9-15이후 출연자이므로, (or) 후에 and 순으로 해야한다.