๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ‘ฉ‍๐Ÿ’ป

MySQL/MariaDB์—์„œ ๋™์  SQL(Dynamic SQL) ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ •๋ฆฌ

by chuyj15 2025. 5. 19.
728x90
๋ฐ˜์‘ํ˜•
SMALL

์ฐพ์•„๋ณธ ๊ณ„๊ธฐ

์ฟผ๋ฆฌ ์กฐํšŒ ์‹œ, ์†์„ฑ(์—ด) ๋ช…์„ ๋‚ด๊ฐ€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์„๊นŒ ๊ณ ๋ฏผ์„ ํ•˜๋‹ค๊ฐ€ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. 

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์„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ์–ด, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ž๋™ํ™”, ํ†ต๊ณ„ ๋ฆฌํฌํŠธ, ํ”ผ๋ฒ— ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณ ๊ธ‰ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
LIST