Table of Contents
1. ์ซ์ ์ฌ๋ฆผ, ๋ฐ์ฌ๋ฆผ, ๋ด๋ฆผ
1) ์ฌ๋ฆผ
โข
syntax: ceil(์ซ์)
โข
์๋ฆฟ์๋ฅผ ์ง์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ trick์ด ํ์
select ceil(12.345)
-- ์ฌ๋ฆผ ์๋ฆฟ์ ์ง์
select ceil(12.345*10)*0.1
-- ์ฌ๋ฆผ ํ์ฉ
use world
select percentage, ceil(percentage)
from countrylanguage
SQL
๋ณต์ฌ
2) ๋ฐ์ฌ๋ฆผ
โข
syntax: round(์ซ์, ๊ฒฐ๊ณผ ์์์ ์๋ฆฟ์)
select round(12.345, 2)
select percentage, round(percentage,0)
from countrylanguage
SQL
๋ณต์ฌ
3) ๋ด๋ฆผ
โข
syntax: truncate(์ซ์, ๊ฒฐ๊ณผ ์์์ ์๋ฆฟ์)
โข
์ฐธ๊ณ : truncate์ table์ ์ญ์ ํ ๋๋ ์ฌ์ฉํ๋๋ฐ, delete table๊ณผ ๋ฌ๋ฆฌ truncate table์ ์์ ํ
์ด๋ธ์ ์ด๊ธฐํ์ํด
select truncate(12.345, 1)
select percentage, truncate(percentage, 1)
from countrylanguage
SQL
๋ณต์ฌ
2. ์กฐ๊ฑด๋ฌธ
1) if
โข
syntax: if(์กฐ๊ฑด, ์ฐธ์ธ ๊ฒฝ์ฐ, ๊ฑฐ์ง์ธ ๊ฒฝ์ฐ)
-- ๋์์ ์ธ๊ตฌ๊ฐ 100๋ง์ด ๋์ผ๋ฉด big city, ๊ทธ๋ ์ง ์์ผ๋ฉด small city๋ฅผ scale ์ปฌ๋ผ์ ์ถ๋ ฅ
select name, population, if(population >= 1000000, "big city", "small city") as scale
from city
having scale = "small city"
order by population desc
SQL
๋ณต์ฌ
2) ifnull
โข
syntax: ifnull(์ปฌ๋ผ์ด๋ฆ, ๋ํดํธ ๋ฐ์ดํฐ)
-- ๋
๋ฆฝ์ฐ๋๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ 0์ผ๋ก ์ถ๋ ฅ
select indepyear, ifnull(indepyear, 0)
from country
SQL
๋ณต์ฌ
3) case when then else end
โข
python์ if๋ฌธ๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉ
โข
syntax: case when ์กฐ๊ฑด then ๊ฒฐ๊ณผ else ๊ฒฐ๊ณผ end
โฆ
when, then์ ๋ฐ๋ณต ๊ฐ๋ฅ
-- ๋๋ผ๋ณ๋ก ์ธ๊ตฌ 10์ต ์ด์/1์ต~10์ต/1์ต ์ดํ๋ฅผ "big, medium, small"๋ก ํ์
select name, population,
case
when population > 1000000000 then "big"
when population > 100000000 then "medium"
else "small"
end as scale
from country
having scale = "medium"
order by population desc
SQL
๋ณต์ฌ
3. Date Format
use sakila
select date_format(payment_date, "%Y-%m") as monthly, sum(amount)
from payment
group by monthly
SQL
๋ณต์ฌ
4. Join
-- join ์ค์ต์ ์ธ test1 database์ user table, addr table ์์ฑ
use test1
CREATE TABLE user (
user_id int(11) unsigned NOT NULL AUTO_INCREMENT,
name varchar(30) DEFAULT NULL,
PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE addr (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
addr varchar(30) DEFAULT NULL,
user_id int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO user(name)
VALUES ("jane"),
("po"),
("alice"),
("peter");
INSERT INTO addr(addr, user_id)
VALUES ("seoul", 1),
("pusan", 2),
("deajeon", 3),
("deagu", 5),
("seoul", 6);
SQL
๋ณต์ฌ
1) Inner Join
โข
๊ทธ๋ฅ inner join์ ์ฌ์ฉํ ๊ฒฝ์ฐ (ํค ๋งค์นญ ์์ด)
โฆ
user์ 5๊ฐ ๋ฐ์ดํฐ์ addr์ 4๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ mappingํด 20 row์ ๋ฐ์ดํฐ ์์ฑ
โข
on์ ๋งค์นญ์ํฌ ์ปฌ๋ผ์ ์ง์ ํ ๊ฒฝ์ฐ
โฆ
์ผ์นํ๋ ๋ฐ์ดํฐ๋ง ์ฐพ์์ join (๋ ํ
์ด๋ธ์ ๋ค ์๋ ๋ฐ์ดํฐ๋ง join)
select *
from user
inner join addr
select *
from user
inner join addr
on user.user_id = addr.user_id
SQL
๋ณต์ฌ
2) Left Join
โข
user์ ์๋ user_id์๋ง ์ฃผ์๋ฅผ joinํจ
select user.user_id, user.name, addr.addr
from user
left join addr
on user.user_id = addr.user_id
SQL
๋ณต์ฌ
3) Right Join
โข
์ฃผ์๋ง ์๊ณ user_id, user.name์ด null๊ฐ์ธ row ์์ฑ
select user.user_id, user.name, addr.addr
from user
right join addr
on user.user_id = addr.user_id
SQL
๋ณต์ฌ
5. Union
-- union
select name
from user
union
select addr
from addr
-- union all: ์ค๋ณต์ด ์ ๊ฑฐ๋์ง ์์
select name
from user
union all
select addr
from addr
-- union์ ์ด์ฉํ full outer join
-- (syntax: left join ๊ฒฐ๊ณผ union right join ๊ฒฐ๊ณผ)
select user.name, addr.addr
from user
left join addr
on user.user_id = addr.user_id
union
select user.name, addr.addr
from user
right join addr
on user.user_id = addr.user_id
SQL
๋ณต์ฌ
6. Sub-query
โข
sub-query๋ query๋ฌธ ์์ ์ฌ์ฉํ๋ query
โข
select์ , from์ , where์ ๋ฑ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅ
1) select์ ์ ์ฌ์ฉ
use world
-- SELECT์ ์ ์ฌ์ฉ: ์ ์ฒด ๋๋ผ์, ๋์์, ์ธ์ด์๋ฅผ ํ๋์ row๋ก ์ถ๋ ฅํ๊ธฐ
select
(select count(*) from country) as country_count,
(select count(*) from city) as city_count,
(select count(distinct(language)) from countrylanguage) as language_count
from dual -- from dual์ ์ ์จ์ค๋ ok
SQL
๋ณต์ฌ
2) from์ ์ ์ฌ์ฉ
-- 800๋ง ์ด์์ด ๋๋ ๋์์ ๊ตญ๊ฐ์ฝ๋ ์ด๋ฆ, ๋์์ธ๊ตฌ์๋ฅผ ์ถ๋ ฅํ๊ธฐ
-- ์ฌ์ฉํ sub-query
select countrycode, name, population
from city
where population > 8000000
-- filtering์ ๋จผ์ ํ ํ์ join
-- joinํ ๋๋ ์ต๋ํ ์ ์ ๋ฐ์ดํฐ๋ผ๋ฆฌ ํ๋ ๊ฒ์ด ์ฟผ๋ฆฌ ์ฑ๋ฅ ํฅ์์ ๋์
select city.countrycode, city.name, country.name, city.population
from (
select countrycode, name, population
from city
where population > 8000000
) city
join country
on city.countrycode = coutry.code
-- join์ ํ ํ์ filtering
select city.countrycode, city.name, country.name, city.population
from city
join country
on city.countrycode = coutry.code
having city.population > 8000000
SQL
๋ณต์ฌ
3) where์ ์ ์ฌ์ฉ
-- ์ธ๊ตฌ 800๋ง ์ด์ ๋์์ ๊ตญ๊ฐ์ฝ๋, ๊ตญ๊ฐ์ด๋ฆ, ๋ํต๋ น ์ด๋ฆ์ ์ถ๋ ฅ
select code, name, headofstate
from country
where code in (
select countrycode from city where population > 8000000
)
SQL
๋ณต์ฌ
7. Index
โข
ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ
โข
where์ ์ ๋ค์ด๊ฐ๋ ์ปฌ๋ผ์ index๋ก ์ค์ ํด ๋์ผ๋ฉด ์ค์ ํ ์ปฌ๋ผ์ ์กฐ๊ฑด์ผ๋ก ๊ฒ์ํ ๋ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์์
โข
๋๋ฌด ๋ง์ index๊ฐ ์ค์ ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋ ๋๋ง๋ค index์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ผํ๋ฏ๋ก ๋ฐ์ดํฐ ์
๋ ฅ์ ์๋๊ฐ ๋๋ ค์ง ์ ์์
โข
๊ทธ๋ฌ๋ฏ๋ก ๊ฒ์์กฐ๊ฑด์ผ๋ก ์์ฃผ ์ฌ์ฉํ๋ ์ปฌ๋ผ์ ์ค์ ํ๋ ๊ฒ์ด ์ข์
-- syntax
CREATE INDEX ์ธ๋ฑ์ค์ด๋ฆ
ON ํ
์ด๋ธ์ด๋ฆ (์ปฌ๋ผ์ด๋ฆ1, ์ปฌ๋ผ์ด๋ฆ2)
-- example
-- city ํ
์ด๋ธ์ population ์ปฌ๋ผ์ index๋ก ์ถ๊ฐ
create index Population
on city (population)
-- explain: query๋ฅผ ์คํํ๊ธฐ ์ ์ index๋ก ๊ฒ์์ ํ๋์ง ํ์ธ ๊ฐ๋ฅ
# 100๋ง์ด ๋๋ ๋์์ ๋ฐ์ดํฐ์ ์ถ๋ ฅ ์คํ๊ณํ์ ํ์ธ
explain
select *
from city
where population >= 1000000
-- example: employees db๋ก ํ
์คํธ
use employees
explain
select *
from salaries
where salary > 60000 and to_date > "2000-01-01"
order by salary
limit 1000
create index salaries
on salaries (salary)
SQL
๋ณต์ฌ
8. View
โข
๊ฐ์์ ํ
์ด๋ธ๋ก ํน์ ๋ฐ์ดํฐ๋ง ๋ณด๊ณ ์ํ ๋ ์ฌ์ฉ (ํน์ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ญํ ๋ง ์ํ)
โข
view๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ query๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์
โข
์ปฌ๋ผ์ ์์ ์ด๋ ์ธ๋ฑ์ค ์ค์ ๊ฐ์ ๋ช
๋ น์ ํ ์ ์์
-- syntax
CREATE VIEW <view ์ด๋ฆ> AS
<QUERY>
-- example
use world
select *
from countrylanguage
join (
select country.code, country.name as country_name, city.name as city_name
from country
join city
on country.code = city.countrycode
) s1
on s1.code = countrylanguage.countrycode
create view code_name as
select country.code, country.name as country_name, city.name as city_name
from country
join city
on country.code = city.countrycode
select *
from countrylanguage
join code_name
on code_name.code = countrylanguage.countrycode
SQL
๋ณต์ฌ
์ฐธ๊ณ ์๋ฃ
โข
ํจ์คํธ์บ ํผ์ค '๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ์ค์ฟจ Python 8๊ธฐ' ์์
์๋ฃ