์ฐพ์๋ณธ ๊ณ๊ธฐ
์ฟผ๋ฆฌ ์กฐํ ์, ์์ฑ(์ด) ๋ช ์ ๋ด๊ฐ ์ง์ ํ ์ ์์๊น ๊ณ ๋ฏผ์ ํ๋ค๊ฐ ์ฐพ์๋ณด์์ต๋๋ค.
heidi sql๋ก ์คํ ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ฑ์ ๋ ์ง๊ฐ ๋์ค๋๋ก ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ง๋ณด์์ต๋๋ค.

๋์ SQL์ SQL๋ฌธ ์์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ง๋ค์ด ์คํํ๋ ๊ธฐ๋ฒ์
๋๋ค.
๋ณต์กํ ์กฐ๊ฑด ์ฒ๋ฆฌ๋ ํผ๋ฒ ์ฟผ๋ฆฌ, ์กฐ๊ฑด๋ฌธ์ด ๋ง์์ง๋ ํต๊ณ/๋ฆฌํฌํธ ์ฟผ๋ฆฌ์์ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฐ์
๋๋ค.
MySQL/MariaDB์์๋ ์ด๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค:
PREPARE / EXECUTE / DEALLOCATE
๐ ์ฌ์ฉ ์๋๋ฆฌ์ค
- ์ด(column)์ ์ด๋ฆ์ด๋ ๊ฐ์๊ฐ ๋์ ์ผ๋ก ๋ฐ๋๋ ๊ฒฝ์ฐ
- ๋ฐ๋ณต๋๋ ์กฐ๊ฑด์ ๊ฐ์ง ์ฟผ๋ฆฌ๋ฅผ ์๋ ์์ฑํ๊ณ ์ถ์ ๋
- ๋์ ์ผ๋ก ์กฐํฉํ SQL์ ๋ฌธ์์ด ๋ณ์๋ก ๊ตฌ์ฑํด์ ์คํํ๊ณ ์ถ์ ๋
์: ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ํผ๋ฒ ํ ์ด๋ธ์ ๋ง๋ค๊ณ ์ถ์ ๋
โ ์ฃผ์ ๋ฌธ๋ฒ ๊ตฌ์กฐ
1. SET @sql = '์ฟผ๋ฆฌ ๋ฌธ์์ด';
- SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ์์ด ๋ณ์๋ก ์ ์ฅํฉ๋๋ค.
- ๋ณ์ ์ด๋ฆ์ ๋ณดํต @sql ๋๋ @query ๋ฑ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
SET @sql = 'SELECT * FROM tb_user WHERE company_id = 42';
2. PREPARE stmt FROM @sql;
- @sql์ ๋ด๊ธด ์ฟผ๋ฆฌ๋ฅผ ์คํ ๊ฐ๋ฅํ ์ํ๋ก "์ค๋น(prepared)" ์ํต๋๋ค.
- stmt๋ prepared statement ์ด๋ฆ์ด๋ฉฐ ์์ ๋กญ๊ฒ ์ ํ ์ ์์ต๋๋ค.
PREPARE stmt FROM @sql;
3. EXECUTE stmt;
- ์ค๋นํ statement๋ฅผ ์คํํฉ๋๋ค.
EXECUTE stmt;
4. DEALLOCATE PREPARE stmt;
- ์ฌ์ฉ์ด ๋๋ statement๋ ๋ฐ๋์ ํด์ (์ญ์ ) ํด์ผ ํฉ๋๋ค.
- ์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์์ฌ์ ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํฉ๋๋ค.
DEALLOCATE PREPARE stmt;
๐ ์ ์ฒด ์์ ์ฝ๋
-- 1. GROUP_CONCAT ๊ธธ์ด ๋๋ฆฌ๊ธฐ (๋์ SQL์ด ๊ธธ์ด์ง ์ ์์ผ๋ฏ๋ก)
SET SESSION group_concat_max_len = 1000000;
-- 2. ์ฟผ๋ฆฌ ๋ฌธ์์ด ์์ฑ
SET @sql = 'SELECT user_id, user_name FROM tb_user WHERE company_id = 42';
-- 3. ์คํ ์ค๋น
PREPARE stmt FROM @sql;
-- 4. ์คํ
EXECUTE stmt;
-- 5. ์์ ํด์
DEALLOCATE PREPARE stmt;
๐งช ์ค์ ์์: ๋ ์ง๋ณ ๊ทผ๋ฌด์ ์ ํผ๋ฒ ๋ง๋ค๊ธฐ
-- ๋ ์ง๋ณ ์ด์ ์๋ ์์ฑํ์ฌ ํ๋์ SELECT ๋ฌธ์ผ๋ก ๋ง๋ค์ด๋
SELECT
GROUP_CONCAT(
DISTINCT CONCAT(
'SUM(CASE WHEN work_date = ''',
work_date,
''' THEN 1 ELSE 0 END) AS `',
work_date, '`'
)
) INTO @sql
FROM tb_work_log
WHERE work_date BETWEEN '2025-05-01' AND '2025-05-09';
-- ์ฟผ๋ฆฌ ๋ฌธ์์ด ์กฐ๋ฆฝ
SET @sql = CONCAT('
SELECT COUNT(*) AS ์ด_์ธ์, ', @sql, '
FROM tb_work_log
WHERE company_id = 42
');
-- ์คํ
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
์ด๋ ๊ฒ ํ๋ฉด ๋ ์ง๋ณ ๊ทผ๋ฌด์ ์๋ฅผ ๊ฐ๊ฐ์ ์ด(column)๋ก ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์คํํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ) SQL ๋ด๋ถ ๋ฌธ์์ด์์๋ ์์๋ฐ์ดํ ' → '' ๋ ๊ฐ๋ก ์ ์ด์ผ ํฉ๋๋ค.
๋ฐฑํฑ(`)์ ์ปฌ๋ผ๋ช ์ผ๋ก ์์ ํ๊ฒ ์ธ์๋ฉ๋๋ค.
๐ง ํ: ๋ฌธ์ ํด๊ฒฐ ์ฒดํฌ๋ฆฌ์คํธ
| @sql ๋ด์ฉ ํ์ธ | SELECT @sql; |
| ์ธ์ ์ด ์ ์ง๋๊ณ ์๋๊ฐ? | PREPARE, EXECUTE๋ ๊ฐ์ ์ธ์ ์์ ์คํํด์ผ ํจ |
| group_concat_max_len | ๋์ ์ฟผ๋ฆฌ๊ฐ ๊ธธ์ด์ง๋ฉด ๊ธฐ๋ณธ ๊ธธ์ด(1024) ์ด๊ณผ ์ฃผ์ |
| ๊ตฌ๋ฌธ ์ค๋ฅ ์ฌ๋ถ | SQL ์กฐ๋ฆฝ ์ CONCAT, ๋ฐ์ดํ ์ฒ๋ฆฌ ์ ์คํ |
โ ๋ง๋ฌด๋ฆฌ ์์ฝ
| SET @sql = '...' | ์คํํ SQL์ ๋ฌธ์์ด๋ก ์ ์ฅ |
| PREPARE stmt FROM @sql | SQL์ ์คํ ๊ฐ๋ฅํ ํํ๋ก ์ค๋น |
| EXECUTE stmt | ์ค๋น๋ SQL ์คํ |
| DEALLOCATE PREPARE stmt | ์์ ํด์ (ํ์!) |
๋์ SQL์ ํ์ฉํ๋ฉด SQL์ ์ฝ๋์ฒ๋ผ ์กฐ๋ฆฝํ ์ ์์ด, ๋ณต์กํ ์ฟผ๋ฆฌ ์๋ํ, ํต๊ณ ๋ฆฌํฌํธ, ํผ๋ฒ ์ฒ๋ฆฌ ๋ฑ ๋ค์ํ ๊ณ ๊ธ ์ฟผ๋ฆฌ ์์ฑ์ด ๊ฐ๋ฅํด์ง๋๋ค.
'๊ฐ๋ฐ ์ผ์ง ๐ฉโ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Hex ๋ฌธ์์ด์ UTF8๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ (2) | 2025.05.20 |
|---|---|
| 16์ง์์์ 0x1 ์ด๋ ๋ญ๊น? (1) | 2025.05.20 |
| Java Stream์ ํ์ฉํ "๊ฐ์ฒด๋ฅผ Map์ผ๋ก ๊ทธ๋ฃนํ" ๋ก์ง ์ ๋ฆฌ (4) | 2025.05.19 |
| Spring Boot ์ ์ ์์ ์บ์ฑ ๋ฌธ์ ๋ฐ ํด๊ฒฐ ๋ฐฉ์ (2) | 2025.05.15 |
| HeidiSQL์ ์ฌ์ฉํด์ MariaDB์ ๋ค๋ฅธ IP์์ ์ ์ํ ์ ์๋๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ (2) | 2025.05.14 |