[제로베이스 데이터 취업 스쿨] 9기 9주차 – SQL 기초

Inhee Kim·2022년 12월 30일
0
post-thumbnail

1. Database 관리

- Database 목록 확인

show databases;

- Database 생성 및 확인

create database testdb;
show databases;

- 해당 Database로 이동

use testdb;

- Database 삭제 및 확인

drop database testdb;
show databases;

2. User 관리

- User 조회

use mysql;
select host, user from user;

- User 생성 및 확인 - localhost
현재 PC에서만 접속 가능한 사용자(noma)비밀번호(1234)와 함께 생성

create user 'noma'@'localhost' identified by '1234';
select host, user from user;

- User 생성 및 확인 - %
외부에서 접속 가능한 사용자(noma)비밀번호(1234)와 함께 생성

create user 'noma'@'%' identified by '1234';
select host, user from user;

- User 삭제 및 확인

drop user 'noma'@'localhost';
drop user 'noma'@'%';

select host, user from user;

3. User 권한 관리

- 실습환경 만들기1 - Database 생성
권한 관리 실습을 위한 Database(testdb) 생성

create database testdb;
show databases;

- 실습환경 만들기2 - User 생성
권한 관리 실습을 위한 사용자 (id: noma@localhost, pw: 1234) 생성

create user 'noma'@'localhost' identified by '1234';
select host, user from user;

- User 권한 확인
특정 사용자(noma)에게 부여된 모든 권한 목록 확인

show grants for 'noma'@'localhost';

- User 권한 부여
특정 사용자(noma)에게 특정 데이터베이스(testdb)의 모든 권한을 부여

grant all on testdb.* to 'noma'@'localhost';
show grants for 'noma'@'localhost';

- User 권한 제거
특정 사용자(noma)에게 특정 데이터베이스(testdb)의 모든 권한을 삭제

revoke all on testdb.* from 'noma'@'localhost';
show grants for 'noma'@'localhost';

- User 삭제

drop user 'noma'@'localhost';
select host, user from user;

4. Table 생성

- 실습할 데이터베이스 생성
앞으로 진행되는 강의에서는 zerobase라는 이름의 데이터베이스를 사용할 예정

# utf8mb4: 다국어 + 이모지 지원
create database zerobase default character set utf8mb4;
show databases;

use zerobase

- Table 생성 문법

create table mytable
(
	id int,
	name varchar(16)
);

id(int)와 name(varchar(16)) 컬럼을 갖는 mytable이라는 이름의 테이블 생성

create table mytable(id int, name varchar(16));

- Table 목록 확인

show tables;

- Table 정보 확인
mytable 테이블 정보 확인

# desc: description
desc mytable;

- Table 이름 변경
mytable 이름을 person으로 변경

alter table mytable rename person;
show tables;

- Table Colums 추가
person 테이블에 agee(double) 컬럼 추가

alter table person add column agee double;
desc person;

- Table Colums 변경 - Datatype
person 테이블의 agee 컬럼 데이터 타입을 int로 변경

alter table person modify column agee int;
desc person;

- Table Colums 변경 - Name
person 테이블의 agee 컬럼 이름을 age로 변경

alter table person change column agee age int;
desc person;

- Table Colums 삭제
person 테이블의 age 컬럼 삭제

alter table person drop column age;
desc person;

- Table 삭제
person 테이블 삭제

drop table person;
show tables;

5. Select, Insert, Update, Delete

- 실습할 데이터베이스로 이동

use zerobase;

- 실습할 테이블 만들기
person 테이블 생성

create table person
(
	id int,
    name varchar(16),
    age int,
    sex char
);

desc person;

- Insert - 데이터 추가

  • 입력한 컬럼 이름의 순서와 값의 순서가 일치하도록 주의
  • ID 값이 1인 이효리, 43세, 여자(F) 데이터 추가
insert into person (id, name, age, sex)
values (1, '이효리', 43, 'F');

select * from person;

- Insert - 모든 컬럼 값 추가

  • 모든 컬럼 값을 추가하는 경우에는 컬럼 이름을 지정하지 않아도 되지만, 입력하는 값의 순서가 테이블의 컬럼 순서와 일치하오록 주의
  • ID 값이 2인 이상순, 48세, 남자(M) 데이터 추가
insert into person
values (2, '이상순', 48, 'M');

select * from person;

- Select - 특정 컬럼 조회

  • 테이블 내의 특정 컬럼에 대한 데이터 조회
  • person 테이블 내의 이름, 나이, 성별 데이터 조회
select name, age, sex from person;

- Select - 모든 컬럼 조회

  • 테이블 내의 모든 컬럼에 대한 데이터 조회
  • person 테이블 내의 모든 컬럼 조회
select *
from person;

- Where - 조건 추가

  • 테이블 내에서 조건을 만족하는 데이터 조회
  • person 테이블에서 성별이 여자인 데이터 조회
select *
from person
where sex = 'F';

- Update - 데이터 수정

  • 이효리의 나이를 23세로 수정
update person
set age = 23
where name = '이효리';

select *
from person
where name = '이효리';

- Delete - 데이터 삭제

  • 이상순 데이터 삭제
delete from person
where name = '이상순';

select *
from person;

6. Order by

- 실습 테이블 정보

  • 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;

- 실습할 데이터 추가

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

select * from celeb;

- Order by

  • SELECT 문에서 데이터를 특정 컬럼을 기준으로 오름차순 혹은 내림차순 정렬하여 조회
    - ASC(Ascending): 오름차순으로 정렬
    - DESC(Descending): 내림차순으로 정렬
  • (1) celeb 테이블에서 이름과 나이를 나이순으로(오름차순) 조회
select age, name
from celeb
order by age asc;

  • (2) celeb 테이블에서 이름과 나이를 나이 역순으로(내림차순) 조회
select age, name
from celeb
order by age desc;

  • (3) celeb 테이블에서 이름과 나이를 나이와 이름순으로 정렬하여 조회
    (ASC를 생략해도 default는 오름차순 정렬)
select age, name
from celeb
order by age, name;

  • (4) celeb 테이블에서 이름과 나이를 나이의 역순으로 정렬한 뒤, 이름순으로 정렬하여 조회
select age, name
from celeb
order by age desc, name asc;

7. Comparison Operators (비교 연산자)

- (1) A = B

  • 나이가 29세인 데이터 검색
select *
from celeb
where age=29
order by name;

- (2) A != B

  • 나이가 29세가 아닌 데이터 검색
select *
from celeb
where age != 29
order by age;

- (3) A > B

  • 나이가 29세 보다 큰 데이터 검색
select *
from celeb
where age > 29
order by age;

- (4) A < B

  • 나이가 29세 보다 작은 데이터 검색
select *
from celeb
where age < 29

- (5) A >= B

  • 나이가 29세 보다 크거나 같은 데이터 검색
select *
from celeb
where age >= 29
order by age;

- (6) A <= B

  • 나이가 29세 보다 작거나 같은 데이터 검색
select *
from celeb
where age <= 29
order by age;

- (6) A <> B

  • 나이가 29세 크거나 작은 (같지 않은) 데이터 검색 ('!='과 같은 표현)
select *
from celeb
where age <> 29
order by age;

8. Logical Operations (논리 연산자)

- (1) AND

  • 조건을 모두 만족하는 경우 TRUE

ⅰ) 나이가 29세이고 성별이 여성인 데이터 검색

select *
from celeb
where age=29 and sex='F';

ⅱ) 성별이 남자이고 나이가 40세 보다 큰 데이터를 이름의 역순으로 정렬하여 검색

select *
from celeb
where sex='M' and age>40
order by name desc;

- (2) OR

  • 하나의 조건이라도 만족하는 경우 TRUE

ⅰ) 나이가 25세보다 작거나 30세보다 큰 데이터 검색

select *
from celeb
where age<25 or age>30;

ⅱ) 나이가 30세 보다 작고 여자이거나, 나이가 30세 보다 크고 남자인 데이터를 나이와 성별 순으로 정렬하여 검색

select *
from celeb
where (age<30 and sex='F') or (age>30 and sex='M')
order by age, sex;

ⅲ) YG엔터테인먼트 소속이거나 나무엑터스 소속인 연예인 중, 나이가 30세 보다 작은 데이터를 검색

select *
from celeb
where (agency='YG엔터테인먼트' or agency='나무엑터스') and age<30;

ⅳ) ID가 홀수이면서 성별이 남자거나, ID가 짝수이면서 소속사가 YG엔터테인먼트인 데이터를 나이순으로 정렬하여 검색

select *
from celeb
where ((id%2) = 1 and sex='M') or ((id%2) = 0 and agency='YG엔터테인먼트')
order by age;

- (3) NOT

  • 조건을 만족하지 경우 TRUE

ⅰ) 성별이 여자가 아닌 데이터 검색

select *
from celeb
where not sex='F';

ⅱ) 소속사가 YG엔터테인먼트이면서 남자가 아니거나 직업이 가수이면서 소속사가 YG엔터테인먼트가 아닌 데이터 검색

select *
from celeb
where (agency='YG엔터테인먼트' and not sex='M')
	or (job_title='가수' and not agency='YG엔터테인먼트');

ⅲ) 생일이 1990년 이후이면서 여자가 아니거나, 생일이 1979년 이전이면서 소속사가 안테나가 아닌 데이터 검색

select *
from celeb
where (birthday>=19900101 and not sex='F')
	or (birthday<=19791231 and not agency='안테나');

- (4) BETWEEN

  • 조건값이 범위 사이에 있으면 TRUE

ⅰ) 나이가 20세에서 40세 사이의 데이터 검색

select *
from celeb
where age between 20 and 40;

ⅱ) 생년월일이 1980년에서 1995년 사이가 아니면서 여자이거나,
소속사가 YG엔터테인먼트이면서 나이가 20세에서 45세가 아닌 데이터 검색

select *
from celeb
where ((not birthday between 19800101 and 19951231) and sex='F')
	or (agency='YG엔터테인먼트' and (not age between 20 and 45));

ⅲ) 나이가 30세에서 60세 사이이고 성별이 남자인 데이터를 나이순으로 정렬하여 검색

select *
from celeb
where age between 30 and 60 and sex='M'
order by age;

ⅳ) 아이디가 1 에서 5사이의 값이면서 성별이 여자이거나,
아이디가 홀수이면서 성별이 남자이면서 나이가 20세에서 30세 사이인 데이터 검색

select *
from celeb
where ((id between 1 and 5) and sex='F')
	or ((id%2)=1 and sex='M' and age between 20 and 30);

- (5) IN

  • 목록 안에 조건이 존재하는 경우 TRUE

ⅰ) 나이가 29세, 49세 중 하나인 데이터 검색

select *
from celeb
where age in (29, 49);

ⅱ) 소속사가 나무엑터스, 안테나가 아니면서, 성별이 여자거나 나이가 45세 이상인 데이터 검색

select *
from celeb
where agency not in ('나무엑터스', '안테나') and sex='F' or age>=45;

ⅲ) 아이유, 이미주, 유재석, 송강 중에 소속사가 ‘나무엑터스’인 데이터 검색

select *
from celeb
where name in ('아이유', '이미주', '유재석', '송강') and agency='나무엑터스';

ⅳ) 소속사가 안테나, YG엔터테인먼트 중 하나가 아니고, 성별이 여자인 데이터 검색

select *
from celeb
where agency not in ('안테나', 'YG엔터테인먼트') and sex='F';

ⅴ) 아이유, 송강, 강동원, 차승원 중에 YG엔터테인먼트 소속이 아니거나 나이가 41세에서 51세 사이인 사람 검색

select *
from celeb
where name in ('아이유', '송강', '강동원', '차승원')
	and (not agency='YG엔터테인먼트' or age between 41 and 51);

- (6) LIKE

  • 조건값이 패턴에 맞으면 TRUE

ⅰ) 소속사 이름이 ‘YG엔터테인먼트’ 인 데이터를 검색

select *
from celeb
where agency like 'YG엔터테인먼트';

ⅱ) ‘YG’로 시작하는 소속사 이름을 가진 데이터를 검색

select *
from celeb
where agency like 'YG%';

ⅲ) ‘엔터테인먼트’로 끝나는 소속사 이름을 가진 데이터를 검색

select *
from celeb
where agency like '%엔터테인먼트';

ⅳ) 직업명에 ‘가수’가 포함된 데이터를 검색

select *
from celeb
where job_title like '%가수%';

ⅴ) 소속사 이름의 두번째 글자가 'G'인 데이터를 검색

select *
from celeb
where agency like '_G%';

ⅵ) 직업명이 ‘가' 로 시작하고 최소 2글자 이상인 데이터 검색

select *
from celeb
where job_title like '가_%';

ⅶ) 직업명이 '가' 로 시작하고 최소 5글자 이상인 데이터 검색

select *
from celeb
where job_title like '가____%';

ⅷ) 직업명이 ‘영'으로 시작하고 '모델’로 끝나는 데이터 검색

select *
from celeb
where job_title like '영%모델';

ⅸ) MC와 개그맨을 병행하는 연예인 검색

select *
from celeb
where job_title like '%MC%' and job_title like '%개그맨%';

ⅹ) 직업이 하나 초과인 연예인 중 영화배우 혹은 텔런트가 아닌 연예인 검색

select *
from celeb
where job_title like '%,%'
	and not (job_title like '%영화배우%' or job_title like '%탤런트%');

xi) 아이유, 이미주, 송강, 이수현 중에, 가수만 직업으로 가졌거나 가수를 병행하지 않고 텔런트를 하는 사람

select *
from celeb
where name in ('아이유', '이미주', '송강', '이수현')
	and (job_title like '가수'
    or (job_title not like '%가수%' and job_title like '%탤런트'));

9. Union

- 테스트용 테이블 생성

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: 중복된 값을 포함하여 보여줌

ⅰ) test1 의 모든 데이터와 test2 의 모든 데이터를 중복된 값을 포함하여 검색

select *
from test1
union all
select *
from test2;

ⅱ) test1 의 모든 데이터와 test2 의 모든 데이터를 중복된 값을 제거하여 검색

select *
from test1
union
select *
from test2;

ⅲ) 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테이먼트인 데이터를 검색하는 쿼리를 UNION ALL 로 실행

select *
from celeb
where sex='F'
union all
select *
from celeb
where agency='YG엔터테인먼트';

ⅳ) 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테이먼트인 데이터를 검색하는 쿼리를 UNION 으로 실행

select *
from celeb
where sex='F'
union
select *
from celeb
where agency='YG엔터테인먼트';

ⅴ) 가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리와,
1980년대에 태어난 연예인의 이름, 생년월일, 나이를 검색하는 쿼리를 UNION으로 실행
(컬럼 수가 일치하지 않기 때문에 에러 발생)

select name, job_title
from celeb
where job_title like '%가수%'
union
select name, birthday, age
from celeb
where birthday between '19800101' and '19891231';

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

select *
from celeb
where job_title like '%가수%'
union
select *
from celeb
where job_title like '%탤런트%';

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

select *
from celeb
where name like '이%'
union all
select *
from celeb
where birthday between '19700101' and '19791231';

10. Join

- 새로운 테이블 생성

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 (10, 9, 6, '2021-09-11', '하지원');
insert into snl_show values (6, 9, 2, '2021-09-18', '제시');
insert into snl_show values (7, 9, 3, '2021-09-25', '조정석');
insert into snl_show values (8, 9, 4, '2021-10-02', '조여정');
insert into snl_show values (9, 9, 5, '2021-10-09', '옥주현');

select * from snl_show;

- JOIN 기본

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

- INNER JOIN

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

ⅰ) 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;

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

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

- FULL OUTER JOIN

  • 두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식
  • MySQL 에서는 FULL JOIN 을 지원하지 않으므로 LEFT JOIN과 RIGHT JOIN을 사용해야 한다.
# FULL OUTER JOIN 문법 - SQL
select column1, column2, ...
from tableA
full outer join tableB
on tableA.column = tableB.column
where condition;
# FULL OUTER JOIN 문법 - MySQL
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
where condition;

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

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과 같은 결과

# SELF JOIN 문법
select column1, column2, ...
from tableA, tableB, ...
where condition;

ⅰ) 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.id, celeb.name, snl_show.host
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에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업 정보를 검색

# Case1: 칼럼명 앞에 테이블명 명시
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;
# Case2: 동일한 칼럼명이 존재하는 경우에만 테이블명 암시
select snl_show.id, season, episode, name, job_title
from celeb, snl_show
where name = host;

ⅴ) 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 celeb, snl_show
where name = host
	and (broadcast_date > '2020-09-15' or not agency like '엔터테인먼트%')
	and not (job_title like '%영화배우%' or job_title like '%개그맨%');

11. Concat, Alias, Distinct, Limit

- CONCAT

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

ⅰ)

select concat('concat', ' ', 'test');

ⅱ)

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

- Alias

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

ⅰ) name을 이름으로 별칭을 만들어서 검색

select name as '이름'
from celeb;

ⅱ) name은 이름으로, agency는 소속사로 별칭을 만들어서 검색

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

ⅲ) name과 job_title을 합쳐서 profile이라는 별칭을 만들어서 검색

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

ⅳ) snl_show에 출연한 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_show에 출연한 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;

ⅵ) 앞글자가 2글자이고, ‘엔터테인먼트’ 로 끝나는 소속사 연예인 중 SNL 에 출연한 연예인의 신상정보(나이, 성별)와 출연정보(시즌-에피소드, 방송날짜), 소속사 정보를 방송날짜 최신순으로 정렬하여 다음과 같이 검색

select agency as '소속사 정보',
	concat('나이: ', age, '(', sex, ')') as '신상정보',
	concat(season, '-', episode, ', ', '방송날짜: ', broadcast_date) as '출연정보'
from celeb, snl_show
where name = host and agency like '__엔터테인먼트'
order by broadcast_date desc;

- Distinct

  • 검색한 결과의 중복 제거

ⅰ) 연예인 소속사 종류를 검색 - 중복 제외

select distinct agency
from celeb;

ⅱ) 가수 중에서, 성별과 직업별 종류를 검색 - 중복 제외

select distinct sex, job_title
from celeb
where job_title like '%가수%';

- Limit

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

ⅰ) celeb 데이터 3개만 가져오기

select *
from celeb
limit 3;

ⅱ) 나이가 가장 적은 연예인 4명을 검색

select *
from celeb
order by age limit 4;

ⅲ) SNL에 출연한 연예인의 정보를 최신 방송날짜 순으로 2개만 검색하여 다음과 같이 출력

select concat('SNL 시즌 ', season, ' ', '에피소드', episode, ' ', '호스트 ', host) as 'SNL 방송정보'
from snl_show
order by broadcast_date desc
limit 2;

※참고※

  • 새로고침
flush privileges;
profile
Date Scientist & Data Analyst

0개의 댓글