5. Union
USE zerobase;
SELECT * FROM zerobase;
CREATE TABLE test1
(
no int
);
CREATE TABLE test2
(
no int
);
INSERT INTO test1 VALUES (1);
INSERT INTO test1 VALUES (2);
INSERT INTO test1 VALUES (3);
INSERT INTO test2 VALUES (5);
INSERT INTO test2 VALUES (6);
INSERT INTO test2 VALUES (3);
SELECT * FROM test1;
SELECT * FROM test2;
- UNION : 여러 개의 SQL문을 합쳐서 하나의 SQL 문으로 만들어주는 방법
(주의. 칼럼의 개수가 같아야함.)
- UNION : 중복된 값을 제거하여 알려준다.
- UNION ALL : 중복된 값도 모두 보여준다.
SELECT * FROM test1
UNION ALL
SELECT * FROM test2;
SELECT * FROM test1
UNION
SELECT * FROM test2;
SELECT name, sex, agency FROM celeb WHERE sex = 'F'
UNION ALL
SELECT name, sex, agency FROM celeb WHERE agency = 'YG엔터테이먼트';
SELECT name, job_title FROM celeb
WHERE job_title LIKE '%가수%'
UNION
SELECT name, birthday, 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 '%텔렌트%';
SELECT * FROM celeb
WHERE name LIKE '이%'
UNION ALL
SELECT * FROM celeb
WHERE BETWEEN birthday '1970-01-01' AND '1979-12-31';
5. Union
USE zerobase;
CREATE TABLE snl_show
(
ID int NOT NULL AUTO_INCREMENT PRIMARY KEY,
SEASON int NOT NULL,
EPISODE int NOT NULL,
BROADCAST_DATE date,
HOST varchar(32) NOT NULL
);
DESC snl_show;
INSERT INTO snl_show VALUES (1, 8, 7, '2020-09-05', '강동원');
INSERT INTO snl_show VALUES (2, 8, 8, '2020-09-12', '유재석');
INSERT INTO snl_show VALUES (3, 8, 9, '2020-09-19', '차승원');
INSERT INTO snl_show VALUES (4, 8, 10, '2020-09-26', '이수현');
INSERT INTO Snl_show VALUES (5, 9, 1, '2021-09-04', '이병헌');
INSERT INTO Snl_show VALUES (6, 9, 2, '2021-09-11', '하지원');
INSERT INTO snl_show VALUES (7, 9, 3, '2021-09-18', '제시');
INSERT INTO snl_show VALUES (8, 9, 4, '2021-09-25', '조정석');
INSERT INTO snl_show VALUES (9, 9, 5, '2021-10-02', '조여정');
INSERT INTO snl_show VALUES (10, 9, 6, '2021-10-09', '옥주현');
SELECT * FROM snl_show;
- JOIN : 두 개 이상의 테이블을 결합하는 것

- 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 : 두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식 (없는 값은 NULL로 표시)
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
LEFT JOIN snl_show
ON celeb.name = snl_show.host;
- RIGHT JOIN : 두 개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인방식 (없는 값은 NULL로 표시)
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
RIGHT JOIN snl_show
ON celeb.name = snl_show.host;
- FULL OUTER JOIN : 두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식 (MySQL에서 지원하지 않음. 다른 DBMS에서 사용가능)
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
FULL OUTER JOIN snl_show
ON celeb.name = snl_show.host;
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;
- SELF JOIN 문법 : INNER JOIN과 같은 기능
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;
SELECT name, job_title FROM celeb WHERE agency='안테나';
SELECT celeb.name, snl_host.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;
SELECT celeb.name, celeb.job_title
FROM celeb, snl_show
WHERE celeb.name = snl_show.host AND celeb.agency = '안테나';
SELECT * FROM celeb
WHERE NOT job_title LIKE '%영화배우%';
SELECT * FROM celeb
WHERE NOT job_title LIKE '%영화배우%' AND agency = 'YG엔터테이먼트';
SELECT * FROM celeb
WHERE age >= 40;
SELECT * FROM celeb
WHERE age >= 40 AND agency != 'YG엔터테이먼트';
SELECT celeb.id, celeb.name, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;
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 = 'YG엔터테이먼트')
OR (age >= 40 AND agency != 'YG엔터테이먼트'));
SELECT snl_show.id, season, episode, name , job_title
FROM celeb, snl_show
WHERE name = host;
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host;
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND episode IN (7, 9, 10);
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND agency LIKE 'YG______';
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND broadcast_date > '2020-09-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';
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 '%텔런트%');
SELECT celeb.id, celeb.name, celeb.job_title, celeb.agency
FROM celeb, snl_show
WHERE celeb.name = snl_show.host
AND (snl_show.broadcast_date > '2020-09-15' OR NOT celeb.agency LIKE '%엔터테이먼트')
AND NOT (celeb.job_title LIKE '%영화배우%' OR celeb.job_title LIKE '%개그맨%');
6. CONCAT, ALIAS, DISTINCT, LIMIT
USE zerobase;
SELECT * FROM celeb;
SELECT * FROM snl_show;
- CONCAT 문법 : 여러 문자열을 하나로 합치거나 연결
SELECT CONCAT('concat', ' ', 'test');
SELECT CONCAT('이름:' , name) FROM celeb;
- ALIAS 문법 : 칼럼이나 테이블 이름에 별칭 생성
- AS 생략 가능
SELECT name AS '이름' FROM celeb;
SELECT name AS '이름', agency AS '소속사' FROM celeb;
SELECT CONCAT(name, ' : ', job_title) AS profile FROM celeb;
SELECT s.season, s.episode, c.name, c.job_title
FROM celeb AS c, snl_show AS s
WHERE c.name = s.host;
SELECT CONCAT(s.season, '-', s.episode, '(', s.broadcast_date, ')') AS '방송정보',
CONCAT(c.name, '(', c.job_title, ')') AS '출연자정보'
FROM celeb AS c, snl_show AS s
WHERE c.name = s.host;
SELECT CONCAT('이름 :', c.name, ', ', '소속사 :', c.agency) AS '연예인 정보'
FROM celeb AS c
WHERE c.name LIKE '___';
SELECT c.agency AS '소속사 정보',
CONCAT('나이 :', c.age, '(', c.sex, ')') AS '신상정보',
CONCAT(s.season, '-', s.episode, ', 방송날짜 :', s.broadcast_date) AS '출연정보'
FROM celeb AS c, snl_show AS s
WHERE c.agency LIKE '__엔터테이먼트' AND c.name = s.host
ORDER BY s.broadcast_date DESC;
- DISTINCT 문법 : 검색한 결과의 중복 제거
SELECT agency FROM celeb;
SELECT DISTINCT agency FROM celeb;
SELECT sex, job_title FROM celeb WHERE job_title LIKE '%가수%';
SELECT DISTINCT sex, job_title FROM celeb WHERE job_title LIKE '%가수%';
SELECT DISTINCT sex, agency FROM celeb ORDER BY sex, agency;
- LIMIT 문법 : 검색결과를 정렬된 순으로 주어진 숫자만큼만 조회
SELECT * FROM celeb LIMIT 3;
SELECT * FROM celeb ORDER BY age LIMIT 4;
SELECT * FROM celeb
WHERE sex='M'
ORDER BY age DESC
LIMIT 2;
SELECT CONCAT('SNL 시즌 ', s.season, ' 에피소드 ', s.episode, ' 호스트 ', c.name) AS 'SNL 방송정보',
c.age
FROM celeb AS c, snl_show AS s
WHERE c.name = s.host
ORDER BY c.age DESC
LIMIT 2;