did_story

[MySQL / DML] SELECT, ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐฉ๋ฒ• ๋ณธ๋ฌธ

BackEnd๐Ÿƒ/DB & SQL

[MySQL / DML] SELECT, ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐฉ๋ฒ•

์–ด์ œ์‹œ์ž‘ 2025. 1. 7. 23:25

ํ•ด๋‹น ๊ธ€์€ ์ €์ž๊ฐ€ ๋” ์ด์ƒ ๋งค๋ฒˆ ์ฐพ์•„๋ณด๊ธฐ ํž˜๋“ค์–ด์„œ(?) ์ •๋ฆฌํ•˜๋Š” ๊ธ€์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค.ใ…Žใ…Ž

SELECT / FROM

SQL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ SELECT A FROM B๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

SQL ๊ตฌ๋ฌธ์€ ์˜์–ด ๋ฌธ๋ฒ•๊ณผ ๋งค์šฐ ๋น„์Šทํ•œ๋ฐ, SELECT(์„ ํƒํ•œ๋‹ค) A๋ฅผ, FROM B(B๋กœ๋ถ€ํ„ฐ)๋ผ๊ณ  ํ•ด์„ํ•˜๋ฉด ์–ด๋А ์ •๋„ ๋ง์ด ๋ฉ๋‹ˆ๋‹ค.

SELECT column1, column2, ...
FROM table_name;

ex) 
SELECT AuthorID, Title, Content, Likes 
FROM Posts;

โ“ ํ•ด์„ : Posts(table)๋กœ๋ถ€ํ„ฐ AuthorID, Title, Content, CreatdAt, Likes๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค!

SELECT * FROM Posts;

โ“ : Posts๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ์—ด(Column)์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค!

* (asterisk) : ์„ ํƒ๋œ tables์˜ ๋ชจ๋“  ๊ฐ’๋“ค์„ ๊ฐ€์ ธ์˜ค๋ ค ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

์ด๊ฒƒ์œผ๋กœ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉฐ… ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ(WHERE, DISTINCT, AS)๋ฅผ ๋ถ™์—ฌ์„œ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ ๋ณด๋„๋ก ํ•˜์ž.

 

1. DISTINCT

DISTINCT๋Š” ์„ ํƒํ•œ ์—ด(Column)์—์„œ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ณ ์œ ํ•œ ๊ฐ’๋“ค๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

SELECT DISTINCT column1
FROM table_name;

ex) 
SELECT DISTINCT AuthorID
FROM Posts;

โ“: Posts ํ…Œ์ด๋ธ”์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š์€ ๊ณ ์œ ํ•œ AuthorID ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

 

DISTINCT์˜ ๋™์ž‘ ๋ฐฉ์‹:

  • DISTINCT๋Š” ์ง€์ •ํ•œ ์—ด์—์„œ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ , ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ, ์ค‘๋ณต ์—ฌ๋ถ€๋Š” ์ง€์ •ํ•œ ์—ด์— ํ•œ์ •๋˜๋ฉฐ, ๋‹ค๋ฅธ ์—ด์€ ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

→ ์˜ˆ๋กœ, Posts ํ…Œ์ด๋ธ”์— ํ–‰(Row)์ด 10๊ฐœ ์žˆ์ง€๋งŒ, AuthorID๊ฐ€ 2๊ฐœ์˜ ๊ณ ์œ ํ•œ ๊ฐ’๋งŒ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ฟผ๋ฆฌ๋Š” 2๊ฐœ์˜ AuthorID ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


WHERE

WHERE ์€ ๊ธฐ๋ก๋“ค์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ˆ์€ ์ง€์ •๋œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ์ถ”์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

SELECT column1, column2, ...
FROM table_name
WHERE condition;

ex)
SELECT *
FROM Posts
WHERE Likes > 1;

โ“: Posts ํ…Œ์ด๋ธ”์—์„œ Likes๊ฐ€ 1๋ณด๋‹ค ๋งŽ์€ ํ–‰(row)์˜ ์ •๋ณด๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  • WHERE๋Š” ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ์„ ํƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • WHERE ์ ˆ์€ SELECT, UPDATE, DELETE ์ฟผ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด์ด ์ฐธ(TRUE)์ธ ํ–‰(Row)๋งŒ ๊ฒฐ๊ณผ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

1. WHERE์˜ ์—ฐ์‚ฐ์ž

์—ฐ์‚ฐ์ž ์„ค๋ช… ์˜ˆ์ œ ์„ค๋ช…
= ๊ฐ’์ด ๊ฐ™์€์ง€ ๋น„๊ต  WHERE Likes = 10  Likes ๊ฐ’์ด 10์ธ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
<> ๋˜๋Š” != ๊ฐ’์ด ๋‹ค๋ฅธ์ง€ ๋น„๊ต  WHERE Likes != 5  Likes ๊ฐ’์ด 5๊ฐ€ ์•„๋‹Œ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
>, >= ๊ฐ’์ด ํฐ์ง€, ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€์ง€ ๋น„๊ต WHERE Likes > 50 Likes ๊ฐ’์ด 50๋ณด๋‹ค ํฐ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
<, <= ๊ฐ’์ด ์ž‘์€์ง€, ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€์ง€ ๋น„๊ต WHERE Likes <= 50 Likes ๊ฐ’์ด 50 ์ดํ•˜(50 ํฌํ•จ)์ธ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
BETWEEN ๊ฐ’์ด ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธ WHERE Likes BETWEEN 10 AND 100 Likes ๊ฐ’์ด 10 ์ด์ƒ 100 ์ดํ•˜์ธ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
IN ๊ฐ’์ด ๋ชฉ๋ก์ค‘์— ํ•˜๋‚˜์™€ ์ผ์น˜ํ•˜๋Š” ์ง€ ํ™•์ธ WHERE PostID IN (11, 12, 13) PostID ๊ฐ’์ด 11, 12, 13 ์ค‘ ํ•˜๋‚˜์ธ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
LIKE ๋ฌธ์ž์—ด ํŽ˜ํ„ด ๋งค์นญ WHERE Title LIKE 'Post%’ Title ๊ฐ’์ด 'Post'๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์ธ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
AND ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ถฉ์กฑ ํ•˜๋Š”์ง€ ํ™•์ธ WHERE Likes > 10 AND Published = 1 Likes ๊ฐ’์ด 10๋ณด๋‹ค ํฌ๊ณ ,
Published ๊ฐ’์ด 1(= true)์ธ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
OR ์—ฌ๋Ÿฌ ์กฐ๊ฑด์ค€ ํ•˜๋‚˜๋ฅผ ์ถฉ์กฑ ํ•˜๋Š”์ง€ ํ™•์ธ WHERE Likes > 10 OR Published = 1 Likes ๊ฐ’์ด 10๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜,
Published ๊ฐ’์ด 1(= true)์ธ ํ–‰(Row)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
IS NULL ๊ฐ’์ด NULL ์ธ์ง€ ํ™•์ธ WHERE UpdatedAt IS NULL UpdatedAt ๊ฐ’์ด NULL(๋น„์–ด ์žˆ์Œ)์ธ ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. NULL์€ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ผ๋ฐ˜์ ์ธ ๋น„๊ต(=)๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
NOT ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ธ์ง€ ํ™•์ธ WHERE UpdatedAt IS NOT NULL UpdatedAt ๊ฐ’์ด NULL์ด ์•„๋‹Œ(๊ฐ’์ด ์žˆ์Œ) ํ–‰(Row)๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

2. Text ์—ฐ์‚ฐ์ž

WHERE์˜ ์—ฐ์‚ฐ์ž๋ฅผ ๋ณด๋ฉด LIKE ์˜ˆ์ œ์—์„œ%'๊ฐ€ ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ์ €๊ฒƒ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…์„ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ‘%' : ํ•ด๋‹น ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ „์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ‘_’ : ํ•˜๋‚˜์˜ ๋ฌธ์ž๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
## ์˜ˆ์ œ! ## 

# 1. Posts table์—์„œ Title์ด 'Post'๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€ ๊ฒ€์ƒ‰
SELECT * FROM Posts
WHERE Title LIKE 'Post%';


# 2. 'Post'๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€ ๊ฒ€์ƒ‰
SELECT * FROM Posts
WHERE Title LIKE '%Post%';

# 3. 'Post'๋ฅผ ํฌํ•จํ•œ ์ •ํ™•ํžˆ 6๊ธ€์ž๋กœ ๋œ ์ œ๋ชฉ์„ ๊ฒ€์ƒ‰
SELECT * FROM Posts
WHERE Title LIKE '_Post_';


# 4. ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'o'์ธ ์ œ๋ชฉ ๊ฒ€์ƒ‰
SELECT * FROM Posts
WHERE Title LIKE '_o%';

# 5. escape
-- % ๋˜๋Š” _ ์•ž์— ๋ฐฑ์Šฌ๋ž˜์‹œ "\"์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.
SELECT * FROM Posts
WHERE Title LIKE '_o\%%\_'; # ex) 'Do% ~~~ _'

# 6. ID๊ฐ€ '1'๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰
-- ๋งŒ์•ฝ ์ˆซ์ž๊ฐ€ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋ฉด, %์™€ _๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์“ด ์ ์ด ์—†์—ˆ๋‹ค..!
SELECT * FROM Stores
WHERE CAST(Address AS CHAR) LIKE '%5_';

ORDER BY

๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (๊ธฐ๋ณธ์€ ์˜ค๋ฆ„์ฐจ์ˆœ!)

  • ASC : ์˜ค๋ฆ„์ฐจ์ˆœ(๊ธฐ๋ณธ๊ฐ’, ์ž‘์€ ๊ฐ’ → ํฐ ๊ฐ’) 
  • DESC : ๋‚ด๋ฆผ์ฐจ์ˆœ(ํฐ ๊ฐ’ → ์ž‘์€ ๊ฐ’)
SELECT * 
FROM Posts 
ORDER BY CreatedAt DESC;

โ“: Posts ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, CreatedAt ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ(์ตœ์‹ ์ˆœ)์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

 

SELECT * 
FROM Posts 
ORDER BY Published DESC, Likes ASC;

โ“: Published๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ ํ›„, ๋™์ผํ•œ Published ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋Š” Likes๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.


LIMIT

๋ฐ˜ํ™˜ํ•  ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

→ โœจ(์ˆ˜์ฒœ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ํฐ ํ…Œ์ด๋ธ”์— ์œ ์šฉ! ๋งŽ์€ ์ˆ˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!)

  • LIMIT {๊ฐ€์ ธ์˜ฌ ๊ฐœ์ˆ˜}
  • LIMIT {๊ฐ€์ ธ์˜ฌ ๊ฐœ์ˆ˜} OFFSET {๊ฑด๋„ˆ๋›ธ ๊ฐœ์ˆ˜}
SELECT * FROM Posts
LIMIT 5;

โ“: Posts table์—์„œ 5๊ฐœ์˜ ํ–‰(Row)๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT * FROM Posts
ORDER BY CreatedAt DESC
LIMIT 5 OFFSET 3;

โ“: Posts table์—์„œ ์ฒ˜์Œ 3๊ฐœ์˜ ํ–‰์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๊ทธ๋‹ค์Œ 5๊ฐœ์˜ ํ–‰(Row)๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.