여러개의 SQL문을 합쳐서 하나의 SQL문으로 만들어주는 방법
유의사항 : 칼럼의 개수가 같아야함
Union : 겹치는건 또 안보여줌
Union all : 겹쳐도 또 보여줌
예제1) 성별이 여자인 데이터를 검색 / 소속사가. YG인 데이터를 UNION ALL로 실행
select from celeb
-> where sex = 'f'
-> union all
-> select from celeb
-> where agency = 'YG엔터';
예제2) 성별이 여자인 데이터를 검색 / 소속사가. YG인 데이터를 UNION로 실행
select from celeb
-> where sex = 'f'
-> union
-> select from celeb
-> where agency = 'YG엔터';
예제1은 "이수현"에 대한 결과 중복 , 예제2는 "이수현"에 대한 중복 X
예제3) 가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리
1980년대에 태어난 연예인의 이름, 생년월일, 나이를 검색하는 쿼리를 UNION
select name, job_title from celeb where job_title LIKE '%가수%' UNION select name, birthday from celeb where birthday BETWEEN 19800101 AND 19891231;
예제3 문제 내용 자체로만 보면, 오류가 발생할 수 밖에 없는 쿼리임
Why > UNION문법은 각각의 쿼리문의 Columns이 같은 수여야하는데 문제에서는
각각 2개, 3개이기 때문이다.
그래서 두번쨰 select절을 보면 name과 birthday만 요구했더니 아래와 같은 결과가 나왔다.
문제 1) 직업이 가수를 포함하는 데이터 검색쿼리와 직업이 탤러트를 포함하는 데이터 검색쿼리를 중복없이 조회
select from celeb where job_title LIKE '%가수%' UNION select from celeb where job_title LIKE '%탤런트%';
문제 2) 성이 이씨인 데이터 / 1970년대생 데이터 중복으로 검색
select from celeb
-> where name LIKE '이%'
-> UNION ALL
-> select from celeb
-> where birthday BETWEEN 19700101 AND 19791231;
두개 이상의 테이블을 결합하는 것
↓ Inner JOIN : 두개의 테이블에서 공통된 요소만 결합 유니온은 수직결합, 조인은 수평결합
select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> INNER JOIN snl_show
-> ON celeb.name = snl_show.host;
↓ LEFT JOIN : 두 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인 방식
select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> LEFT JOIN snl_show
-> ON celeb.name = snl_show.host;
FULL OUTTER JOIN은 Mysql에서 지원을 안하기 때문에 Right union LEFT하면됨 ㅎㅎ
↓ RIGHT JOIN : 두 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인 방식
select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> RIGHT JOIN snl_show
-> ON celeb.name = snl_show.host;
↓ SELF JOIN : 이너조인이랑 같은 결과를 가져옴
select celeb.id, celeb.name, snl_show.id, snl_show.host from celeb, snl_show where celeb.name = snl_show.host;
↓ 예제1) 셀럽의 연예인 중 snl에 출연했고 소속사가 안테나인 사람과 이름을 검색
select celeb.name, celeb.job_title from celeb, snl_show where celeb.name = snl_show.host AND agency = '안테나';
↓예제2) 셀럽의 연예인 중 snl에 출연했고 영화배우는 아니면서 YG소속이거나 40세 이상이면서 YG소속이 아닌 연예인의 이름과 나이, 직업, 소속사, 시즌, 에피소드를 검색
select celeb.name, celeb.age, celeb.job_title, celeb.agency, snl_show.season, snl_show.episode
from celeb, snl_show
where celeb.name = snl_show.host
AND ((job_title NOT LIKE '%영화배우%' AND agency = 'YG엔터') OR (age > 40 AND agency != 'YG엔터'));
↓ 예제3) snl에 출연한 연예인의 SNL ID, 시즌, 에피, 이름을 검색
select snl_show.id, snl_show.season, snl_show.episode, celeb.name, celeb.job_title
from celeb, snl_show
where celeb.name = snl_show.host; // 1번
또는
select snl_show.id, season, episode, name, job_title
from celeb, snl_show
where name =host //2번
ID라는 변수는 celeb과 snl_show에 둘다 있기 때문에 겹치는 것만 명확히 선언해주면 문제없음
하지만 가독성을 위해 어느 테이블에서 가져오는 변수인지 써있는 1번 쿼리문을 더 권장함!!!!
↓
↓ 예제4) snl에 출연한 celeb 중 에피소드 7,9,10에 출연했거나
소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람중 작년 9월 15일 이후에 출연했던 사람
select name, agency, broadcast_date, season, episode
from celeb, snl_show
where celeb.name = snl_show.host AND
(snl_show.broadcast_date > 20200915 AND
(snl_show.episode IN (7,8,9) OR
celeb.agency LIKE ('YG%')
)
);
↓ 문제1) SNL에 출연한 셀럽 연예인중 영화배우나 탤런트가 아닌 연예인의 아이디, 이름 , 직업, 시즌, 에피를 검색
select celeb.id, celeb.name, celeb.job_title, snl_show.season, snl_show.episode
from celeb, snl_show
where celeb.name = snl_show.host AND NOT(job_title LIKE '%영화배우%' OR job_title LIKE '%탤런트%');
↓ 문제2) snl에 출연한 셀럽 중 작년 9월15일 이후에 출연하였거나 소속사 이름이 엔터테이먼트로 끝나지 않으면서
영화배우나 개그맨이 아닌 연예인의 셀럽 ID, 이름, 직업 , 소속사를 검색
select celeb.id, name, job_title, agency from celeb, snl_show
where name = host AND ((broadcast_date > 20200915 OR agency NOT LIKE '%엔터')
AND NOT (job_title LIKE '%영화배우%' OR job_title LIKE '%개그맨%'));
점점 문장이 복잡해진다..
그래도 정신차리고 하면, 한번에 실행되니까 아직은,,,,,,다행이다 ~ !😋