


SQL ๋ฌธ์์ด ํจ์ โ ๋ฐ์ดํฐ ์ ์ ์ ๊ธฐ๋ณธ
๐ก ์ง์ ๋ถํ ๋ฐ์ดํฐ๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํ๋ ๋ฌธ์์ด ํจ์๋ฅผ ์ ๋ฆฌํ๋ค.
๐ค ์ธ์ ์ฐ๋?
- ์ด๋ฆ์์ ์ฑ๋ง ์ถ์ถ
- ์ด๋ฉ์ผ์์ ๋๋ฉ์ธ ์ถ์ถ
- ๊ณต๋ฐฑ ์ ๊ฑฐ
- ๋์๋ฌธ์ ํต์ผ
- ๋ฐ์ดํฐ ํฉ์น๊ธฐ
โ ์ค๋ฌด ๋ฐ์ดํฐ๋ ์ง์ ๋ถํจ. ์ ์ ํ์!
๐ ์์ ํ
์ด๋ธ
[users]
| user_id | name | email |
|---------|------|-------|
| 1 | ๊น์ฒ ์ | kim@gmail.com |
| 2 | Lee Young | lee@NAVER.COM |
| 3 | ๋ฐ๋ฏผ์ | park@kakao.com |
| 4 | ์ต์ง์ | choi@Company.co.kr |
1๏ธโฃ ๋ฌธ์์ด ๊ธธ์ด
SELECT
name,
LENGTH(name) AS byte_length,
CHAR_LENGTH(name) AS char_length
FROM users;
| name | byte_length | char_length |
|---|
| ๊น์ฒ ์ | 9 | 3 |
| Lee Young | 9 | 9 |
ํฌ์ธํธ: ํ๊ธ์ LENGTH์ CHAR_LENGTH ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฆ!
2๏ธโฃ ๋์๋ฌธ์ ๋ณํ
SELECT
email,
UPPER(email) AS upper_email,
LOWER(email) AS lower_email
FROM users;
| email | upper_email | lower_email |
|---|
| lee@NAVER.COM | LEE@NAVER.COM | lee@naver.com |
ํ์ฉ: ๋์๋ฌธ์ ๋ฌด์ํ๊ณ ๋น๊ต
SELECT * FROM users
WHERE LOWER(email) = LOWER('Lee@Naver.com');
3๏ธโฃ ๊ณต๋ฐฑ ์ ๊ฑฐ (TRIM)
SELECT
name,
TRIM(name) AS trimmed,
LTRIM(name) AS left_trimmed,
RTRIM(name) AS right_trimmed
FROM users;
| name | trimmed |
|---|
| ' ๋ฐ๋ฏผ์ ' | '๋ฐ๋ฏผ์' |
TRIM ๊ณ ๊ธ: ํน์ ๋ฌธ์ ์ ๊ฑฐ
SELECT TRIM(BOTH '-' FROM '--hello--');
SELECT TRIM(LEADING '0' FROM '00123');
4๏ธโฃ ๋ฌธ์์ด ์ถ์ถ
SUBSTRING (๋ถ๋ถ ๋ฌธ์์ด)
SELECT
email,
SUBSTRING(email, 1, 3) AS first_3,
SUBSTRING(email, -3) AS last_3,
SUBSTRING(email, 1, LOCATE('@', email)-1) AS username
FROM users;
| email | first_3 | last_3 | username |
|---|
| kim@gmail.com | kim | com | kim |
LEFT / RIGHT
SELECT
LEFT(email, 3) AS first_3,
RIGHT(email, 3) AS last_3
FROM users;
5๏ธโฃ ๋ฌธ์์ด ์์น ์ฐพ๊ธฐ
LOCATE / POSITION
SELECT
email,
LOCATE('@', email) AS at_position,
POSITION('@' IN email) AS at_pos2
FROM users;
| email | at_position |
|---|
| kim@gmail.com | 4 |
ํ์ฉ: ๋๋ฉ์ธ ์ถ์ถ
SELECT
email,
SUBSTRING(email, LOCATE('@', email) + 1) AS domain
FROM users;
| email | domain |
|---|
| kim@gmail.com | gmail.com |
6๏ธโฃ ๋ฌธ์์ด ์ฐ๊ฒฐ
CONCAT
SELECT
CONCAT(name, ' (', email, ')') AS full_info
FROM users;
| full_info |
|---|
| ๊น์ฒ ์ (kim@gmail.com) |
CONCAT_WS (๊ตฌ๋ถ์ ํฌํจ)
SELECT
CONCAT_WS(', ', name, email, user_id) AS info
FROM users;
| info |
|---|
| ๊น์ฒ ์, kim@gmail.com, 1 |
์ฅ์ : NULL์ด ์์ด๋ ๋ฌด์ํ๊ณ ์ฐ๊ฒฐ!
7๏ธโฃ ๋ฌธ์์ด ์นํ
REPLACE
SELECT
email,
REPLACE(email, '@', ' [at] ') AS safe_email,
REPLACE(name, ' ', '') AS no_space
FROM users;
| email | safe_email |
|---|
| kim@gmail.com | kim [at] gmail.com |
ํ์ฉ: ๋ฐ์ดํฐ ์ ์
SELECT REPLACE(phone, '-', '') AS clean_phone
FROM users;
SELECT REPLACE(REPLACE(text, '\n', ' '), '\t', ' ') AS cleaned
FROM documents;
8๏ธโฃ ๋ฌธ์์ด ๋ถ๋ฆฌ (SUBSTRING_INDEX)
MySQL
SELECT
email,
SUBSTRING_INDEX(email, '@', 1) AS username,
SUBSTRING_INDEX(email, '@', -1) AS domain
FROM users;
| email | username | domain |
|---|
| kim@gmail.com | kim | gmail.com |
๋ณต์กํ ๋ถ๋ฆฌ
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX('a.b.c.d', '.', 2), '.', -1) AS second;
9๏ธโฃ ํจ๋ฉ (LPAD / RPAD)
์ผ์ชฝ ์ฑ์ฐ๊ธฐ
SELECT
user_id,
LPAD(user_id, 5, '0') AS padded_id
FROM users;
| user_id | padded_id |
|---|
| 1 | 00001 |
| 23 | 00023 |
์ค๋ฅธ์ชฝ ์ฑ์ฐ๊ธฐ
SELECT RPAD(name, 10, '-') AS padded_name
FROM users;
| name | padded_name |
|---|
| ๊น์ฒ ์ | ๊น์ฒ ์------- |
๐ ์ ๊ท์ (REGEXP)
ํจํด ๋งค์นญ
SELECT * FROM users
WHERE name REGEXP '^[0-9]';
SELECT * FROM users
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
REGEXP_REPLACE (MySQL 8.0+)
SELECT REGEXP_REPLACE('abc123def456', '[0-9]', '');
SELECT REGEXP_REPLACE('hello world', '\\s+', ' ');
๐ฏ ์ค์ ๋ฌธ์
๋ฌธ์ 1: ๋๋ฉ์ธ๋ณ ์ ์ ์
์ด๋ฉ์ผ ๋๋ฉ์ธ๋ณ ์ ์ ์๋ฅผ ๊ตฌํ์ธ์.
์ ๋ต ๋ณด๊ธฐ
SELECT
LOWER(SUBSTRING_INDEX(email, '@', -1)) AS domain,
COUNT(*) AS user_count
FROM users
GROUP BY LOWER(SUBSTRING_INDEX(email, '@', -1))
ORDER BY user_count DESC;
๋ฌธ์ 2: ์ด๋ฆ ์ ์
์ด๋ฆ์์ ์๋ค ๊ณต๋ฐฑ ์ ๊ฑฐํ๊ณ , ์ ๋ถ ๋๋ฌธ์๋ก ๋ณํํ์ธ์.
์ ๋ต ๋ณด๊ธฐ
SELECT
name AS original,
UPPER(TRIM(name)) AS cleaned
FROM users;
๋ฌธ์ 3: ๋ง์คํน ์ฒ๋ฆฌ
์ด๋ฉ์ผ์ username ๋ถ๋ถ์ ์ 2๊ธ์๋ง ๋ณด์ด๊ณ ๋๋จธ์ง๋ *๋ก ๋ง์คํนํ์ธ์.
์ ๋ต ๋ณด๊ธฐ
SELECT
email,
CONCAT(
LEFT(SUBSTRING_INDEX(email, '@', 1), 2),
REPEAT('*', CHAR_LENGTH(SUBSTRING_INDEX(email, '@', 1)) - 2),
'@',
SUBSTRING_INDEX(email, '@', -1)
) AS masked_email
FROM users;
| email | masked_email |
|---|
| kim@gmail.com | ki*@gmail.com |
| park@kakao.com | pa**@kakao.com |
๐ก DB๋ณ ์ฐจ์ด์
| ๊ธฐ๋ฅ | MySQL | PostgreSQL | BigQuery |
|---|
| ๋ฌธ์์ด ์ฐ๊ฒฐ | CONCAT() | ` | |
| ๋ถ๋ถ ๋ฌธ์์ด | SUBSTRING() | SUBSTRING() | SUBSTR() |
| ์์น ์ฐพ๊ธฐ | LOCATE() | POSITION() | STRPOS() |
| ๋ถ๋ฆฌ | SUBSTRING_INDEX() | SPLIT_PART() | SPLIT() |
BigQuery ์์
SELECT SPLIT(email, '@')[OFFSET(0)] AS username;
SELECT STRPOS(email, '@') AS at_position;
๐ ํต์ฌ ์ ๋ฆฌ
[๊ธธ์ด]
LENGTH(), CHAR_LENGTH()
[๋ณํ]
UPPER(), LOWER(), TRIM()
[์ถ์ถ]
SUBSTRING(str, start, length)
LEFT(str, n), RIGHT(str, n)
[์์น]
LOCATE(์ฐพ์๋ฌธ์, ๋ฌธ์์ด)
[์ฐ๊ฒฐ]
CONCAT(), CONCAT_WS(๊ตฌ๋ถ์, ...)
[์นํ]
REPLACE(str, from, to)
[๋ถ๋ฆฌ]
SUBSTRING_INDEX(str, ๊ตฌ๋ถ์, n)
๐ ๋ค์ ํฌ์คํธ
[SQL ์๋ฆฌ์ฆ #8] NULL ์ฒ๋ฆฌ โ ์ค์ํ๊ธฐ ์ฌ์ด ํจ์ ๋ค
๐ ์ค๋ฌด ๋ฐ์ดํฐ๋ ํญ์ ์ง์ ๋ถํ๋ค.
๋ฌธ์์ด ํจ์๋ก ์ ์ ํ๋ ๋ฅ๋ ฅ์ด ์ค๋ ฅ์ด๋ค!