mysql cte

greenTeaΒ·2023λ…„ 8μ›” 12일
0

CTE

🫑CTEλŠ” 곡톡 ν…Œμ΄λΈ” 식 (Common Table Expression)의 μ•½μ–΄λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€ 쿼리λ₯Ό 더 κ°„κ²°ν•˜κ³  가독성 있게 μž‘μ„±ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” SQL의 κΈ°λŠ₯μž…λ‹ˆλ‹€.

μ‚¬μš© 방법은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

WITH temp1 (column1, column2) AS (
  -- CTE의 쿼리 μ •μ˜
  SELECT column1, column2
  FROM temp2 (기쑴에 μžˆλŠ” ν…Œμ΄λΈ” μ‚¬μš©)
)
-- CTEλ₯Ό ν™œμš©ν•œ 쿼리
SELECT * FROM temp1;

πŸ§μœ„μ™€ 같은 과정을 톡해 μž„μ‹œλ‘œ ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2개 μ΄μƒμ˜ cteλ₯Ό λ§Œλ“œλŠ” 방법은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

WITH temp1 (column1, column2) AS (
  -- CTE의 쿼리 μ •μ˜
  SELECT id, user_name
  FROM users
),
temp2 (column1, column2) AS (
  -- CTE의 쿼리 μ •μ˜
  SELECT id, user_name
  FROM users
)
-- CTEλ₯Ό ν™œμš©ν•œ 쿼리
SELECT * FROM temp1,temp2;

Recursive

πŸ₯³Recursiveλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μž¬κ·€λ₯Ό 톡해 데이터λ₯Ό 넣을 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ˜ κ²½μš°λŠ” 1λΆ€ν„° 100κΉŒμ§€μ˜ 숫자λ₯Ό κ°€μ§€λŠ” ν…Œμ΄λΈ”μ„ λ³΄μ—¬μ£ΌλŠ” sqlμž…λ‹ˆλ‹€.

WITH RECURSIVE numbers_cte AS (
  SELECT 1 AS n
  UNION ALL
  SELECT n + 1 FROM numbers_cte WHERE n < 100
)
SELECT n FROM numbers_cte;
  1. select 1 as n을 톡해 nμ΄λΌλŠ” μ»¬λŸΌμ„ 섀정함과 λ™μ‹œμ— 1μ΄λΌλŠ” 데이터λ₯Ό 집어 λ„£μŠ΅λ‹ˆλ‹€.
  2. uninon all μ΄ν›„μ˜ SELECT n + 1 FROM numbers_cte WHERE n < 100 톡해 μž¬κ·€μ μœΌλ‘œ λ‘œμ§μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. μœ„ μ½”λ“œλ₯Ό 톡해 1~100의 μˆ«μžκ°€ n μ»¬λŸΌμ— λ“€μ–΄κ°€κ²Œ λ©λ‹ˆλ‹€.
  3. SELECT n FROM numbers_cteλ₯Ό 톡해 ν•΄λ‹Ή ν…Œμ΄λΈ”μ˜ 값을 λ³΄μ—¬μ€λ‹ˆλ‹€.

😎with recursiveλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μž„μ‹œλ‘œ ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•  수 μžˆμ–΄ νŽΈλ¦¬ν•œ 점이 μžˆμŠ΅λ‹ˆλ‹€. μ μ ˆν•œ λ•Œμ— μ‚¬μš©ν•˜μ‹œλ©΄ 될 것 κ°™μŠ΅λ‹ˆλ‹€.

profile
greenTeaμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€