SQL 기초_5

YJ·2023년 4월 17일
0

▷ 오늘 학습 계획: SQL 강의(기초10~11)

📖 08_Union

여러 개의 SQL문을 합쳐서 하나의 SQL문으로 만들어주는 방법(수직 결합)

(컬럼 개수가 같아야 한다)

UNION: 중복 값을 제거하여 알려준다.
UNION ALL: 중복된 값도 모두 보여준다.

가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리와 1980년대에 태어난 연예인의 이름, 나이를 검색하는 쿼리를 UNION으로 실행하기

SELECT name, job_title from celeb WHERE job_title LIKE '%가수%'
UNION
SELECT name, age from celeb WHERE birthday 
BETWEEN '1980-01-01' AND '1989-12-31';

직업이 '가수'를 포함하는 데이터를 검색하는 쿼리와 직업이 '탤런트'를 포함하는 데이터를 검색하는 쿼리를 중복을 제거하여 합쳐서 실행하기

SELECT * FROM celeb WHERE job_title LIKE '%가수%'
UNION
SELECT * FROM celeb WHERE job_title LIKE '%탤런트%';

성이 이씨인 데이터를 검색하는 쿼리와 1970년대생을 검색하는 쿼리를 중복을 포함하여 합쳐서 실행하기

SELECT name, birthday FROM celeb WHERE name LIKE '이%'
UNION ALL
SELECT name, birthday FROM celeb 
WHERE birthday BETWEEN '1970-01-01' AND '1979-12-31';

📖 09_Join

두 개 이상의 테이블을 결합하는 것(수평 결합)

1) inner join

두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식(교집합)

SELECT column1, column2
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

snl_show 에 호스트로 출연한 celeb 을 기준으로
celeb 테이블과 snl_show 테이블을 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;

2) left join

두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식

SELECT column1, column2
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

snl_show 에 호스트로 출연한 celeb 을 기준으로
celeb 테이블과 snl_show 테이블을 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;

3) right join

두개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인방식

SELECT column1, column2
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

snl_show 에 호스트로 출연한 celeb 을 기준으로
celeb 테이블과 snl_show 테이블을 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;

4) full outer join

두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식(합집합)

SELECT column1, column2
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

mySQL에서는 FULL JOIN을 지원하지 않고 있다.

SELECT column1, column2
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
UNION
SELECT column1, column2
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
LEFT JOIN snl_show
ON celeb.name = snl_show.host
UNION
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
RIGHT JOIN snl_show
ON celeb.name = snl_show.host

5) self join

SELECT column1, column2
FROM tableA, tableB
WHERE condition;

celeb 테이블의 연예인 중 snl_show 에 host 로 출연했고,
영화배우는 아니면서 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 ((NOT job title LIKE '%영화배우%' AND agency = '엔터테이먼트') OR (age>=40 AND agency != 'YG엔터테이먼트'));

snl_show 에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중
2020년 9월 15일 이후에 출연했던 사람을 검색

SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name=host
AND (episode in (7,9,10) or agency like 'YG______')
AND broadcast_date>'2020-09-15';

snl_show 에 출연한 celeb 테이블의 연예인 중, 영화배우나 텔런트가 아닌 연예인의 아이디, 이름, 직업, 시즌, 에피소드 정보를 검색

SELECT celeb.id, name, job_title, season, episode
FROM celeb, snl_show
WHERE name=host
AND NOT(job_title LIKE '%영화배우%' OR job_title LIKE'%탤런트%');

snl_show 에 출연한 celeb 중, 2020년 9월 15일 이후에 출연했거나
소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색

 SELECT celeb.id, name, job_title, agency 
 FROM snl_show,celeb 
 WHERE name=host 
 AND (broadcast_date>'2020-09-15' OR NOT agency LIKE '%엔터테이먼트')
 AND NOT (job_title LIKE '%영화배우%' OR job_title LIke '%개그맨%');

▷ 내일 학습 계획: SQL 강의(기초12~14)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글