SQL

[SQL] ์ฟผ๋ฆฌ ํŠœ๋‹ ์ •๋ฆฌ

2025. 10. 17. 14:07
๐Ÿ“Œ ์ฐธ๊ณ ์‚ฌํ•ญ
  • Postgresql ์œ„์ฃผ๋กœ ์ž‘์„ฑ

์ฟผ๋ฆฌ ํŠœ๋‹์„ ํ•˜๊ฒŒ๋œ ์ด์œ 

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์ค‘ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๋Š˜์–ด๋‚œ ๋ฐ์ดํ„ฐ๋กœ ์ธํ•ด ์‹œ์Šคํ…œ ๋ชฉ๋ก ์กฐํšŒํ• ๋•Œ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ํ˜„์ƒ๋ฐœ๊ฒฌ

 

์›์ธ

1. ๊ณผ๋„ํ•œ JOIN ์œผ๋กœ ์ธํ•œ ์›์ธ

2. WHERE ์ ˆ์— LIKE๋ฌธ์„ ์•ž๋’ค๋กœ % ๋ถ™์—ฌ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ์›์ธ

3. ํŠน์ • ์กฐ๊ฑด์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ํ…Œ์ด๋ธ” JOIN์œผ๋กœ ์ธํ•œ ์›์ธ

4. ๊ณผ๋„ํ•œ ์ง‘๊ณ„ํ•จ์ˆ˜ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ์›์ธ

 

ํ•ด๊ฒฐ

1. WITH์ ˆ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค ์ ์šฉ๋˜๋Š” ์‹คํ–‰ ์šฐ์„ ์ˆœ์œ„๋ณ„๋กœ ์ชผ๊ฐœ์„œ ํ•ด๊ฒฐ

โ‰ซ ์›๋ณธ

SELECT *
FROM A a 
JOIN B b ON a.id = b.id 
JOIN C c ON a.id = c.id 
...
WHERE a.id = 'A' 
...
LIMIT 10 OFFSET 0

โ‰ซ ์ˆ˜์ •๋ณธ

WITH withA AS (
  SELECT a.id, COUNT(a.id) AS a_cnt
  FROM A a
  WHERE a.id = 'A'
  ...
  GROUP BY a.id
)
SELECT *
FROM withA wa
JOIN B b ON wa.id = b.id
...
LIMIT 10 OFFSET 0

 

2. WHERE ์ ˆ ์กฐ๊ฑด์— ์ธ๋ฑ์Šค ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ • (์•ž์— % ์ œ๊ฑฐ)

โ‰ซ ์›๋ณธ

SELECT * FROM TEST
WHERE test_name like '%ํ…Œ์ŠคํŠธ%'

โ‰ซ ์ˆ˜์ •๋ณธ

SELECT * FROM TEST
WHERE test_name like 'ํ…Œ์ŠคํŠธ%'

 

3. ํŠน์ • ์กฐ๊ฑด์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ” ์กฐ๊ฑด ์กฐํšŒํ• ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋ถ„๋ฆฌ

โ‰ซ ์›๋ณธ

SELECT test_id, test_name
FROM TEST t
LEFT JOIN T_USER tu ON t.test_id = tu.test_id
WHERE t.test_name like 'ํ…Œ์ŠคํŠธ%'
<if test="userName != null and userName != ''">
AND tu.user_name = #{userName}
</if>

โ‰ซ ์ˆ˜์ •๋ณธ

SELECT test_id, test_name
FROM TEST t
WHERE t.test_name like 'ํ…Œ์ŠคํŠธ%'
<if test="userName != null and userName != ''">
AND EXIST (
    SELECT 1
    FROM T_USER tu
    WHERE tu.test_id = t.test_id
    AND tu.user_name = #{userName}
)
</if>