๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/[์‚ผ์ •KPMG]ESG ๋ฐ์ดํ„ฐ ํ™œ์šฉ ํ’€์Šคํ… ๊ฐœ๋ฐœ

15์ผ์ฐจ. SQL์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

by GreenJin_S2 2025. 10. 29.

 

 

select๊ฐ€ return


SELECT *
FROM team
ORDER BY team_name COLLATE korean ASC;

๐Ÿงฉ ๊ตฌ๋ฌธ๋ณ„ ์ƒ์„ธ ์„ค๋ช…

1๏ธโƒฃ SELECT *

  • SELECT: ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ(๊ฒ€์ƒ‰) ํ•˜๊ฒ ๋‹ค๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.
  • * (asterisk, ๋ณ„ํ‘œ): “๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์„ ํƒ”ํ•œ๋‹ค๋Š” ๋œป์ด์—์š”.
    ์ฆ‰, ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ชจ๋“  ์—ด(์˜ˆ: id, team_name, city, score ๋“ฑ)์„ ์ „๋ถ€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๐Ÿ“˜ ์˜ˆ์‹œ
SELECT team_name FROM team;
→ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด team_name ์—ด๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
SELECT * FROM team;
→ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ์—ด์„ ๋‹ค ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.


2๏ธโƒฃ FROM team

  • FROM: ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • team: ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์ฆ‰,

"team์ด๋ผ๋Š” ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€๋ผ"
๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.


3๏ธโƒฃ ORDER BY team_name

  • ORDER BY: ์กฐํšŒ๋œ ๊ฒฐ๊ณผ๋ฅผ ํŠน์ • ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋ผ๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.
  • team_name: ์ •๋ ฌ ๊ธฐ์ค€์ด ๋˜๋Š” ์ปฌ๋Ÿผ(์—ด)์ž…๋‹ˆ๋‹ค.

์ฆ‰,

“ํŒ€ ์ด๋ฆ„(team_name) ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋ผ”
๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.


4๏ธโƒฃ COLLATE korean

  • COLLATE: ๋ฌธ์ž์—ด ๋น„๊ต ๋ฐ ์ •๋ ฌ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™(์ •๋ ฌ ๋ฐฉ์‹) ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • korean: ํ•œ๊ธ€ ์ •๋ ฌ ๊ทœ์น™์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๐Ÿ“˜ ์™œ ํ•„์š”ํ•˜๋ƒ๋ฉด?
์˜๋ฌธ, ์ˆซ์ž, ํ•œ๊ธ€ ๋“ฑ ์–ธ์–ด๋งˆ๋‹ค ์ •๋ ฌ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.
์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋ณธ ์„ค์ •์ด ์˜์–ด ์ •๋ ฌ์ด๋ฉด, ๊ฐ€, ๋‚˜, ๋‹ค ์ˆœ์„œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ COLLATE korean์„ ์ง€์ •ํ•˜๋ฉด “๊ฐ€๋‚˜๋‹ค ์ˆœ”์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.


5๏ธโƒฃ ASC

  • ASC (Ascending): ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • A → Z, ๊ฐ€ → ํ•˜, ์ž‘์€ ์ˆ˜ → ํฐ ์ˆ˜ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์€ DESC (Descending) ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“˜ ์˜ˆ์‹œ
ASC: ๊ฐ€๋‚˜๋‹ค์ˆœ, 1→2→3
DESC: ํ•˜๋‚˜๋‹ค์ˆœ, 3→2→1

 


SELECT c.Customer ID

FROM Customers c

 


SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

 

ํ•œ ์ค„ ์š”์•ฝ

Orders ํ…Œ์ด๋ธ”๊ณผ Customers ํ…Œ์ด๋ธ”์„
CustomerID ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐํ•ด์„œ,
์ฃผ๋ฌธ ๋ฒˆํ˜ธ(OrderID), ๊ณ ๊ฐ ์ด๋ฆ„(CustomerName), ์ฃผ๋ฌธ ๋‚ ์งœ(OrderDate)๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.

 


SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);

 

 

โœ… ์ •๋ฆฌ: SQL ์‹คํ–‰ ์ˆœ์„œ

SQL ๋ฌธ์žฅ์€ ์šฐ๋ฆฌ๊ฐ€ ์ ๋Š” ์ˆœ์„œ์™€ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š” ๐Ÿ‘‡

์‹คํ–‰ ์ˆœ์„œ์ ˆ(Clause)์—ญํ• 
1 FROM ํ…Œ์ด๋ธ” ์ง€์ •
2 WHERE ์กฐ๊ฑด์œผ๋กœ ํ–‰ ํ•„ํ„ฐ๋ง
3 GROUP BY ๊ทธ๋ฃน ๋ฌถ๊ธฐ
4 HAVING ๊ทธ๋ฃน์— ์กฐ๊ฑด ๊ฑธ๊ธฐ (WHERE์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๊ทธ๋ฃน์šฉ)
5 SELECT ์ปฌ๋Ÿผ ์„ ํƒ
6 ORDER BY ์ •๋ ฌ

๐Ÿ’ก ์š”์•ฝํ•˜์ž๋ฉด

SQL์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š”
“์–ด๋””์„œ(FROM) → ์–ด๋–ค ์กฐ๊ฑด์œผ๋กœ(WHERE) → ์–ด๋–ป๊ฒŒ ๋ฌถ๊ณ (GROUP BY) → ๋ฌด์—‡์„ ๋ณด์—ฌ์ฃผ๊ณ (SELECT) → ์–ด๋–ค ์ˆœ์„œ๋กœ(ORDER BY)”
๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

 

 


 

SELECT player_name
FROM player
WHERE team_id = 'K02' 
  AND position = 'GK';

 

WHERE team_id = 'K02' AND position = 'GK'

  • ์˜๋ฏธ: ์กฐ๊ฑด์„ ์„ค์ •ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
  • team_id = 'K02' → team_id ์ปฌ๋Ÿผ ๊ฐ’์ด 'K02'์ธ ์„ ์ˆ˜๋งŒ ์„ ํƒ
  • position = 'GK' → position ์ปฌ๋Ÿผ ๊ฐ’์ด 'GK'์ธ ์„ ์ˆ˜๋งŒ ์„ ํƒ
  • AND → ๋‘ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•ด์•ผ ํ•จ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ 'K02'ํŒ€์˜ ๊ณจํ‚คํผ(GK) ์„ ์ˆ˜๋งŒ ์กฐํšŒ๋ฉ๋‹ˆ๋‹ค.

-- SQL_TEST_006
-- ์ˆ˜์›ํŒ€(ID: K02) ์„ ์ˆ˜๋“ค ์ด๋ฆ„,
-- ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ ๋ฆฌ์ŠคํŠธ (๋‹จ์œ„ cm ์™€ kg  ์‚ฝ์ž…)
-- ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ๊ฐ€ ์—†์œผ๋ฉด "0" ํ‘œ์‹œ
-- ํ‚ค ๋‚ด๋ฆผ์ฐจ์ˆœ

 

SELECT 
    player_name AS ์„ ์ˆ˜๋ช…,

player_name AS ์„ ์ˆ˜๋ช…player_name ์ปฌ๋Ÿผ์„ "์„ ์ˆ˜๋ช…" ์œผ๋กœ ์ถœ๋ ฅ


    COALESCE(height::TEXT, '0') || 'cm' AS ํ‚ค,
    COALESCE(weight::TEXT, '0') || 'kg' AS ๋ชธ๋ฌด๊ฒŒ

COALESCE(height::TEXT, '0')

height๊ฐ€ NULL์ด๋ฉด '0'์œผ๋กœ ๋Œ€์ฒด

 

::TEXT

์ •์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ (175 → "175")

 

AS ํ‚ค

๊ฒฐ๊ณผ ์ปฌ๋Ÿผ ์ด๋ฆ„ ์ง€์ •


FROM player

player ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์˜ด


WHERE team_id = 'K02'

์ˆ˜์›ํŒ€๋งŒ ํ•„ํ„ฐ๋ง


ORDER BY height DESC NULLS LAST;

 

ํ‚ค ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

 

NULLS LAST

NULL ๊ฐ’์€ ๋งจ ์•„๋ž˜๋กœ

 



-- SQL_TEST_007
-- ์ˆ˜์›ํŒ€(ID: K02) ์„ ์ˆ˜๋“ค ์ด๋ฆ„,
-- ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ ๋ฆฌ์ŠคํŠธ (๋‹จ์œ„ cm ์™€ kg  ์‚ฝ์ž…)
-- ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ๊ฐ€ ์—†์œผ๋ฉด "0" ํ‘œ์‹œ
-- BMI์ง€์ˆ˜
-- ํ‚ค ๋‚ด๋ฆผ์ฐจ์ˆœ

 

SELECT 
    player_name AS ์„ ์ˆ˜๋ช…,

player_name AS ์„ ์ˆ˜๋ช…player_name ์ปฌ๋Ÿผ์„ "์„ ์ˆ˜๋ช…" ์œผ๋กœ ์ถœ๋ ฅ


    COALESCE(height::TEXT, '0') || 'cm' AS ํ‚ค,
    COALESCE(weight::TEXT, '0') || 'kg' AS ๋ชธ๋ฌด๊ฒŒ,

 

COALESCE(height::TEXT, '0')

height๊ฐ€ NULL์ด๋ฉด '0'์œผ๋กœ ๋Œ€์ฒด

 

::TEXT

์ •์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ (175 → "175")

 

AS ํ‚ค

๊ฒฐ๊ณผ ์ปฌ๋Ÿผ ์ด๋ฆ„ ์ง€์ •

 


    CASE  

CASE ... END

์กฐ๊ฑด๋ฌธ (if-else)


        WHEN height IS NULL OR weight IS NULL OR height = 0 THEN '0.00'

ํ‚ค๋‚˜ ๋ชธ๋ฌด๊ฒŒ ์—†์œผ๋ฉด 0.00


        ELSE ROUND((weight / ((height::NUMERIC/100)^2))::NUMERIC, 2)::TEXT

height::NUMERIC

์ •์ˆ˜๋ฅผ ์‹ค์ˆ˜ํ˜•์œผ๋กœ ๋ณ€ํ™˜ (๊ณ„์‚ฐ ์œ„ํ•ด)

 

(height/100)^2

์ œ๊ณฑ ๊ณ„์‚ฐ → 1.75^2

 

weight / (...)

BMI = kg / (m²)

 

ROUND(..., 2)

์†Œ์ˆ˜์  2์ž๋ฆฌ ๋ฐ˜์˜ฌ๋ฆผ

 

::TEXT

์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ (์ถœ๋ ฅ์šฉ)

 

AS BMI

์ปฌ๋Ÿผ ์ด๋ฆ„


    END AS BMI

 

FROM player
WHERE team_id = 'K02'
ORDER BY height DESC NULLS LAST;




--SQL_TEST_008
-- ์ˆ˜์›ํŒ€(ID: K02) ๊ณผ ๋Œ€์ „ํŒ€(ID:  K10)์„ ์ˆ˜๋“ค ์ค‘
-- ํฌ์ง€์…˜์ด GK ์ธ ์„ ์ˆ˜
-- ํŒ€๋ช…, ์‚ฌ๋žŒ๋ช… ์˜ค๋ฆ„์ฐจ์ˆœ

 

SELECT 
    t.team_name AS ํŒ€๋ช…,
    p.player_name AS ์„ ์ˆ˜๋ช…
FROM player p

player ํ…Œ์ด๋ธ”์„ p๋ผ๋Š” ๋ณ„์นญ์œผ๋กœ


JOIN team t ON p.team_id = t.team_id

 

JOIN team t

team ํ…Œ์ด๋ธ”์„ t๋ผ๋Š” ๋ณ„์นญ์œผ๋กœ

 

ON p.team_id = t.team_id

๋‘ ํ…Œ์ด๋ธ”์„ team_id๋กœ ์—ฐ๊ฒฐ

 

WHERE p.team_id IN ('K02', 'K10')

๋‘ ํŒ€ ๋ชจ๋‘ ํฌํ•จ


  AND p.position = 'GK'

 

ํฌ์ง€์…˜์ด ๊ณจํ‚คํผ


ORDER BY t.team_name, p.player_name;

ํŒ€๋ช… → ์„ ์ˆ˜๋ช… ์ˆœ์œผ๋กœ ์ •๋ ฌ



-- SQL_TEST_009
-- ์ˆ˜์›ํŒ€(ID: K02) ๊ณผ ๋Œ€์ „ํŒ€(ID:  K10)์„ ์ˆ˜๋“ค ์ค‘ ์ด
-- ํ‚ค๊ฐ€ 180 ์ด์ƒ 183 ์ดํ•˜์ธ ์„ ์ˆ˜๋“ค
-- ํ‚ค, ํŒ€๋ช…, ์‚ฌ๋žŒ๋ช… ์˜ค๋ฆ„์ฐจ์ˆœ

 

SELECT 
    p.height AS ํ‚ค,
    t.team_name AS ํŒ€๋ช…,
    p.player_name AS ์„ ์ˆ˜๋ช…
FROM player p
JOIN team t ON p.team_id = t.team_id
WHERE p.team_id IN ('K02', 'K10')
  AND p.height BETWEEN 180 AND 183

180 ์ด์ƒ 183 ์ดํ•˜


ORDER BY p.height, t.team_name, p.player_name;

3๋‹จ๊ณ„ ์ •๋ ฌ (ํ‚ค → ํŒ€ → ์ด๋ฆ„)

 



-- SOCCER_SQL_010
-- ๋ชจ๋“  ์„ ์ˆ˜๋“ค ์ค‘
-- ํฌ์ง€์…˜์„ ๋ฐฐ์ •๋ฐ›์ง€ ๋ชปํ•œ ์„ ์ˆ˜๋“ค์˜ ํŒ€๊ณผ  ์ด๋ฆ„
-- ํŒ€๋ช…, ์‚ฌ๋žŒ๋ช… ์˜ค๋ฆ„์ฐจ์ˆœ

 

AS-์•Œ๋ฆฌ์•„์Šค?

SELECT 
    t.team_name AS ํŒ€๋ช…,
    p.player_name AS ์„ ์ˆ˜๋ช…
FROM player p
JOIN team t ON p.team_id = t.team_id
WHERE p.position IS NULL

 

IS NULL

๊ฐ’์ด ์—†๋Š” ๊ฒƒ (๋น„์–ด ์žˆ์Œ)

 

ํฌ์ง€์…˜ ๋ฐฐ์ • ์•ˆ ๋œ ์„ ์ˆ˜


ORDER BY t.team_name, p.player_name;

 

  • ORDER BY t.team_name, p.player_name = ORDER BY t.team_name ASC, p.player_name ASC
  • ์ƒ๋žต ์ด์œ : SQL ๊ธฐ๋ณธ๊ฐ’์ด ASC๋ผ์„œ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ
  • ์ถ”์ฒœ: ๊ฐ„๊ฒฐํ•จ ์œ„ํ•ด ์ƒ๋žต OK, ํ•˜์ง€๋งŒ ํŒ€ ๊ทœ์น™ ๋”ฐ๋ผ ASC ๋ช…์‹œ ๊ฐ€๋Šฅ

 


์ฃผ์š” SQL ํ‚ค์›Œ๋“œ ์ •๋ฆฌํ‘œ

ํ‚ค์›Œ๋“œ ์˜๋ฏธ ์˜ˆ์‹œ
SELECT ๋ฐ์ดํ„ฐ ์กฐํšŒ SELECT name
FROM ํ…Œ์ด๋ธ” ์ง€์ • FROM player
WHERE ์กฐ๊ฑด ํ•„ํ„ฐ WHERE team_id = 'K02'
JOIN ... ON ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐ JOIN team ON ...
AND / OR ์กฐ๊ฑด ๊ฒฐํ•ฉ AND height > 170
IN (...) ์—ฌ๋Ÿฌ ๊ฐ’ ํฌํ•จ IN ('K02', 'K10')
BETWEEN a AND b ๋ฒ”์œ„ ์กฐ๊ฑด BETWEEN 170 AND 180
LIKE '๊ณ %' ํŒจํ„ด ๋งค์นญ ์„ฑ์ด ๊ณ ์”จ
IS NULL ๊ฐ’์ด ์—†์Œ position IS NULL
COALESCE(a, b) NULL์ด๋ฉด b ๋ฐ˜ํ™˜ COALESCE(height, 0)
`   `
::TEXT ํ˜•๋ณ€ํ™˜ (์ˆซ์ž→๋ฌธ์ž) 175::TEXT
CASE ... END ์กฐ๊ฑด๋ฌธ CASE WHEN ... THEN ...
ROUND(x, 2) ์†Œ์ˆ˜์  2์ž๋ฆฌ ROUND(22.222, 2)
ORDER BY ์ •๋ ฌ ORDER BY height DESC
DESC ๋‚ด๋ฆผ์ฐจ์ˆœ ํฐ → ์ž‘๊ฒŒ
ASC ์˜ค๋ฆ„์ฐจ์ˆœ ์ž‘ → ํฌ๊ฒŒ (๊ธฐ๋ณธ)
NULLS LAST NULL์€ ๋งจ ๋’ค