์ง์ง์ง์ง ์์ ์ค๋๋ง์ ์ฐ๋ ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ
์์ผ๋ก ๊ฐ๋ฐ๋ธ๋ก๊ทธ๋ก ์ธ๊ฒ์ด๋ค!!
์ง๊ธ์ ๋ด์ผ ์๋ ํ๋ก๊ทธ๋๋จธ์ค ๊ฒจ์ธ์ธํด ์ฝ๋ฉํ ์คํธ๋ฅผ ์ํด ์ฝํ ์ฐ์ต์ ํด๋ณด๋ ค๊ณ ํ๋ค!
(ํ..ํ๋ด์)
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฝ๋ฉํ ์คํธ ์ฐ์ต๋ฌธ์ ::MySQL (level 1,2)
1. order by ์ฌ์ฉ๋ฒ
SELECT * FROM Customers ORDER BY Country DESC; --๋ด๋ฆผ์ฐจ์
SELECT * FROM Customers ORDER BY Country ASC; --์ค๋ฆ์ฐจ์ (default)
where๊ฐ ์๋ ๊ฒฝ์ฐ where ๋จผ์
2. MIN, MAX ๋ ์ง์ ์ ์ฉ ์
SELECT MAX(DATETIME) FROM ANIMAL_INS; --์ต์
SELECT MIN(DATETIME) FROM ANIMAL_INS; --์ค๋๋ ๊ฒ (ex) ๊ฐ์ฅ ๋จผ์ ๋ค์ด์จ ๋๋ฌผ)
MAX๊ฐ ์ต๊ทผ๊บผ~! ๊ทธ๋์ ๋์จ ๊ฒฐ๊ณผ๋? 2018-02-03 10:40:00
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐ์ดํฐ์ธ ๋ชจ๋ row๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?!
stack overflow๊ฐ ๊ทธ๋ฌ๋ค. Use a subselect
SELECT * FROM ANIMAL_INS WHERE DATETIME=(
SELECT max(DATETIME) FROM ANIMAL_INS
) -- 5๋ฒ์์ ์ค๋ช
ํ limit๋ฅผ ์ฌ์ฉํด๋ ๋๋ค!
์ด๋ ๊ฒ ๊ฐ์ ธ์จ max๊ฐ์ where ๋ฌธ์ datetime์ ๊ฐ์ผ๋ก ์ฃผ๋ฉด ๋จ!!
3. ์ค๋ณต์ ๊ฑฐํ๊ธฐ(distinct, group by)
๋ฌธ์ ) ๋๋ฌผ ๋ณดํธ์์ ๋ค์ด์จ ๋๋ฌผ์ ์ด๋ฆ์ ๋ช ๊ฐ์ธ์ง ์กฐํํ๋ SQL ๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ์ด๋ฆ์ด NULL์ธ ๊ฒฝ์ฐ๋ ์ง๊ณํ์ง ์์ผ๋ฉฐ ์ค๋ณต๋๋ ์ด๋ฆ์ ํ๋๋ก ์นฉ๋๋ค.
์ค๋ณต์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์๋ค.
(1) distinct ํค์๋
(temp tablespace์ ์์๋ก ์ ์ฅํ๊ณ ์์ ํ๋ ๋ฐฉ์์ด๋ผ ์์คํ ์ ๋ถํ๋ฅผ ์ค ์ ์์)
SELECT distinct name FROM ANIMAL_INS --๊ฒฐ๊ณผ: ์ค๋ณต์๋๊ฒ ์ด๋ฆ๋ค์ด ์ซ ๋์ด
๋ฌธ์ ์์๋ ๊ฒฐ๊ณผ๋ก ๋ ์ฝ๋์ ๊ฐ์๋ฅผ ๊ตฌํด์ผ ํ๋ฏ๋ก ์ง๊ณํจ์ count๋ก distinct๋ฅผ ๊ฐ์ธ์ค๋ค.
SELECT count(distinct name) FROM ANIMAL_INS
๊ตณ!!
(2) group by ์
(select์ ์ ์ปฌ๋ผ์ group by์ ์๋ ๋์ผํ๊ฒ ๋ช ์๋ฅผ ํด์ผํ๋ ๋ถ๋ด๊ฐ์ด ์์ง๋ง distinct์ ๋นํ์ฌ ์กฐ๊ธ ๋น ๋ฅธ๊ฐ์ด ์๋ค๊ณ ํ๋ค)
SELECT name FROM ANIMAL_INS group by name
-- ์ฌ๊ธฐ๊น์ง๋ ๊ฒฐ๊ณผ๋ก ์ค๋ณต์ด ์ ๊ฑฐ๋ ์ด๋ฆ ๋ชฉ๋ก์ด ์ญ ๋์จ๋ค (select distinct name... ํ์ ๋์ ๊ฐ์)
ํ์ง๋ง count๋ฅผ ์ฌ์ฉํ๋ฉด group by๋ก ๋ฌถ์ ๊ฐ๊ฐ์ ์ด๋ฆ ๊ฐ์๋ค์ด ๋์ด
๊ฒฐ๋ก !! count ์ง๊ณํจ์ ์ฌ์ฉ์, group by๋ ๊ฐ๊ฐ์ ๊ฒน์น๋ ๊ฐ์๋ฅผ, distinct๋ ๊ฒน์น์ง ์๋ ๊ฐ๋ค ์ ์ฒด์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
๋ฐ๋ก ๋ค์๋ฌธ์ ๊ฐ ๋ฐ๋ก group by์ count๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ค
๋ฌธ์ : ๋๋ฌผ ๋ณดํธ์์ ๋ค์ด์จ ๋๋ฌผ ์ค ๊ณ ์์ด์ ๊ฐ๊ฐ ๊ฐ๊ฐ ๋ช ๋ง๋ฆฌ์ธ์ง ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์
SELECT ANIMAL_TYPE, count(*) FROM ANIMAL_INS group by ANIMAL_TYPE order by ANIMAL_TYPE
4. order by ๋ณต์ ์ ๋ ฌ์กฐ๊ฑด
๋ฌธ์ ) ๋๋ฌผ ๋ณดํธ์์ ๋ค์ด์จ ๋ชจ๋ ๋๋ฌผ์ ์์ด๋์ ์ด๋ฆ, ๋ณดํธ ์์์ผ์ ์ด๋ฆ ์์ผ๋ก ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ๋จ, ์ด๋ฆ์ด ๊ฐ์ ๋๋ฌผ ์ค์์๋ ๋ณดํธ๋ฅผ ๋์ค์ ์์ํ ๋๋ฌผ์ ๋จผ์ ๋ณด์ฌ์ค์ผ ํฉ๋๋ค.
1. ์ด๋ฆ ์(์ค๋ฆ์ฐจ์) 2. ์๊ฐ ์(๋ด๋ฆผ์ฐจ์) ์ผ๋ก ์ ๋ ฌ์ ํด์ผํ๋ค.
SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS order by NAME asc, DATETIME desc
์ฝค๋ง(,)๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ ฌ ์กฐ๊ฑด์ ๋ ๊ฐ ์ด์ ์ค ์ ์๋ค.
5. ์์ n๊ฐ ๋ ์ฝ๋๋ง ๋ณด์ฌ์ฃผ๊ธฐ: limit
๋ฌธ์ ) ๊ฐ์ฅ ๋จผ์ ๋ค์ด์จ ๋๋ฌผ๋ค์ ์ด๋ฆ ๋ณด์ฌ์ฃผ๊ธฐ
๊ฐ์ฅ๋จผ์ ์ด๋๊น (ํ๊ฐ๋ง๋ณด์ฌ์ค๋) ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
-- 1. limit
SELECT NAME FROM ANIMAL_INS order by DATETIME LIMIT 1; --limit n์ผ๋ก ์ฌ์ฉ -> ์์ n๊ฐ ์ถ๋ ฅ
-- 2. subselect
SELECT NAME FROM ANIMAL_INS WHERE DATETIME=(
SELECT min(DATETIME) FROM ANIMAL_INS
)
6. where์ ์์ ์ด๋ฆ์ด null์ธ ๋ ์ฝ๋ ์ฐพ๊ธฐ
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME is NULL
๋ฐ๋๋ก null์ด ์๋ ๊ฒ๋ค๋ง ์ถ๋ ฅํ๋ ค๋ฉด
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME is not NULL
7. null ์ด๊ธฐ๊ฐ ์ค์
... ํ๋ก๊ทธ๋๋ฐ์ ๋ชจ๋ฅด๋ ์ฌ๋๋ค์ NULL์ด๋ผ๋ ๊ธฐํธ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์, ์ด๋ฆ์ด ์๋ ๋๋ฌผ์ ์ด๋ฆ์ No name์ผ๋ก ํ์ํด ์ฃผ์ธ์.
SELECT ANIMAL_TYPE, IFNULL(NAME, "No name"), SEX_UPON_INTAKE FROM ANIMAL_INS order by ANIMAL_ID
IFNULL(์์ฑํ๋, null์ผ๋ ๋์ฒดํ ๊ฐ) : null์ด ์๋๋ฉด ์ฒซ๋ฒ์งธ ์ธ์ ๋ฆฌํด, null์ด๋ฉด ๋๋ฒ์งธ ์ธ์ ๋ฆฌํด
8. having
๋ฌธ์ ) ๋๋ฌผ ๋ณดํธ์์ ๋ค์ด์จ ๋๋ฌผ ์ด๋ฆ ์ค ๋ ๋ฒ ์ด์ ์ฐ์ธ ์ด๋ฆ๊ณผ ํด๋น ์ด๋ฆ์ด ์ฐ์ธ ํ์๋ฅผ ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ๊ฒฐ๊ณผ๋ ์ด๋ฆ์ด ์๋ ๋๋ฌผ์ ์ง๊ณ์์ ์ ์ธ(where name is not null ์ถ๊ฐ)ํ๋ฉฐ, ๊ฒฐ๊ณผ๋ ์ด๋ฆ ์์ผ๋ก ์กฐํํด์ฃผ์ธ์.
SELECT name, count(*) from ANIMAL_INS group by name having count(name) > 1 order by name
๋๋ฒ์ด์์ธ๋ฐ having์ >2 ์ด๋ฌ๊ณ ์์ด์ ํ๋ ธ๋ค;;
9. ์ ์์๊ฐ ๊ตฌํ๊ธฐ
๋ฌธ์ ) 09:00๋ถํฐ 19:59๊น์ง, ๊ฐ ์๊ฐ๋๋ณ๋ก ์ ์์ด ๋ช ๊ฑด์ด๋ ๋ฐ์ํ๋์ง ์กฐํ, ๊ฒฐ๊ณผ๋ ์๊ฐ๋ ์์ผ๋ก ์ ๋ ฌ
SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(datetime)) AS COUNT FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY HOUR
having ์ ์ ์์จ์ ํ๋ ธ๋ค..
SELECT
HOUR(@dt),
MINUTE(@dt),
SECOND(@dt),
DAY(@dt),
WEEK(@dt),
MONTH(@dt),
QUARTER(@dt),
YEAR(@dt);
datetime์ ์ด๋ ๊ฒ ์, ๋ถ, ์ด, ์ผ, ์ฃผ, ๋ฌ ๋ฑ๋ฑ ๋ง ๊ฐ์ ธ์ฌ ์์๋ค. date()๋ก ๋ ์ง๋ง, time()์ผ๋ก ์๊ฐ๋ง ๊ฐ์ ธ์ฌ ์๋ ์์
(์ ์์๊ฐ๊ตฌํ๊ธฐ(2)๋ ์ด๋ ค์์ ๋ค์์ ๋ค์!)
10. WHERE IN ์ฌ์ฉํ๊ธฐ
IN์ ๋ฆฌ์คํธ๋ ์๋ธ์ฟผ๋ฆฌ ์์ ์๋ ๊ฐ๊ณผ ๋งค์นญํ๋ ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ค.
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE FROM ANIMAL_INS
WHERE NAME = "Lucy" OR NAME = "Ella" OR NAME = "Pickle"
OR NAME = "Rogan" OR NAME = "Sabrina" OR NAME = "Mitty"
-- ์ค์ฒฉ OR๋ฅผ WHERE IN ์ฌ์ฉํ๋ฉด ํจ์ฌ ๊ฐ๋จํ๊ฒ ํํํ ์ ์์
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty');
11. ๋ถ๋ถ๋ฌธ์์ด ํฌํจ ์ฌ๋ถ ์๊ธฐ
๋ฌธ์ ) ๋ณดํธ์์ ๋์๊ฐ์ ํ ๋จธ๋๊ฐ ๊ธฐ๋ฅด๋ ๊ฐ๋ฅผ ์ฐพ๋ ์ฌ๋์ด ์ฐพ์์์ต๋๋ค. ์ด ์ฌ๋์ด ๋งํ๊ธธ ํ ๋จธ๋๊ฐ ๊ธฐ๋ฅด๋ ๊ฐ๋ ์ด๋ฆ์ 'el'์ด ๋ค์ด๊ฐ๋ค๊ณ ํฉ๋๋ค. ๋๋ฌผ ๋ณดํธ์์ ๋ค์ด์จ ๋๋ฌผ ์ด๋ฆ ์ค, ์ด๋ฆ์ EL์ด ๋ค์ด๊ฐ๋ ๊ฐ์ ์์ด๋์ ์ด๋ฆ์ ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ๊ฒฐ๊ณผ๋ ์ด๋ฆ ์์ผ๋ก ์กฐํํด์ฃผ์ธ์. ๋จ, ์ด๋ฆ์ ๋์๋ฌธ์๋ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
-- locate ์ฌ์ฉ
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE LOCATE("el", NAME) > 0 and ANIMAL_TYPE = "Dog"
order by name
-- like ์ฌ์ฉ
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%' AND ANIMAL_TYPE LIKE 'Dog'
ORDER BY NAME
๊ฒฐ๊ณผ
๊ฐ๋ฅผ ์ฐพ๊ณ ์๋๋ฐ animal_type์ผ๋ก dog๋ฅผ ํํฐ๋ง ์ํด์ค์ ํ๋ ธ๋ค.
12. DATE_FORMAT
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, "%Y-%m-%d") as ๋ ์ง
FROM ANIMAL_INS order by ANIMAL_ID
%y (์๋ฌธ์)๋ก ํ๋ฉด ์ฐ๋์ ๋ท ๋์๋ฆฌ๋ง ๋์ด(ex) 2018 -> 18) (๋๋ฌธ์ -> 2018)
13. case ์ฌ์ฉ
๋ฌธ์ ) ๋ณดํธ์์ ๋๋ฌผ์ด ์ค์ฑํ๋์๋์ง ์๋์ง ํ์ ํ๋ ค ํฉ๋๋ค. ์ค์ฑํ๋ ๋๋ฌผ์ SEX_UPON_INTAKE ์ปฌ๋ผ์ 'Neutered' ๋๋ 'Spayed'๋ผ๋ ๋จ์ด๊ฐ ๋ค์ด์์ต๋๋ค. ๋๋ฌผ์ ์์ด๋์ ์ด๋ฆ, ์ค์ฑํ ์ฌ๋ถ๋ฅผ ์์ด๋ ์์ผ๋ก ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ์ค์ฑํ๊ฐ ๋์ด์๋ค๋ฉด 'O', ์๋๋ผ๋ฉด 'X'๋ผ๊ณ ํ์ํด์ฃผ์ธ์.
case ์ฌ์ฉ๋ฒ:
CASE
WHEN ์กฐ๊ฑด
THEN '๋ฐํ ๊ฐ'
WHEN ์กฐ๊ฑด
THEN '๋ฐํ ๊ฐ'
ELSE 'WHEN ์กฐ๊ฑด์ ํด๋น ์๋๋ ๊ฒฝ์ฐ ๋ฐํ ๊ฐ'
END
๋ต)
-- ์ฝ๋๋ฅผ ์
๋ ฅํ์ธ์
SELECT
ANIMAL_ID,
NAME,
case
when (SEX_UPON_INTAKE Like'%Neutered%') OR (SEX_UPON_INTAKE Like'%Spayed%') then 'O'
else 'X' --else๋ฅผ ์ง์ ํด ์ฃผ์ง ์์ ๊ฒฝ์ฐ null ๋ฐํ
end as '์ค์ฑํ'
FROM ANIMAL_INS
ํ ์ง์ง ์ค๋๋ง์ ํธ๋๊น ๋๋ฌด ์ด๋ ต๊ณ ,
sql์ ๋ด๊ฐ ๋ชจ๋ฅด๋ ๋ฌธ๋ฒ๋ค์ด ์ ๋ง ๋ง์ ๊ฒ ๊ฐ๋ค
์ธ์ฃผํ ๋ ๋๋ฌด ๋นํจ์จ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ๊ตฌ์ฑํ๊ฒ ๊ฐ๋ค..
sql๋ ๋ ๋ง์ด ๊ณต๋ถํด์ผ๊ฒ ๋ค
level 1, level 2 ๋คํ์๋ค! ์ด์ 3,4๋ ํ์ด์ผ์ง