1. ๊ฐ์ ๋น๊ต์ ๋์ฒด (CASE WHEN ... THEN ... END)
- CASE WHEN์ ํจ์๊ฐ ์๋๋ผ SQL๊ตฌ๋ฌธ
- ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ ๊ณตํ๋ SWITCH ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ ์ญํ
- CASE๋ก ์์ํ๊ณ , END๋ก ๋๋์ผ ํจ
- WHEN ... THEN ... ์ ํ์ํ ๋งํผ ๋ฐ๋ณตํด์ ์ฌ์ฉ
- ๋จ์ํ ์ฝ๋๊ฐ์ ์ค์ ๊ฐ์ผ๋ก ๋ณํํ๊ฑฐ๋ ํน์ ์ผ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ ์ธ์ง ์ดํ์ธ์ง ๋น๊ตํด ์ค๋ช ์ ๋ถ์ด๋ ์ฉ๋๋ก ์ฌ์ฉ
- CASE WHEN ์ ์ด ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง THEN ์ดํ์ ํํ์์ด ์คํ๋จ
๐น Marketing(d001) ๋ถ์์ ์์๋ ์ ์ด ์๋ ๋ชจ๋ ์ฌ์์ ๊ฐ์ฅ ์ต๊ทผ ๊ธ์ฌ ์กฐํ
SELECT de.dept_no, e.first_name, e.gender,
(SELECT s.salary
FROM salaries s
WHERE s.emp_no=e.emp_no
ORDER BY from_date DECS LIMIT 1) AS last_salary
FROM dept_emp de, employees e
WHERE e.emp_no=de.emp_no
AND de.dept_no='d001';
๋ง์ฝ ์ฑ๋ณ์ด ์ฌ์์ธ ๊ฒฝ์ฐ์๋ง ์ต์ข ๊ธ์ฌ ์ ๋ณด๊ฐ ํ์ํ๊ณ , ๋จ์๋ ๊ทธ๋ฅ ์ด๋ฆ๋ง ํ์ํ๋ค๋ฉด...
๐ ์์ ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด์ ๋จ์์ผ ๋๋ ๊ฐ์ ธ์จ last_salary ์ปฌ๋ผ์ ๊ทธ๋ฅ ๋ฒ๋ฆฌ๋ฉด ๋๋ค.
ํ์ง๋ง ๋จ์๋ ๊ทธ๋ฅ ์ด๋ฆ๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ salaries ํ ์ด๋ธ์ ์กฐํํ ํ์๊ฐ ์๋๋ฐ, ์์ ์ฟผ๋ฆฌ์์๋ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ฏ๋ก ๋ถํ์ํ ์์ ์ ํ๊ฒ ๋๋ค.
๐ ์ด๋ฌํ ๋ถํ์ํ ์์ ์ ์ ๊ฑฐํ๊ธฐ ์ํด CASE WHEN์ผ๋ก ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ธ๋ฉด ํ์ํ ๊ฒฝ์ฐ์๋ง ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ค.
SELECT de.dept_no, e.first_name, e.gender
CASE WHEN e.gender='F' THEN
(SELECT s.salary
FROM salaries s
WHERE s.emp_no=e.emp_no
ORDER BY from_date DESC LIMIT 1)
ELSE 0 END AS last_salary
FROM dept_emp de, employees e
WHERE e.emp_no=de.emp_no
AND de.dept_no='d001';
๐ ์ฌ์์ธ ๊ฒฝ์ฐ์๋ง ์๋ธ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ฏ๋ก ๋จ์ ์ฌ์์ ์๋งํผ ์๋ธ์ฟผ๋ฆฌ์ ์คํ ํ์๋ฅผ ์ค์ผ ์ ์๋ค !
2. ํ์ ์ ๋ณํ (CAST, CONVERT)
๐ท CAST()
- ๋ณํํ ์ ์๋ ๋ฐ์ดํฐ ํ์
๐ DATE, TIME, DATETIME, BINARY, CHAR, DECIMAL, SIGNED INTEGER, UNSIGNED INTEGER - ํ๋์ ์ธ์์์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ํ์ ์ ๋ณํํ ๊ฐ์ด๋ ํํ์์, ๋ ๋ฒ์งธ ๋ถ๋ถ์ ๋ณํํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ ํ์ ๋ช ์ ๐ AS๋ก ๊ตฌ๋ถ
- ๋ฌธ์์ด, ์ซ์, ๋ ์ง ๋ณํ์ ๋ช ์์ ์ผ๋ก ํด์ฃผ์ง ์์๋ ์๋์ผ๋ก ํ์ํ ํํ๋ก ๋ณํํ๋, SIGNED๋ UNSIGNED์ ๊ฐ์ ๋ถํธ ์๋ ์ ์ ๋๋ ๋ถํธ ์๋ ์ ์๊ฐ์ ๋ณํ์ ๊ทธ๋ ์ง ์์ ๋๊ฐ ๋ง์ผ๋ฏ๋ก ๋ช ์์ ์ผ๋ก ํ์ ๋ณํ์ ํด์ค์ผ ํจ
SELECT CAST(1-2 AS UNSIGNED);
+-------------------------+
| CAST(1-2 AS UNSIGNED) |
+-------------------------+
| 4294967295 |
+-------------------------+
๐ท CONVERT()
- CAST() ์ฒ๋ผ ํ์ ์ ๋ณํํ๋ ์ฉ๋
- ๋ฌธ์์ด์ ๋ฌธ์ ์งํฉ์ ๋ณํํ๋ ์ฉ๋
- ํ์ ๋ณํ ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ณํํ๋ ค๋ ๊ฐ์ด๋ ํํ์ ๋ช ์, ๋ ๋ฒ์งธ ์ธ์๋ก ๋ณํํ๋ ค๋ ๋ฐ์ดํฐ ํ์ ๋ช ์
- ๋ฌธ์์ด์ ๋ฌธ์ ์งํฉ ๋ณ๊ฒฝ ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ณํํ๊ณ ์ ํ๋ ๊ฐ์ด๋ ํํ์์, ๋ ๋ฒ์งธ ์ธ์์๋ ๋ฌธ์ ์งํฉ์ ์ด๋ฆ ์ง์
์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ๊ตฌ๋ถ์๋ก USING ํค์๋ ๋ช ์
SELECT CONVERT(1-2, UNSIGNED);
+--------------------------+
| CONVERT(1-2, UNSIGNED) |
+--------------------------+
| 4294967295 |
+--------------------------+
SELECT CONVERT('ABC' USING 'utf8mb4');
+-----------------------------+
| CONVERT('ABC' USING utf8mb4)|
+-----------------------------+
| ABC |
+-----------------------------+
3. ์ด์ง๊ฐ๊ณผ 16์ง์ ๋ฌธ์์ด (Hex String) ๋ณํ(HEX, UNHEX)
๐ท HEX()
- ์ด์ง๊ฐ์ ์ฌ๋์ด ์ฝ์ ์ ์๋ ํํ์ 16์ง์์ ๋ฌธ์์ด๋ก ๋ณํ
๐ท UNHEX()
- 16์ง์์ ๋ฌธ์์ด์ ์ฝ์ด์ ์ด์ง๊ฐ(Binary)๋ก ๋ณํ
4. ์ํธํ ๋ฐ ํด์ ํจ์ (MD5, SHA, SHA2)
๋น๋์นญํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด์ ๊ฐ๊ฐ ์ง์ ๋ ๋นํธ ์์ ํด์๊ฐ์ ๋ง๋ค์ด๋ด๋ ํจ์
๐ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ์ํธํ๊ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ธ์ฝ๋ฉํ๋ ๋ฐ ์ฌ์ฉ๋จ
๐ ํจ์๋ค์ ๊ฒฐ๊ณผ๊ฐ์ ์ค๋ณต ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋ฎ์ผ๋ฏ๋ก ๊ธธ์ด๊ฐ ๊ธด ๋ฐ์ดํฐ๋ฅผ ํฌ๊ธฐ๋ฅผ ์ค์ฌ ์ธ๋ฑ์ฑ(ํด์)ํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋จ
๐ท SHA()
- SHA-1 ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉฐ ๊ฒฐ๊ณผ๋ก 160๋นํธ(20 ๋ฐ์ดํธ) ํด์๊ฐ์ ๋ฐํ
๐ท SHA2()
- SHA ์ํธํ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋ ๊ฐ๋ ฅํ 224๋นํธ๋ถํฐ 512๋นํธ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ์์ฑ๋ ํด์๊ฐ ๋ฐํ
๐ท MD5()
- ๋ฉ์์ง ๋ค์ด์ ์คํธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด 128๋นํธ(16๋ฐ์ดํธ) ํด์๊ฐ ๋ฐํ
- ์ ๋ ฅ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์ค์ด๋ ์ฉ๋๋ก ์ฌ์ฉ
๐ MD5() ํ์ฉ ์์
- URL ๊ฐ์ ๊ฐ์ ์ ์ฒด์ ์ผ๋ก ๊ธธ์ด๊ฐ ๊ธด ํธ์ด๋ผ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด์๋ ์ธ๋ฑ์ค๊ฐ ํ์ํจ
- ๊ธด ์ปฌ๋ผ์ ๋ํด ์ ์ฒด ๊ฐ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ ๊ณต๊ฐ ๋ญ๋น๋ ์ปค์ง
- URL์ ๊ฐ์ MD5() ํจ์๋ก ๋จ์ถํ๋ฉด 16๋ฐ์ดํธ๋ก ์ ์ฅ ๊ฐ๋ฅํ๊ณ , 16๋ฐ์ดํธ๋ก ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด ๋๋ฏ๋ก ์๋์ ์ผ๋ก ํจ์จ์
CREATE TABLE tb_accesslog (
access_id BIGINT NOT NULL AUTO_INCREMENT,
access_url VARCHAR(1000) NOT NULL,
access_dttm DATETIME NOT NULL,
PRIMARY KEY(access_id),
INDEX ix_accessurl ( (MD5(access_url)) )
);
-- // MD5 ํด์ ๊ฐ์ผ๋ก ๊ฒ์ํ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ๋จ (ํ๋ฌธ์ผ๋ก ๊ฒ์ X)
SELECT *
FROM tb_accesslog
WHERE MD5(access_url) = MD5('http://matt.com');
์ ์ฅ ๊ณต๊ฐ์ ๋ ์ค์ด๊ณ ์ ํ๋ฉด....
๐ MD5() ํจ์์ ๊ฒฐ๊ณผ๋ฅผ UNHEX() ํจ์๋ฅผ ์ด์ฉํด ์ด์ง๊ฐ์ผ๋ก ๋ง๋ฆ ๐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์กฐ๊ธ ๋ ์ค์ผ ์ ์์ !!
CREATE TABLE tb_accesslog (
access_id BIGINT NOT NULL AUTO_INCREMENT,
access_url VARCHAR(1000) NOT NULL,
access_dttm DATETIME NOT NULL,
PRIMARY KEY(access_id),
INDEX ix_accessurl ( UNHEX((MD5(access_url))) )
);
5. ์ฒ๋ฆฌ ๋๊ธฐ (SLEEP)
๐ท SLEEP()
- ์ฟผ๋ฆฌ ์คํ ๋์ค ๋ฉ์ถฐ์ ๋๊ธฐ
- ๊ฐ๋ฐ์ด๋ ๋๋ฒ๊น ์ฉ๋๋ก ์ ๊น ๋๊ธฐํ๊ฑฐ๋ ์ผ๋ถ๋ฌ ์ฟผ๋ฆฌ์ ์คํ์ ์ค๋ ์๊ฐ ์ ์งํ๊ณ ์ ํ ๋ ์ ์ฉ
- ๋๊ธฐํ ์๊ฐ์ ์ด ๋จ์๋ก ์ธ์๋ฅผ ๋ฐ์
6. ๋ฒค์น๋งํฌ (BENCHMARK)
๐ท BENCHMARK()
- ๋๋ฒ๊น ์ด๋ ๊ฐ๋จํ ํจ์์ ์ฑ๋ฅ ํ ์คํธ์ฉ์ผ๋ก ์ ์ฉ
- ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ฐ๋ณตํด์ ์ํํ ํ์
- ๋ ๋ฒ์งธ ์ธ์๋ ๋ฐ๋ณตํด์ ์คํํ ํํ์ ๐ ๋ฐ๋์ ์ค์นผ๋ผ๊ฐ(ํ๋์ ์ปฌ๋ผ์ ๊ฐ์ง ํ๋์ ๋ ์ฝ๋)์ ๋ฐํํ๋ ํํ์์ด์ด์ผ ํจ
- ์ง์ ํ ํ์๋งํผ ๋ฐ๋ณต ์คํํ๋ ๋ฐ ์ผ๋ง๋ ์๊ฐ์ด ์์๋๋์ง๊ฐ ์ค์
- ํด๋น ํจ์๋ก ์ป์ ์ฟผ๋ฆฌ๋ ํจ์์ ์ฑ๋ฅ์ ๊ทธ ์์ฒด๋ก๋ ํฐ ์๋ฏธ X
- ๋ ๊ฐ์ ๋์ผ ๊ธฐ๋ฅ์ ์๋์ ์ผ๋ก ๋น๊ต ๋ถ์ํ๋ ์ฉ๋๋ก ์ฌ์ฉ ๊ถ์ฅ
โ ์ฃผ์์ฌํญ
"SELECT BENCHMARK(10, expr)"๊ณผ "SELECT expr"์ 10๋ฒ ์ง์ ์คํํ๋ ๊ฒ์ ์ฐจ์ด ์์
- 10๋ฒ ์ง์ ์คํํ๋ ๊ฒฝ์ฐ์๋ ๋งค๋ฒ ์ฟผ๋ฆฌ์ ํ์ฑ์ด๋ ์ต์ ํ, ํ ์ด๋ธ ์ ๊ธ์ด๋ ๋คํธ์ํฌ ๋น์ฉ ๋ฑ์ด ์์๋จ
- BENCHMARK() ์ฌ์ฉ ์ ๋ฒค์น๋งํฌ ํ์์ ๊ด๊ณ์์ด ๋จ 1๋ฒ์ ๋คํธ์ํฌ, ์ฟผ๋ฆฌ ํ์ฑ ๋ฐ ์ต์ ํ ๋น์ฉ์ด ์์๋จ.
๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ ์ง์ 10๋ฒ ์คํํ๋ ๊ฒ๋ณด๋ค 1/10๋ฐ์ ์ผ์ด๋์ง ์์
7. IP ์ฃผ์ ๋ณํ (INET_ATON, INET_NTOA)
IP ์ฃผ์๋ 4๋ฐ์ดํธ์ ๋ถํธ ์๋ ์ ์์ธ๋ฐ, ๋๋ถ๋ถ์ DBMS์์๋ IP ์ ๋ณด๋ฅผ VARCHAR(15) ํ์ ์ '.'์ผ๋ก ๊ตฌ๋ถํด์ ์ ์ฅํ๋ฏ๋ก ์ ์ฅ๊ณต๊ฐ์ด ํจ์ฌ ๋ง์ด ํ์
๐ MySQL์์ ์ ๊ณตํ๋ ํจ์๋ฅผ ์ด์ฉํด IPv4 ์ฃผ์๋ฅผ ๋ฌธ์์ด์ด ์๋ ๋ถํธ ์๋ ์ ์ ํ์ ์ ์ ์ฅํ ์ ์๊ฒ ์ ๊ณต
๐ท INET_ATON()
- ๋ฌธ์์ด๋ก ๊ตฌ์ฑ๋ IPv4 ์ฃผ์๋ฅผ ์ ์ํ์ผ๋ก ๋ณํ
๐ท INET_NTOA()
- ์ ์ํ์ IPv4 ์ฃผ์๋ฅผ ์ฌ๋์ด ์ฝ์ ์ ์๋ ํํ์ '.'์ผ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด๋ก ๋ณํ
INET6_ATON(), INET6_NTOA() ํจ์๋ฅผ ์ด์ฉํ๋ฉด IPv6 ์ฃผ์ ๋ณํ ๊ฐ๋ฅ