- Database 목록 확인
show databases;
- Database 생성 및 확인
create database testdb;
show databases;
- 해당 Database로 이동
use testdb;
- Database 삭제 및 확인
drop database testdb;
show databases;
- 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;
- 실습환경 만들기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;
- 실습할 데이터베이스 생성
앞으로 진행되는 강의에서는 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;
- 실습할 데이터베이스로 이동
use zerobase;
- 실습할 테이블 만들기
person 테이블 생성
create table person
(
id int,
name varchar(16),
age int,
sex char
);
desc person;
- Insert - 데이터 추가
insert into person (id, name, age, sex)
values (1, '이효리', 43, 'F');
select * from person;
- Insert - 모든 컬럼 값 추가
insert into person
values (2, '이상순', 48, 'M');
select * from person;
- Select - 특정 컬럼 조회
select name, age, sex from person;
- Select - 모든 컬럼 조회
select *
from person;
- Where - 조건 추가
select *
from person
where sex = 'F';
- Update - 데이터 수정
update person
set age = 23
where name = '이효리';
select *
from person
where name = '이효리';
- Delete - 데이터 삭제
delete from person
where name = '이상순';
select *
from person;
- 실습 테이블 정보
- 실습할 테이블 생성
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 age, name
from celeb
order by age asc;
select age, name
from celeb
order by age desc;
select age, name
from celeb
order by age, name;
select age, name
from celeb
order by age desc, name asc;
- (1) A = B
select *
from celeb
where age=29
order by name;
- (2) A != B
select *
from celeb
where age != 29
order by age;
- (3) A > B
select *
from celeb
where age > 29
order by age;
- (4) A < B
select *
from celeb
where age < 29
- (5) A >= B
select *
from celeb
where age >= 29
order by age;
- (6) A <= B
select *
from celeb
where age <= 29
order by age;
- (6) A <> B
select *
from celeb
where age <> 29
order by age;
- (1) AND
ⅰ) 나이가 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
ⅰ) 나이가 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
ⅰ) 성별이 여자가 아닌 데이터 검색
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
ⅰ) 나이가 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
ⅰ) 나이가 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
ⅰ) 소속사 이름이 ‘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 '%탤런트'));
- 테스트용 테이블 생성
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;
ⅰ) 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';
- 새로운 테이블 생성
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
# 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 '%개그맨%');
- 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;