제로베이스(ZB) 데이터 분석 스쿨 : SQL ; JOIN, Concat, Alias, Distinct, Limit

김현우 (Daniel KIM)·2024년 2월 8일

데이터 분석 학습

목록 보기
5/10

Part 1-9 Join

  • Join 실습 위해서 celeb 테이블을 생성해보자.

create table celeb(
-> ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> NAME VARCHAR(32) NOT NULL DEFAULT '',
-> BIRTHDAY DATE,
-> AGE INT,
-> SEX CHAR(1),
-> JOB_TITLE VARCHAR(32),
-> AGENCY VARCHAR(32)
-> );

desc celeb;
확인까지.

  • celeb 테이블 data 추가.
    insert into celeb values (1, '아이유', '1993-05-16', 29, 'F', '가수, 텔런트', 'EDAM엔터테이먼트');
    insert into celeb values (2, '이미주', '1994-09-23', 28, 'F', '가수', '울림엔터테이먼트');
    insert into celeb values (3, '송강', '1994-04-23', 28, 'M', '텔런트', '나무엑터스');
    insert into celeb values (4, '강동원', '1981-01-18', 41, 'M', '영화배우, 텔런트', 'YG엔터테이먼트');
    insert into celeb values (5, '유재석', '1972-08-14', 50, 'M', 'MC, 개그맨', '안테나');
    insert into celeb values (6, '차승원', '1970-06-07', 48, 'M', '영화배우, 모델', 'YG엔터테이먼트');
    insert into celeb values (7, '이수현', '1999-05-04', 23, 'F', '가수', 'YG엔터테이먼트');

  • snl_show 테이블 만들기
    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;

  • celeb 테이블 data 추가.
    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;
select
from celeb;

1. INNER JOIN
select celeb.id, celeb.name, snl_show.host
-> from celeb
-> INNER JOIN snl_show
-> ON celeb.name = snl_show.host;

2. 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 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 celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> FULL OUTER JOIN snl_show
-> on celeb.name = snl_show.host;
* 그러나, 이건 mySQL에서는 지원하지 않는다.

그래서 이렇게 편법?!으로 합친다.

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
Q. celeb 테이블의 연예인 중, snl_show에 host로 출연했고 소속사가 안테나인 사람의 이름과 직업을 검색

select celeb.id, celeb.name, celeb.job_title
-> from celeb, snl_show
-> where celeb.name = snl_show.host AND agency = '안테나';

나는 이렇게 복잡하게 했는데
더 쉽게는

select name, job_title FROM celeb WHERE agency = '안테나';
=> 한줄로 되네...

Part 1-10 Concat, Alias, Distinct, Limit

show tables;
select from celeb;
select
from snl_show;

  • Concat : 여러 문자열을 하나로 합치거나 연결하는 기능
    select concat('concat', ' ', 'test');

select concat('이름:', name) from celeb;
파이썬에서 문자열 포맷팅하는 기능과 비슷한 형태다.

  • Alias : 칼럼이나 테이블에 이름 별칭 생성하는 기능
    판다스에스 모듈 가져오는 기능과 같다.

Alias는 컬럼에 주는 방법과 테이블에 주는 방법 2가지가 있다.
① Alias 문법 - Conlumn
Select column as alias
From tablename

② Alias 문법 - Table
Select *
From tablename as alias

select name as '이름'
from celeb;

select name as '이름', agency as '소속사'
-> from celeb;

select concat(name, ' : ', job_title) as profile from celeb;

실습
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;

  • Distinct : 검색한 결과의 중복을 제거하여 보여줌
    판다스에서 사용하는 Unique와 비슷

Select Distinct column1..., column2...
From tablename;

  • Limit : 검색결과를 정렬된 순으로 주어진 숫자만큼만 조회하는 함수

Select column1, column2
From tablename
Where condition
LIMIT number;

실습
select c.name, age,
from celeb as c, snl_show as s
where c.name = s.host;

select concat('SNL 시즌', s.season, '에피소드', s.episode, '호스트', ' ', name) AS 'SNL 방송정보', age
from celeb as c, snl_show as s
where c.name = s.host order by c.age DESC, s.broadcast_date DESC LIMIT 2;

감을 잡았다!

0개의 댓글