1. NULL ๊ฐ ์ฒ๋ฆฌ
โณ๏ธ NULL ๊ฐ ๋น๊ต ๋ฐ ๋์ฒด (IFNULL, ISNULL)
๐ท IFNULL()
- ์ปฌ๋ผ์ด๋ ํํ์์ ๊ฐ์ด NULL์ธ์ง ๋น๊ตํ๊ณ , NUnLL์ด๋ฉด ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋์ฒด
- ์ฒซ ๋ฒ์งธ ์ธ์๋ NULL์ธ์ง ์๋์ง ๋น๊ตํ๋ ค๋ ์ปฌ๋ผ์ด๋ ํํ์
- ๋ ๋ฒ์งธ ์ธ์๋ ์ฒซ ๋ฒ์งธ ์ธ์์ ๊ฐ์ด NULL์ผ ๊ฒฝ์ฐ ๋์ฒดํ ๊ฐ์ด๋ ์ปฌ๋ผ ์ค์
- ํจ์์ ๋ฐํ๊ฐ์ ์ฒซ ๋ฒ์งธ ์ธ์๊ฐ NULL์ด ์๋๋ฉด ์ฒซ ๋ฒ์งธ ์ธ์์ ๊ฐ์, ์ฒซ ๋ฒ์งธ ์ธ์์ ๊ฐ์ด NULL์ด๋ฉด ๋ ๋ฒ์งธ ์ธ์์ ๊ฐ ๋ฐํ
๐ท ISNULL()
- ์ธ์๋ก ์ ๋ฌํ ํํ์์ด๋ ์ปฌ๋ผ์ ๊ฐ์ด NULL์ธ์ง ์๋์ง ๋น๊ต
- NULL์ด๋ฉด TRUE(1), NULL์ด ์๋๋ฉด FALSE(0) ๋ฐํ
2. ๋ ์ง ๋ฐ ์๊ฐ ์ฒ๋ฆฌ
โณ๏ธ ํ์ฌ ์๊ฐ ์กฐํ (NOW, SYSDATE)
๐ท NOW()
- ํ๋์ SQL์์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง
- ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ์์ ์ ๊ฐ์ ๋ฐํ
SELECT NOW(), SLEEP(2), NOW();
๐ ๋ ๋ฒ์ NOW() ํจ์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ๊ฐ ๋ฐํ
๐ท SYSDATE()
- ํ๋์ SQL ๋ด์์๋ ํธ์ถ๋๋ ์์ ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง
- ํจ์ ํธ์ถ ์์ ์ ๋ฐ๋ฅธ ์ค์๊ฐ ๋ ์ง์ ์๊ฐ ๋ฐํ
SELECT SYSDATE(), SLEEP(2), SYSDATE();
๐ SLEEP() ํจ์์ ๋๊ธฐ ์๊ฐ์ธ 2์ด ๋์์ ์ฐจ์ด ๋ฐ์
โ ์ด๋ฌํ SYSDATE() ํจ์์ ํน์ฑ ํ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ โ
1. SYSDATE() ํจ์๊ฐ ์ฌ์ฉ๋ SQL์ ๋ ํ๋ฆฌ์นด ์๋ฒ์์ ์์ ์ ์ผ๋ก ๋ณต์ ๋์ง X
2. SYSDATE() ํจ์์ ๋น๊ต๋๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ X
๐ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๋ฏ๋ก ์์๊ฐ ์๋
๐ ์ธ๋ฑ์ค ์ค์บํ ๋๋ ๋งค๋ฒ ๋น๊ต๋๋ ๋ ์ฝ๋๋ง๋ค ํจ์ ์คํ
๊ผญ ํ์ํ ๋๊ฐ ์๋๋ผ๋ฉด SYSDATE() ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ํธ์ด ์ข๊ณ , ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์ค์ ํ์ผ์ sysdate-is-now ์์คํ ๋ณ์๋ฅผ ๋ฃ์ด์ ํ์ฑํ ํ์ !
โณ๏ธ ๋ ์ง์ ์๊ฐ์ ํฌ๋งท (DATE_FORMAT, STR_TO_DATE)
๐ท DATE_FORMAT()
- DATETIME ํ์ ์ ์ปฌ๋ผ์ด๋ ๊ฐ์ ์ํ๋ ํํ์ ๋ฌธ์์ด๋ก ๋ณํํด์ผํ ๋ ์ฌ์ฉ
์ง์ ๋ฌธ์ | ๋ด์ฉ |
%Y | 4์๋ฆฌ ์ฐ๋ |
%m | 2์๋ฆฌ ์ซ์ ํ์์ ์ (01 ~ 12) |
%d | 2์๋ฆฌ ์ซ์ ํ์์ ์ผ์ (01 ~ 31) |
%H | 2์๋ฆฌ ์ซ์ ํ์์ ์ (00 ~ 23) |
%i | 2์๋ฆฌ ์ซ์ ํ์์ ๋ถ (00 ~ 59) |
%s | 2์๋ฆฌ ์ซ์ ํ์์ ์ด (00 ~ 59) |
- SQL์์ ํ์ค ํํ(๋ -์-์ผ ์:๋ถ:์ด)๋ก ์ ๋ ฅ๋ ๋ฌธ์์ด์ ํ์ํ ๊ฒฝ์ฐ ์๋์ผ๋ก DATETIME ํ์ ์ผ๋ก ๋ณํ๋์ด ์ฒ๋ฆฌ
๐ท STR_TO_DATE()
- ๋ฌธ์์ด์ DATETIME ํ์ ์ผ๋ก ๋ณํ
โณ๏ธ ๋ ์ง์ ์๊ฐ์ ์ฐ์ฐ (DATE_ADD, DATE_SUB)
๐ท DATE_ADD()
- ํน์ ๋ ์ง์์ ์ฐ๋๋ ์์ผ ๋๋ ์๊ฐ ๋ฑ์ ๋ํ ๋ ์ฌ์ฉ
- DATE_ADD() ํจ์๋ก ๋ํ๊ฑฐ๋ ๋นผ๋ ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ DATE_SUB()๋ ํฌ๊ฒ ํ์ X
- ์ฒซ ๋ฒ์งธ ์ธ์๋ ์ฐ์ฐ์ ์ํํ ๋ ์ง
- ๋ ๋ฒ์งธ ์ธ์๋ ๋ํ๊ฑฐ๋ ๋นผ๊ณ ์ ํ๋ ์์ ์๋ ์ผ์์ ์ ๋ฑ
- INTERVAL n [YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, ...] ํํ๋ก ์ ๋ ฅ
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY) AS tomorrow;
SELECT DATE_ADD(NOW(), INTERVAL -1 DAY) AS yesterday;
โณ๏ธ ํ์์คํฌํ ์ฐ์ฐ (UNIX_TIMESTAMP, FROM_UNIXTIME)
๐ท UNIX_TIMESTAMP()
- '1970-01-01 00:00:00'์ผ๋ก๋ถํฐ ๊ฒฝ๊ณผ๋ ์ด์ ์ ๋ฐํ
- ์ธ์๊ฐ ์์ผ๋ฉด ํ์ฌ ๋ ์ง์ ์๊ฐ์ ํ์์คํฌํ ๊ฐ ๋ฐํ
- ์ธ์๋ก ํน์ ๋ ์ง๋ฅผ ์ ๋ฌํ๋ฉด ๊ทธ ๋ ์ง์ ์๊ฐ์ ํ์์คํฌํ ๋ฐํ
๐ท FROM_UNIXTIME()
- UNIX_TIMESTAMP() ํจ์์ ๋ฐ๋๋ก, ์ธ์๋ก ์ ๋ฌํ ํ์์คํฌํ ๊ฐ์ DATETIME ํ์ ์ผ๋ก ๋ฐํํ๋ ํจ์
MySQL์ TIMESTAMP ํ์ ์ 4๋ฐ์ดํธ ์ซ์ ํ์ ์ผ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๊ฐ์ง ์ ์๋ ๊ฐ์ ๋ฒ์๋
'1970-01-01 00:00:01' ~ '2038-01-09 03:14:07' ๊น์ง์ ๋ ์ง ๊ฐ๋ง ๊ฐ๋ฅํ๋ฏ๋ก ์์ ํจ์๋ค๋ ์ด ๋ฒ์์ ๋ ์ง ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
3. ๋ฌธ์์ด ์ฒ๋ฆฌ
โณ๏ธ ๋ฌธ์์ด ์ฒ๋ฆฌ (RPAD, LPAD / RTRIM, LTRIM, TRIM)
๐ท RPAD(), LPAD()
- ๋ฌธ์์ด์ ์ข์ธก ๋๋ ์ฐ์ธก์ ๋ฌธ์๋ฅผ ๋ง๋ถ์ฌ์ ์ง์ ๋ ๊ธธ์ด์ ๋ฌธ์์ด๋ก ๋ง๋๋ ํจ์
- ์ฒซ ๋ฒ์งธ ์ธ์๋ ํจ๋ฉ ์ฒ๋ฆฌ๋ฅผ ํ ๋ฌธ์์ด
- ๋ ๋ฒ์งธ ์ธ์๋ ๋ช ๋ฐ์ดํธ๊น์ง ํจ๋ฉํ ๊ฒ์ธ์ง (ํจ๋ฉ ์ ์ฉ ํ ๊ฒฐ๊ณผ๋ก ๋ฐํ๋ ๋ฌธ์์ด์ ์ต๋ ๊ธธ์ด)
- ์ธ ๋ฒ์งธ ์ธ์๋ ์ด๋ค ๋ฌธ์๋ฅผ ํจ๋ฉํ ๊ฒ์ธ์ง
๐ท RTRIM(), LTRIM()
- ๋ฌธ์์ด์ ์ฐ์ธก ๋๋ ์ข์ธก์ ์ฐ์๋ ๊ณต๋ฐฑ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๋ ํจ์
- TRIM() ํจ์๋ LTRIM()๊ณผ RTRIM()์ ๋์์ ์ํ
โณ๏ธ ๋ฌธ์์ด ๊ฒฐํฉ (CONCAT)
๐ท CONCAT()
- ์ฌ๋ฌ ๊ฐ์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํด์ ํ๋์ ๋ฌธ์์ด๋ก ๋ฐํํ๋ ํจ์
- ์ธ์์ ๊ฐ์ ์ ํ X
- ์ซ์ ๊ฐ์ ์ธ์๋ก ์ ๋ฌํ๋ฉด ๋ฌธ์์ด ํ์ ์ผ๋ก ์๋ ๋ณํํ ํ ์ฐ๊ฒฐ
- ์๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ช ์์ ์ผ๋ก CAST() ํจ์๋ฅผ ์ด์ฉํด ํ์ ์ ๋ฌธ์์ด๋ก ๋ณํํ๋ ํธ์ด ์์ ํจ
โณ๏ธ GROUP BY ๋ฌธ์์ด ๊ฒฐํฉ (GROUP_CONCAT)
๐ท GROUP_CONCAT()
- ์ฃผ๋ก GROUP BY์ ํจ๊ป ์ฌ์ฉํ๋ฉฐ GROUP BY๊ฐ ์๋ SQL์์ ์ฌ์ฉํ๋ฉด ๋จ ํ๋์ ๊ฒฐ๊ณผ๊ฐ์ ๋ง๋ค์ด๋
- ๊ฐ๋ค์ ๋จผ์ ์ ๋ ฌํ ํ ์ฐ๊ฒฐํ๊ฑฐ๋ ๊ฐ ๊ฐ์ ๊ตฌ๋ถ์ ์ค์ ๊ฐ๋ฅ
- ์ฌ๋ฌ ๊ฐ ์ค์์ ์ค๋ณต ์ ๊ฑฐํ๊ณ ์ฐ๊ฒฐ ๊ฐ๋ฅ
- ์ง์ ํ ์ปฌ๋ผ์ ๊ฐ๋ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ ํ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ ๊ณต๊ฐ ์ฌ์ฉ
- ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ ํฌ๊ธฐ๋ group_concat_max_len ์์คํ ๋ณ์๋ก ์กฐ์ ๊ฐ๋ฅ
๐น ์๋์ฐ ํจ์๋ฅผ ์ด์ฉํด ์ต๋ 5๊ฐ ๋ถ์๋ง GROUP_CONCAT ์คํ
SELECT GROUP_CONCAT(dept_no ORDER BY dept_name DESC)
FROM(
SELECT *, RANK() OVER (ORDER BY dept_no) AS rnk
FROM departments
) as x
WHERE rnk <= 5;
- ๋ด๋ถ ์ฟผ๋ฆฌ - RANK() OVER (ORDER BY dept_no) AS rnk
- RANK() ์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ dept_no ๊ฐ์ ๋ฐ๋ผ ๊ฐ ํ์ ์์๋ฅผ ๋งค๊น
- departments ํ ์ด๋ธ์ ๋ชจ๋ ์ด๊ณผ ํจ๊ป ์๋ก ์์ฑ๋ rnk ์ด์ ํฌํจํ์ฌ ์ถ๋ ฅ
- ์ธ๋ถ ์ฟผ๋ฆฌ - SELECT GROUP_CONCAT(dept_no ORDER BY dept_name DESC)
- ์ ํ๋ dept_no ๊ฐ๋ค์ ํ๋์ ๋ฌธ์์ด๋ก ๊ฒฐํฉ
- ๊ฒฐํฉ ์์๋ dept_name ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
๐ ์๋์ฐ ํจ์๋ ?
๐ SQL์์ ๋ฐ์ดํฐ ์งํฉ์ ๋ํด ํ๋ณ๋ก ๊ณ์ฐ์ ์ํํ๋ ํจ์๋ก, ๊ฐ ํ์ ๋ํด ๋ฐ์ดํฐ๋ฅผ ๋ถ์, ์์ฝํ๋ฉด์๋ ์๋ณธ ํ ๊ทธ๋๋ก ์ ์ง
<์๋์ฐ ํจ์> OVER (
[PARTITION BY <๊ธฐ์ค ์ด>]
[ORDER BY <์ ๋ ฌ ๊ธฐ์ค>]
)
- ์๋์ฐ ํจ์
- ์ง๊ณ ํจ์ : SUM, AVG, COUNT, MAX, MIN ๋ฑ
- ์์ ํจ์ : RANK, DENSE_RANK, ROW_NUMBER, NTILE ๋ฑ
- ํต๊ณ ํจ์ : LAG, LEAD, FIRST_VALUE, LAST_VALUE ๋ฑ
- OVER : ์๋์ฐ ํจ์๋ฅผ ์ ์ํ๋ ํค์๋
- PARTITION BY (์ ํ์ฌํญ)
- ๋ฐ์ดํฐ ์งํฉ์ ํน์ ์ด ๊ฐ ๊ธฐ์ค์ผ๋ก ๋ถํ
- ์ง์ ํ์ง ์์ผ๋ฉด ์ ์ฒด ๋ฐ์ดํฐ ์งํฉ์ด ํ๋์ ์๋์ฐ๋ก ์ฒ๋ฆฌ๋จ
- ORDER BY (์ ํ์ฌํญ)
- ๊ณ์ฐ ์์ ์ง์
- ์์๋ ํต๊ณํจ์์์ ์ฌ์ฉ๋จ
๐น ๋ํฐ๋ด ์กฐ์ธ์ ์ด์ฉํด ๋ถ์๋ณ๋ก 10๋ช ์ฉ๋ง GROUP_CONCAT ์คํ
SELECT d.dept_no, GROUP_CONCAT(de2.emp_no)
FROM departments d
LEFT JOIN LATERAL (SELECT de.dept_no, de.emp_no
FROM dept_emp de
WHERE de.dept_no=d.dept_no
ORDER BY de.emp_no ASC LIMIT 10) de2 ON de2.dept_no=d.dept_no
GROUP BY d.dept_no;
๐ departments ํ ์ด๋ธ๊ณผ dept_emp ํ ์ด๋ธ์ ์กฐ์ธํ ๋ค, ๊ฐ ๋ถ์(dept_no)์ ์ํ๋ ์ต๋ 10๋ช ์ ์ง์(emp_no)์ ์ฐ๊ฒฐํ์ฌ ๋ฌธ์์ด๋ก ๋ฐํ
- LATERAL ์๋ธ์ฟผ๋ฆฌ
- LATERAL์ ์ผ์ชฝ ํ ์ด๋ธ์ ๊ฐ ํ(departments)์ ๊ธฐ์ค์ผ๋ก ๋์ํ๋ ๋์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋๋ก ํจ
- dept_emp ํ ์ด๋ธ์์ WHERE de.dept_no=d.dept_no๋ก ํด๋น ๋ถ์(d.dept_no)์ ์ํ ์ง์๋ง ์ ํ
- emp_no๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ํ ๊ฐ ๋ถ์ ๋น ์ต๋ 10๋ช ์ ์ง์๋ง ์ ํ
- LEFT JOIN
- departments ํ ์ด๋ธ์ ์๋ ๋ถ์๋ ํญ์ ํฌํจ๋จ
- ํด๋น ๋ถ์์ ์ง์์ด ์์ผ๋ฉด(dept_emp์ ํด๋น dept_no๊ฐ ์์ผ๋ฉด) ๊ฒฐ๊ณผ๋ NULL๋ก ์ฒ๋ฆฌ
๐ LATERAL ์ด๋ ?
https://dev.mysql.com/doc/refman/8.0/en/lateral-derived-tables.html
๐ ์ผ๋ฐ์ ์ผ๋ก ์๋ธ์ฟผ๋ฆฌ๋ ๋ ๋ฆฝ์ ์ด๋ฉฐ ์ผ์ชฝ ํ ์ด๋ธ์ ํ์ฌ ํ ๊ฐ์ ์ฐธ์กฐํ ์ ์์ง๋ง(์์ ์ฟผ๋ฆฌ์ ์ปฌ๋ผ ์ฐธ์กฐ X)
LATERAL์ ์ผ์ชฝ ํ ์ด๋ธ์ ๊ฐ ํ์ ๊ธฐ์ค์ผ๋ก ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋๋ก ํ์ฉ
๐น ์ ํ์ฌํญ
- LATERAL ํ์ ํ ์ด๋ธ์ FROM ์ ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- FROM ์ ์์๋ ์ผํ๋ก ๊ตฌ๋ถ๋ ํ ์ด๋ธ ๋ชฉ๋ก์ด๋ JOIN ์์์ ์ฌ์ฉ ๊ฐ๋ฅ
SELECT <columns>
FROM <table1>
LEFT JOIN LATERAL (
SELECT <columns>
FROM <table2>
WHERE <table2_column> = <table1_column>
) alias ON <join_condition>;
4. JSON ์ฒ๋ฆฌ
โณ๏ธ JSON ํฌ๋งท (JSON_PRETTY)
๐ท JSON_PRETTY()
- ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด JSON ์ปฌ๋ผ๊ฐ์ ๋ํ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ ๊ฒ์ ํด๊ฒฐํด์ค
- JSON ์ปฌ๋ผ์ ๊ฐ์ ์ฝ๊ธฐ ์ฌ์ด ํฌ๋งท์ผ๋ก ๋ณํ
โณ๏ธ JSON ํ๋ ํฌ๊ธฐ (JSON_STORAGE_SIZE)
๐ท JSON_STORAGE_SIZE()
- MySQL ์๋ฒ๋ ๋์คํฌ์ ์ ์ฅ ๊ณต๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด JSON ๋ฐ์ดํฐ๋ฅผ ์ค์ ๋์คํฌ์ ์ ์ฅํ ๋ BSON(Binary JSON_ ํฌ๋งท ์ฌ์ฉ
- BSON์ผ๋ก ๋ณํ๋์ ๋ ์ ์ฅ ๊ณต๊ฐ์ ํฌ๊ธฐ๊ฐ ์ผ๋ง๋ ๋ ์ง ์์ธกํ๊ธฐ ์ด๋ ค์ฐ๋ฏ๋ก ํด๋น ํจ์๋ก ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๋ฐํ
โณ๏ธ JSON ํ๋ ์ถ์ถ (JSON_EXTRACT)
๐ท JSON_EXTRACT()
- JSON ๋ํ๋จผํธ์์ ํน์ ํ๋์ ๊ฐ ๊ฐ์ ธ์ด
- ์ฒซ ๋ฒ์งธ ์ธ์๋ JSON ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์ปฌ๋ผ ๋๋ JSON ๋ํ๋จผํธ ์์ฒด
- ๋ ๋ฒ์งธ ์ธ์๋ ๊ฐ์ ธ์ค๊ณ ์ ํ๋ ํ๋์ JSON ๊ฒฝ๋ก
SELECT emp_no, JSON_EXTRACT(doc, "$.first_name") FROM employee_docs;
SELECT emp_no, doc -> "$.first_name" FROM employee_docs;
+--------+-------------------------+
| emp_no | JSON_EXTRACT |
+--------+-------------------------+
| 101 | "John" |
| 102 | "Jane" |
| 103 | "Alice" |
+--------+-------------------------+
SELECT emp_no, JSON_UNQUOTE(JSON_EXTRACT(doc, "$.first_name")) FROM employee_docs;
SELECT emp_no, doc ->> "$.first_name" FROM employee_docs;
+--------+-------------------------+
| emp_no | JSON_UNQUOTE |
+--------+-------------------------+
| 101 | John |
| 102 | Jane |
| 103 | Alice |
+--------+-------------------------+
โณ๏ธ JSON ์ค๋ธ์ ํธ ํฌํจ ์ฌ๋ถ ํ์ธ (JSON_CONTAINS)
๐ท JSON_CONTAINS()
- JSON ๋ํ๋จผํธ ๋๋ ์ง์ ๋ JSON ๊ฒฝ๋ก์ JSON ํ๋๋ฅผ ๊ฐ์ง๊ณ ์๋์ง๋ฅผ ํ์ธํ๋ ํจ์
- ์ฒซ ๋ฒ์งธ ์ธ์๋ JSON ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๋ ์ปฌ๋ผ์ด๋ JSON ๋ํ๋จผํธ
- ๋ ๋ฒ์งธ ์ธ์๋ JSON ์ค๋ธ์ ํธ(๋ํ๋จผํธ ๋๋ ํ๋๊ฐ) ์ฌ์ฉ
- ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฃผ์ด์ง JSON ๋ํ๋จผํธ์์ ๋ ๋ฒ์งธ ์ธ์์ JSON ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋์ง๋ฅผ ๊ฒ์ฌ
- ์ธ ๋ฒ์งธ ์ธ์๋ JSON ๊ฒฝ๋ก ๋ช ์ (์ ํ์ ๋ถ์ฌ) ๐ ํด๋น ๊ฒฝ๋ก์ JSON ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ ์ฒดํฌ
SELECT emp_no FROM employee_docs
WHERE JSON_CONTAINS(doc, '{"first_name" : "Chris"}');
SELECT emp_no FROM employee_docs
WHERE JSON_CONTAINS(doc, '"Chris"', '$.first_name');
โณ๏ธ JSON ์ปฌ๋ผ์ผ๋ก ์ง๊ณ (JSON_OBJECTAGG & JSON_ARRAYAGG)
GROUP BY ์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ์ง๊ณ ํจ์๋ก์, RDBMS ์ปฌ๋ผ์ ๊ฐ๋ค์ ๋ชจ์ JSON ๋ฐฐ์ด ๋๋ ๋ํ๋จผํธ ์์ฑ
๐ท JSON_OBJECTAGG()
- ์ฒซ ๋ฒ์งธ ์ธ์๋ key, ๋ ๋ฒ์งธ ์ธ์๋ value
- key-value ์์ JSON ๋ํ๋จผํธ ๋ง๋ค์ด ๋ฐํ
SELECT dept_no, JSON_OBJECTAGG(emp_no, from_date) AS agg_manager
FROM dept_manager
WHERE dept_no IN ('d001', 'd002', 'd003')
GROUP BY dept_no;
+---------+---------------------------------------------------+
| dept_no | agg_manager |
+---------+---------------------------------------------------+
| d001 | {"101": "1990-01-01", "102": "1995-06-15"} |
| d002 | {"201": "1985-03-12"} |
| d003 | {"301": "2000-07-20", "302": "2005-10-10"} |
+---------+---------------------------------------------------+
๐ท JSON_ARRAYAGG()
- ์ฃผ์ด์ง RDBMS ์ปฌ๋ผ์ ๊ฐ์ ์ด์ฉํด JSON ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๋ฐํ
SELECT dept_no, JSON_ARRAYAGG(emp_no) AS agg_manager
FROM dept_manager
WHERE dept_no IN ('d001', 'd002', 'd003')
GROUP BY dept_no;
+---------+-----------------------+
| dept_no | agg_manager |
+---------+-----------------------+
| d001 | [101, 102] |
| d002 | [201] |
| d003 | [301, 302] |
+---------+-----------------------+
โณ๏ธ JSON ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ๋ก ๋ณํ (JSON_TABLE)
๐ท JSON_TABLE()
- JSON ๋ฐ์ดํฐ์ ๊ฐ๋ค์ ๋ชจ์์ RDBMS ํ ์ด๋ธ์ ๋ง๋ค์ด ๋ฐํ
SELECT e2.emp_no, e2.first_name, e2.gender
FROM employee_docs e1,
JSON_TABLE(doc, "$" COLUMNS (emp_no INT PATH "$.emp_no",
gender CHAR(1) PATH "$.gender",
first_name VARCHAR(20) PATH "$.first_name")
) AS e2
WHERE e1.emp_no IN (10001, 10002);
+--------+------------+--------+
| emp_no | first_name | gender |
+--------+------------+--------+
| 10001 | John | M |
| 10002 | Jane | F |
+--------+------------+--------+
์ฐธ๊ณ ์๋ฃ
https://dev.mysql.com/doc/refman/8.4/en/lateral-derived-tables.html