๐ 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 ์กฐ์ธ ํ๋ ๊ธฐ๋ณธ ์์น
'ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL ํ๋ โ GROUP BY ์ต์ ํ ๊ธฐ๋ณธ ์์น (1) | 2025.08.13 |
|---|---|
| SQL ํ๋ โ ์กฐ์ธ(Join) ์ต์ ํ ๊ธฐ๋ณธ ์์น (1) | 2025.08.13 |
| SQL ํ๋ ๊ธฐ์ด โ ์คํ ๊ณํ๊ณผ ์ธ๋ฑ์ค ์ดํดํ๊ธฐ (0) | 2025.08.13 |
| GROUP BY vs ์๋์ฐ ํจ์(OVER) ๋น๊ต (1) | 2025.08.11 |
| SQL COUNT() OVER๋ก GROUP BY ์์ด ์ง๊ณํ๊ธฐ (1) | 2025.08.11 |