๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/SQL

SQL ํŠœ๋‹ — WHERE ์ ˆ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

๐Ÿ” SQL ํŠœ๋‹ — WHERE ์ ˆ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

WHERE ์ ˆ์€ SQL์—์„œ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง์˜ ํ•ต์‹ฌ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.
์กฐ๊ฑด๋ฌธ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” WHERE ์ ˆ ์ตœ์ ํ™” ๊ธฐ๋ณธ ์›์น™๊ณผ ์‹ค๋ฌด ํŒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 


1. WHERE ์ ˆ์ด ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ์ด์œ 

  • ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ตœ๋Œ€ํ•œ ์ผ์ฐ ์ œ๊ฑฐํ•ด์•ผ ํ•จ
  • WHERE ์กฐ๊ฑด์ด ์ธ๋ฑ์Šค ํ™œ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
  • ์ž˜๋ชป ์ž‘์„ฑ๋œ ์กฐ๊ฑด์€ Full Table Scan ์œ ๋ฐœ

๐Ÿ’ก ๋ชฉํ‘œ: ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ํ–‰๋งŒ ์ฝ์–ด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ


2. ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ์— ํ•จ์ˆ˜ ์‚ฌ์šฉ ํ”ผํ•˜๊ธฐ

-- โŒ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ์˜ˆ์‹œ
SELECT * FROM users WHERE LOWER(name) = 'kim';

-- โœ… ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ
SELECT * FROM users WHERE name = 'Kim';

์ปฌ๋Ÿผ์— ํ•จ์ˆ˜·์—ฐ์‚ฐ์ด ์ ์šฉ๋˜๋ฉด DB๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


3. ๋ณตํ•ฉ ์ธ๋ฑ์Šค ํ™œ์šฉ ์‹œ ์ฃผ์˜์ 

๋ณตํ•ฉ ์ธ๋ฑ์Šค(idx(col1, col2, col3))๋Š” ์™ผ์ชฝ ์ปฌ๋Ÿผ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์กฐ๊ฑด์ด ์žˆ์–ด์•ผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

-- ์ธ๋ฑ์Šค ์‚ฌ์šฉ๋จ
SELECT * FROM orders WHERE col1 = 'A' AND col2 = 'B';

-- ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์•ˆ๋จ (col1 ์กฐ๊ฑด ์—†์Œ)
SELECT * FROM orders WHERE col2 = 'B';

4. ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ์ธ๋ฑ์Šค

  • = , < , > , BETWEEN ์€ ์ธ๋ฑ์Šค ํ™œ์šฉ ๊ฐ€๋Šฅ
  • LIKE๋Š” ์ ‘๋‘์–ด ๊ฒ€์ƒ‰('Kim%')๋งŒ ์ธ๋ฑ์Šค ์‚ฌ์šฉ
  • %๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ('%Kim')
-- โœ… ์ธ๋ฑ์Šค ๊ฐ€๋Šฅ
SELECT * FROM users WHERE name LIKE 'Kim%';

-- โŒ ์ธ๋ฑ์Šค ๋ถˆ๊ฐ€
SELECT * FROM users WHERE name LIKE '%Kim';

5. OR ๋Œ€์‹  UNION ์‚ฌ์šฉ ๊ณ ๋ ค

OR ์กฐ๊ฑด์ด ๋งŽ์œผ๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ๋ฌด์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- โŒ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ
SELECT * FROM orders WHERE status = 'A' OR status = 'B';

-- โœ… ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์œ ๋„
SELECT * FROM orders WHERE status = 'A'
UNION ALL
SELECT * FROM orders WHERE status = 'B';

6. ๋ถˆํ•„์š”ํ•œ ์กฐ๊ฑด ์ œ๊ฑฐ

์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ํ•ญ์ƒ ์ฐธ์ธ ์กฐ๊ฑด์€ ์ œ๊ฑฐํ•˜์—ฌ ์‹คํ–‰ ๊ณ„ํš์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

-- โŒ ๋ถˆํ•„์š” ์กฐ๊ฑด
SELECT * FROM products WHERE price > 0 AND category = 'Book';

-- โœ… ๋‹จ์ˆœํ™”
SELECT * FROM products WHERE category = 'Book';

7. ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ผ์น˜์‹œํ‚ค๊ธฐ

์ปฌ๋Ÿผ๊ณผ ๋น„๊ต๊ฐ’์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ๋‚ด๋ถ€ ๋ณ€ํ™˜์ด ๋ฐœ์ƒํ•ด ์ธ๋ฑ์Šค๋ฅผ ๋ชป ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

-- โŒ price๊ฐ€ NUMBER์ธ๋ฐ ๋ฌธ์ž์—ด ๋น„๊ต
SELECT * FROM products WHERE price = '100';

-- โœ… ํƒ€์ž… ์ผ์น˜
SELECT * FROM products WHERE price = 100;

8. ๋‚ ์งœ ๋น„๊ต ์‹œ ์ฃผ์˜

-- โŒ ์ธ๋ฑ์Šค ๋ถˆ๊ฐ€ (์ปฌ๋Ÿผ ๋ณ€ํ™˜)
SELECT * FROM orders WHERE TO_CHAR(order_date, 'YYYYMMDD') = '20250101';

-- โœ… ์ธ๋ฑ์Šค ๊ฐ€๋Šฅ
SELECT * FROM orders
WHERE order_date >= TO_DATE('2025-01-01', 'YYYY-MM-DD')
  AND order_date <  TO_DATE('2025-01-02', 'YYYY-MM-DD');

9. LIMIT / ROWNUM ์ ๊ทน ํ™œ์šฉ

๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์‹œ WHERE ์ ˆ ํ•„ํ„ฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT * FROM orders
WHERE status = 'SHIPPED'
ORDER BY order_date DESC
FETCH FIRST 20 ROWS ONLY;

โœ… ์š”์•ฝ

  • WHERE ์ ˆ ์กฐ๊ฑด์€ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์ขŒ์šฐ
  • ์ปฌ๋Ÿผ์— ํ•จ์ˆ˜·์—ฐ์‚ฐ ์‚ฌ์šฉ ์ง€์–‘
  • ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ
  • LIKE๋Š” ์ ‘๋‘์–ด ๊ฒ€์ƒ‰๋งŒ ์ธ๋ฑ์Šค ๊ฐ€๋Šฅ
  • ํƒ€์ž… ์ผ์น˜์™€ ๋ถˆํ•„์š” ์กฐ๊ฑด ์ œ๊ฑฐ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”

๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ : SQL ์กฐ์ธ ํŠœ๋‹ ๊ธฐ๋ณธ ์›์น™