[SQL] UNION, CONCAT, ALIAS, DISTINCT, LIMIT

박미영·2023년 4월 19일
0
post-thumbnail

📌UNION

여러 개의 SQL문을 합쳐서 하나의 SQL 문으로 만들어주는 방법 (주의. 칼럼의 개수가 같아야함)

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


SELECT column1, column2, ... FROM table1
UNION | UNION ALL
SELECT column1, column2, ... FROM table2




📌JOIN

두 개 이상의 테이블을 결합하는 것


💡UNION VS JOIN 차이점

UNION: 수직 결합
JOIN: 수평 결합



- INNER JOIN

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

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



- LEFT JOIN

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

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



- RIGHT JOIN

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

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



- FULL OUTER JOIN

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

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

⚠️ MYSQL에서는 FULL OUTER JOIN을 지원하지 않고 있기 때문에 ERROR 발생한다.

  • 해결 방법
SELECT column1, column2, ... 
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
(WHERE condition)
UNION
SELECT column1, column2, ... 
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
(WHERE condition);



- SELF JOIN

SELECT column1, column2, ... 
FROM tableA, tableB, ...
WHERE condition;




📌CONCAT

여러 문자열을 하나로 합치거나 연결

SELECT CONCAT('string1', 'string2', ...);




📌ALIAS

칼럼이나 테이블 이름에 별칭 생성

  • Column
SELECT column as alias
FROM tablename;

  • Table
SELECT column1, column2, ...
FROM tablename as alias;




📌DISTINCT

검색한 결과의 중복 제거

SELECT DISTINCT column1, column2, ...
FROM tablename;




📌LIMIT

검색결과를 정렬된 순으로 주어진 숫자만큼만 조회

SELECT column1, column2, ...
FROM tablename
WHERE condition
LIMIT number;






📌예제

📍실습 환경 만들기

  • zerobase 데이터베이스 사용(이전에 만든 데이터베이스)
USE zerobase;

  • test table 생성
create table test1
(
	no int
);
create table test2(
	no int
);


  • test1 table 데이터 추가
INSERT INTO test1 VALUES (1);
INSERT INTO test1 VALUES (2);
INSERT INTO test1 VALUES (3);


  • test2 table 데이터 추가
INSERT INTO test2 VALUES (5);
INSERT INTO test2 VALUES (6);
INSERT INTO test2 VALUES (3);



  • 새로운 테이블 추가
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
);

  • 데이터 추가
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', '옥주현');





📍UNION 예제

- UNION | UNION ALL

  • test1 의 모든 데이터와 test2 의 모든 데이터를 중복된 값을 포함하여 검색
  • 직업이 가수인 (가수를 포함하는) 데이터를 검색하는 쿼리와 직업이 텔런트인 (텔런트를 포함하는) 데이터를 검색하는 쿼리를 중복을 제거하여 합쳐서 실행하세요.
select * from celeb where job_title like '%가수%'
union
select * from celeb where job_title like '%연기자%';



  • 성이 이씨인 데이터를 검색하는 쿼리와 1970년대생을 검색하는 쿼리를 중복을 포함하여 합쳐서 실행하세요.
select * from celeb where name like '이%'
union
select * from celeb where birthday between '1970-01-01' and '1979-12-31';




📍JOIN 예제

- INNER JOIN

snl_show 에 호스트로 출연한 celeb 을 기준으로 celeb 테이블과 snl_show 테이블을 INNER JOIN

celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
INNER JOIN snl_show
ON celeb.name = snl_show.host;



- LEFT JOIN

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;

-> celeb id 1, 2, 3 인 사람은 celeb이지만 snl에 출연한 적이 없다. 라고 해석 가능함.



- RIGHT JOIN

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;

-> snl에 출연했지만 celeb은 아닌 사람은 앞 두 컬럼이 NULL 값으로 채워진다.



- FULL OUTER JOIN

snl_show 에 호스트로 출연한 celeb 을 기준으로 celeb 테이블과 snl_show 테이블을 FULL OUTER JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
FULL OUTER JOIN snl_show
ON celeb.name = snl_show.host;

⚠️ MYSQL에서는 FULL OUTER JOIN을 지원하지 않고 있기 때문에 ERROR 발생한다.



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

snl_show 에 호스트로 출연한 celeb 을 기준으로 celeb 테이블과 snl_show 테이블을 SELF JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;



celeb 테이블의 연예인 중, snl_show 에 host 로 출연했고 소속사가 안테나인 사람의 이름과 직업을 검색

select celeb.name, celeb.job_title
from celeb, snl_show
where celeb.name = snl_show.host and celeb.agency='안테나';



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='YG엔터테이먼트') OR (age >= 40 and agency!='YG엔터테이먼트'));



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

SELECT host, episode, agency, broadcast_date
from snl_show, celeb
where name = host AND
(episode in (7, 9, 10) OR agency like 'YG______') AND
broadcast_date > '2020-09-15';

연산하는 순서를 잘 못 묶어주면 다음과 같이 출력된다.



snl_show 에 출연한 celeb 중, 작년 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 '%개그맨%'));




📍CONCAT 예제

파이썬 문자열 포맷팅과 비슷하다.

select concat('이름:', name) from celeb;




📍ALIAS 예제

  • name 은 이름으로, agency 는 소속사로 별칭을 만들어서 검색
SELECT name as '이름', agency as '소속사' from celeb;


  • name 과 job_title 을 합쳐서 profile 이라는 별칭을 만들어서 검색
select concat(name, ' : ', job_title) as profile from celeb;


  • snl_korea 에 출연한 celeb 을 기준으로 두 테이블을 조인하여, celeb 테이블은 c, snl_show 테이블은 s 라는 별칭을 만들어서 출연한 시즌과 에피소드, 이름, 직업을 검색
select s.season, s.episode, c.name, c.job_title
from celeb as c, snl_show as s
where c.name = s.host;


  • snl_korea 에 출연한 celeb 을 기준으로 두 테이블을 조인하여 다음과 같이 각 데이터의 별칭을 사용하여 검색

    시즌, 에피소드, 방송일을 합쳐서 ‘방송정보’
    이름, 직업을 합쳐서 ‘출연자정보'

💡 as 생략가능 하다.

select concat(s.season, '-', s.episode, '(', s.broadcast_date, ')') '방송정보',
concat(c.name, '(', c.job_title, ')') as '출연자정보'
from celeb c, snl_show s
where c.name = s.host;


  • 이름이 3글자인 연예인 정보를 검색하여 다음과 같이 출력하세요.
select concat('이름 :', name, ', ', '소속사 :', agency) '연예인 정보'
from celeb
where name like '___';




📍LIMIT 예제

  • 나이가 가장 적은 연예인 4명을 검색
select * from celeb order by age limit 4


  • SNL에 출연한 연예인의 정보를 최신 방송날짜 순으로 2개만 검색하여 다음과 같이 출력하세요.
select concat('SNL 시즌', season, ' 에피소드', episode, ' 호스트 ', host) as 'SNL 방송정보', age
from snl_show, celeb
where name = host
order by broadcast_date
limit 2;




"이 글은 제로베이스 데이터 취업 스쿨 강의를 듣고 작성한 내용으로 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."

0개의 댓글