7. SQL - string

Jasonยท2026๋…„ 1์›” 12์ผ

SQL

๋ชฉ๋ก ๋ณด๊ธฐ
7/47



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,      -- ๋ฐ”์ดํŠธ ์ˆ˜ (ํ•œ๊ธ€ 3byte)
    CHAR_LENGTH(name) AS char_length  -- ๋ฌธ์ž ์ˆ˜
FROM users;
namebyte_lengthchar_length
๊น€์ฒ ์ˆ˜93
Lee Young99

ํฌ์ธํŠธ: ํ•œ๊ธ€์€ LENGTH์™€ CHAR_LENGTH ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฆ„!


2๏ธโƒฃ ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜

SELECT 
    email,
    UPPER(email) AS upper_email,  -- ์ „๋ถ€ ๋Œ€๋ฌธ์ž
    LOWER(email) AS lower_email   -- ์ „๋ถ€ ์†Œ๋ฌธ์ž
FROM users;
emailupper_emaillower_email
lee@NAVER.COMLEE@NAVER.COMlee@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;
nametrimmed
' ๋ฐ•๋ฏผ์ˆ˜ ''๋ฐ•๋ฏผ์ˆ˜'

TRIM ๊ณ ๊ธ‰: ํŠน์ • ๋ฌธ์ž ์ œ๊ฑฐ

-- ํŠน์ • ๋ฌธ์ž ์ œ๊ฑฐ
SELECT TRIM(BOTH '-' FROM '--hello--');  -- 'hello'
SELECT TRIM(LEADING '0' FROM '00123');   -- '123'

4๏ธโƒฃ ๋ฌธ์ž์—ด ์ถ”์ถœ

SUBSTRING (๋ถ€๋ถ„ ๋ฌธ์ž์—ด)

SELECT 
    email,
    SUBSTRING(email, 1, 3) AS first_3,           -- ์ฒ˜์Œ 3๊ธ€์ž
    SUBSTRING(email, -3) AS last_3,              -- ๋งˆ์ง€๋ง‰ 3๊ธ€์ž
    SUBSTRING(email, 1, LOCATE('@', email)-1) AS username  -- @ ์•ž๋ถ€๋ถ„
FROM users;
emailfirst_3last_3username
kim@gmail.comkimcomkim

LEFT / RIGHT

SELECT 
    LEFT(email, 3) AS first_3,   -- ์™ผ์ชฝ์—์„œ 3๊ธ€์ž
    RIGHT(email, 3) AS last_3    -- ์˜ค๋ฅธ์ชฝ์—์„œ 3๊ธ€์ž
FROM users;

5๏ธโƒฃ ๋ฌธ์ž์—ด ์œ„์น˜ ์ฐพ๊ธฐ

LOCATE / POSITION

SELECT 
    email,
    LOCATE('@', email) AS at_position,  -- @ ์œ„์น˜ (1๋ถ€ํ„ฐ ์‹œ์ž‘)
    POSITION('@' IN email) AS at_pos2   -- ๊ฐ™์€ ๊ธฐ๋Šฅ
FROM users;
emailat_position
kim@gmail.com4

ํ™œ์šฉ: ๋„๋ฉ”์ธ ์ถ”์ถœ

SELECT 
    email,
    SUBSTRING(email, LOCATE('@', email) + 1) AS domain
FROM users;
emaildomain
kim@gmail.comgmail.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;
emailsafe_email
kim@gmail.comkim [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;
emailusernamedomain
kim@gmail.comkimgmail.com

๋ณต์žกํ•œ ๋ถ„๋ฆฌ

-- 'a.b.c.d'์—์„œ 'b' ์ถ”์ถœ
SELECT 
    SUBSTRING_INDEX(SUBSTRING_INDEX('a.b.c.d', '.', 2), '.', -1) AS second;
-- ๊ฒฐ๊ณผ: 'b'

9๏ธโƒฃ ํŒจ๋”ฉ (LPAD / RPAD)

์™ผ์ชฝ ์ฑ„์šฐ๊ธฐ

SELECT 
    user_id,
    LPAD(user_id, 5, '0') AS padded_id  -- 5์ž๋ฆฌ, 0์œผ๋กœ ์ฑ„์›€
FROM users;
user_idpadded_id
100001
2300023

์˜ค๋ฅธ์ชฝ ์ฑ„์šฐ๊ธฐ

SELECT RPAD(name, 10, '-') AS padded_name
FROM users;
namepadded_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]', '');
-- ๊ฒฐ๊ณผ: 'abcdef'

-- ์—ฐ์† ๊ณต๋ฐฑ์„ ํ•˜๋‚˜๋กœ
SELECT REGEXP_REPLACE('hello    world', '\\s+', ' ');
-- ๊ฒฐ๊ณผ: 'hello world'

๐ŸŽฏ ์‹ค์ „ ๋ฌธ์ œ

๋ฌธ์ œ 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;
emailmasked_email
kim@gmail.comki*@gmail.com
park@kakao.compa**@kakao.com

๐Ÿ’ก DB๋ณ„ ์ฐจ์ด์ 

๊ธฐ๋ŠฅMySQLPostgreSQLBigQuery
๋ฌธ์ž์—ด ์—ฐ๊ฒฐ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 ์ฒ˜๋ฆฌ โ€” ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ํ•จ์ •๋“ค


๐Ÿ“ ์‹ค๋ฌด ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ์ง€์ €๋ถ„ํ•˜๋‹ค.
๋ฌธ์ž์—ด ํ•จ์ˆ˜๋กœ ์ •์ œํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์‹ค๋ ฅ์ด๋‹ค!

profile
Data Analyst | Thoughts Become Things. ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํ•  ์ˆ˜ ์—†๋‹ค. | www.linkedin.com/in/๋ช…์ˆ˜-์ œ-7ab843200

0๊ฐœ์˜ ๋Œ“๊ธ€