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

16์ผ์ฐจ.

by GreenJin_S2 2025. 10. 30.



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



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
ORDER BY t.team_name, p.player_name;

 



-- SOCCER_SQL_011
-- ํŒ€๊ณผ ์Šคํƒ€๋””์›€์„ ์กฐ์ธํ•˜์—ฌ
-- ํŒ€์ด๋ฆ„, ์Šคํƒ€๋””์›€ ์ด๋ฆ„ ์ถœ๋ ฅ



SELECT 
    t.team_name AS ํŒ€์ด๋ฆ„,
    s.stadium_name AS ์Šคํƒ€๋””์›€
FROM team t
JOIN stadium s ON t.stadium_id = s.stadium_id;

 

SELECT 
    t.team_name AS ํŒ€์ด๋ฆ„,
    s.stadium_name AS ์Šคํƒ€๋””์›€

    t.region _name, COALESCE( t.region_name, '์—ฐ๊ณ ์ง€ ์—†์Œ') AS ์—ฐ๊ณ ์ง€


FROM stadium s


JOIN team t ON s.hometeam_id = t.team_id

SELECT s.stadium_name, COALESCE(t.team_name, 'ํ™ˆํŒ€ ์—†์Œ') AS ํ™ˆํŒ€

 

SELECT 
    t.team_name AS ํŒ€์ด๋ฆ„,
    s.stadium_name AS ์Šคํƒ€๋””์›€,
COALESCE(t.team_name, 'ํ™ˆํŒ€ ์—†์Œ') AS ํ™ˆํŒ€
FROM stadium s
LEFT JOIN team t ON s.hometeam_id = t.team_id
ORDER BY t.team_name COLLATE korean ASC;

 

sellect * from stadium

 

<!--br {mso-data-placement:same-cell;}-->

์ฟผ๋ฆฌ๊ธฐ์ค€ ํ…Œ์ด๋ธ”๊ฒฐ๊ณผ ์ˆ˜

1๋ฒˆ team t ๊ธฐ์ค€ ํŒ€์ด ์žˆ๋Š” ๊ฒฝ๊ธฐ์žฅ๋งŒ
2๋ฒˆ stadium s ๊ธฐ์ค€ ๊ฒฝ๊ธฐ์žฅ์ด ์žˆ๋Š” ํŒ€๋งŒ
-- stadium ํ…Œ์ด๋ธ”
stadium_id | stadium_name     | hometeam_id
-----------|------------------|-------------
C02        | ๊ด‘์ฃผ์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ | K05
C04        | ๋Œ€๊ตฌ์Šคํƒ€๋””์›€     | K04
...        | ...              | NULL (ํ™ˆํŒ€ ์—†์Œ)

-- team ํ…Œ์ด๋ธ”
team_id | team_name | stadium_id (์—†์Œ!)
--------|-----------|-------------------
K05     | ๊ด‘์ฃผFC    | (์—†์Œ)

team์—๋Š” stadium_id ์—†๊ณ , → stadium์—๋Š” hometeam_id ์žˆ์Œ!

 

ORDER BY t.team_name COLLATE korean ASC ;

 COLLATE korean ASC ; ํ•œ๊ตญ์–ด ์ˆœ์œผ๋กœ ์ •๋ ฌ

๋์—๋งŒ ; -๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ™์—ฌ์ฃผ๋Š” ๊ฒƒ



-- SOCCER_SQL_012
-- ํŒ€๊ณผ ์Šคํƒ€๋””์›€, ์Šค์ผ€์ค„์„ ์กฐ์ธํ•˜์—ฌ
-- 2012๋…„ 3์›” 17์ผ์— ์—ด๋ฆฐ ๊ฐ ๊ฒฝ๊ธฐ์˜
-- ํŒ€์ด๋ฆ„, ์Šคํƒ€๋””์›€, ์–ด์›จ์ดํŒ€ ์ด๋ฆ„ ์ถœ๋ ฅ
-- ๋‹ค์ค‘ํ…Œ์ด๋ธ” join ์„ ์ฐพ์•„์„œ ํ•ด๊ฒฐํ•˜์‹œ์˜ค.

 

ORDER BY h.team_name COLLATE korean ASC; ์ถ”๊ฐ€ํ•จ!



SELECT 
    h.team_name AS ํ™ˆํŒ€,
    s.stadium_name AS ์Šคํƒ€๋””์›€,
    a.team_name AS ์–ด์›จ์ดํŒ€,

sch.sche_date AS ๊ฒฝ๊ธฐ์ผ์ •

 

* ๊ฒฝ๊ธฐ์ผ์ • ๋„ฃ์–ด์ฃผ๊ณ  ์‹ถ์œผ๋ฉด  , (์‰ผํ‘œ!) ๋„ฃ์–ด์ค˜์•ผ ๋Œ์•„๊ฐ


FROM schedule sch
JOIN team h ON sch.hometeam_id = h.team_id
JOIN team a ON sch.awayteam_id = a.team_id
JOIN stadium s ON sch.stadium_id = s.stadium_id

* ๊ฒฝ๊ธฐ์ผ์ •์ด ๊ฐ™์€ ๊ฒƒ๋ผ๋ฆฌ ์—ฐ๊ฒฐ์‹œ์ผœ์ค˜์•ผ ํ•˜๋‹ˆ๊นŒ schedule ์ผ์ •ํ‘œ์—์„œ id(๊ณ ์œ ๋ฒˆํ˜ธ) ๊ฐ€์ ธ์˜ด


WHERE sch.sche_date = '2012-03-17'

ORDER BY h.team_name COLLATE korean ASC;

 



-- SOCCER_SQL_013
-- 2012๋…„ 3์›” 17์ผ ๊ฒฝ๊ธฐ์—
-- ํฌํ•ญ ์Šคํ‹ธ๋Ÿฌ์Šค ์†Œ์† ๊ณจํ‚คํผ(GK)
-- ์„ ์ˆ˜, ํฌ์ง€์…˜,ํŒ€๋ช… (์—ฐ๊ณ ์ง€ํฌํ•จ),
-- ์Šคํƒ€๋””์›€, ๊ฒฝ๊ธฐ๋‚ ์งœ๋ฅผ ๊ตฌํ•˜์‹œ์˜ค
-- ์—ฐ๊ณ ์ง€์™€ ํŒ€์ด๋ฆ„์€ ๊ฐ„๊ฒฉ์„ ๋„์šฐ์‹œ์˜ค

SELECT column_name, data_type 
FROM information_schema.columns 
WHERE table_name = 'team' 
ORDER BY ordinal_position;
***์ปฌ๋Ÿผ๋ช… ์•Œ์•„๋ณด๋Š” ๋ฐฉ๋ฒ•*****(๋‚ด๊ฐ€ ๊ถ๊ธˆํ•ด์„œ ํ•ด๋ณธ ๊ฒƒ)

SELECT 
    t.region_name || ' ' || t.team_name AS "์—ฐ๊ณ ์ง€์™€ ํŒ€๋ช…",

 ์—ฐ๊ณ ์ง€์™€ ํŒ€์ด๋ฆ„์€ ๊ฐ„๊ฒฉ์„ ๋„์šฐ์‹œ์˜ค
    p.player_name AS ์„ ์ˆ˜๋ช…,
    p.position AS ํฌ์ง€์…˜,
    s.stadium_name AS ์Šคํƒ€๋””์›€,
    sch.sche_date AS ๊ฒฝ๊ธฐ๋‚ ์งœ
FROM player p
JOIN team t ON p.team_id = t.team_id
JOIN schedule sch ON (sch.hometeam_id = t.team_id OR sch.awayteam_id = t.team_id)
JOIN stadium s ON sch.stadium_id = s.stadium_id
WHERE t.team_name = '์Šคํ‹ธ๋Ÿฌ์Šค'
  AND p.position = 'GK'
  AND sch.sche_date = '2012-03-17';

 



-- SOCCER_SQL_014
-- ํ™ˆํŒ€์ด 3์ ์ด์ƒ ์ฐจ์ด๋กœ ์Šน๋ฆฌํ•œ ๊ฒฝ๊ธฐ์˜
-- ๊ฒฝ๊ธฐ์žฅ ์ด๋ฆ„, ๊ฒฝ๊ธฐ ์ผ์ •
-- ํ™ˆํŒ€ ์ด๋ฆ„๊ณผ ์›์ •ํŒ€ ์ด๋ฆ„์„
-- ๊ตฌํ•˜์‹œ์˜ค

 

SELECT column_name, data_type 
FROM information_schema.columns 
WHERE table_name = 'schedule' 
ORDER BY ordinal_position;

-์ปฌ๋Ÿผ ๋„ค์ž„ ์•Œ์•„๋ณด๋Š” ๋ฐฉ๋ฒ•

SELECT 
    s.stadium_name AS ๊ฒฝ๊ธฐ์žฅ,
    sch.sche_date AS ๊ฒฝ๊ธฐ์ผ์ •,
    h.team_name AS ํ™ˆํŒ€,
    a.team_name AS ์›์ •ํŒ€,

 

sch.home_score AS ํ™ˆํŒ€์ ์ˆ˜,
sch.away_score AS ์›์ •ํŒ€์ ์ˆ˜

*์ ์ˆ˜ ์ถ”๊ฐ€

 

SELECT → "์ด๊ฑฐ ๋ณด์—ฌ์ค˜!"


FROM schedule sch

 

FROM schedule sch → "์–ด๋””์„œ ์ฐพ์„๊นŒ?"

 

schedule ํ‘œ์—์„œ 180๊ฑด์œผ๋กœ ์ ค ๋งŽ์Œ ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์„œ ์ฐพ์•˜์Œ

 


JOIN team h ON sch.hometeam_id = h.team_id
JOIN team a ON sch.awayteam_id = a.team_id
JOIN stadium s ON sch.stadium_id = s.stadium_id

 

์—ฐ๊ฒฐ ์กฐ๊ฑด: sch.hometeam_id = h.team_id

"์ผ์ •ํ‘œ์— ์ ํžŒ ํ™ˆํŒ€ ๋ฒˆํ˜ธ(K02)๊ฐ€, ํŒ€ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ํŒ€ ๋ฒˆํ˜ธ(K02)์™€ ๊ฐ™์œผ๋ฉด ์—ฐ๊ฒฐํ•ด์ค˜!"

 

์ด๋ฆ„์˜๋ฏธaway์˜์–ด๋กœ "๋–จ์–ด์ ธ ์žˆ๋‹ค", "์›์ •"awayteam_id์›์ •ํŒ€ ๋ฒˆํ˜ธ (์ง‘์ด ์•„๋‹Œ ํŒ€)

 

1. schedule (๊ฒฝ๊ธฐ ์ผ์ •)
   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
   โ”‚ hometeam_id: K02   โ”‚ → team h → ์‚ผ์„ฑ๋ธ”๋ฃจ์œ™์ฆˆ
   โ”‚ awayteam_id: K09   โ”‚ → team a → FC์„œ์šธ
   โ”‚ stadium_id: B01    โ”‚ → stadium s → ์ˆ˜์›์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ
   โ”‚ home_score: 5      โ”‚
   โ”‚ away_score: 1      โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. JOIN ํ›„ ๊ฒฐ๊ณผ
   ๊ฒฝ๊ธฐ์žฅ: ์ˆ˜์›์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ
   ํ™ˆํŒ€: ์‚ผ์„ฑ๋ธ”๋ฃจ์œ™์ฆˆ
   ์›์ •ํŒ€: FC์„œ์šธ
   ์ ์ˆ˜ ์ฐจ์ด: 4 → ํฌํ•จ!

 

 


WHERE sch.home_score - sch.away_score >= 3;




-- SOCCER_SQL_015
-- STADIUM ์— ๋“ฑ๋ก๋œ ์šด๋™์žฅ ์ค‘์—์„œ
-- ํ™ˆํŒ€์ด ์—†๋Š” ๊ฒฝ๊ธฐ์žฅ๊นŒ์ง€ ์ „๋ถ€ ๋‚˜์˜ค๋„๋ก
-- ์นด์šดํŠธ ๊ฐ’์€ 20

 

SELECT column_name, data_type 
FROM information_schema.columns 
WHERE table_name = 'team
ORDER BY ordinal_position;

 

SELECT column_name, data_type 
FROM information_schema.columns 
WHERE table_name = ' stadium
ORDER BY ordinal_position;




SELECT 

    s.stadium_name,
    s.stadium_id,
    t.team_name AS ํ™ˆํŒ€,
s.seat_count,
hometeam_id,
t.e_team_name

 

FROM stadium s
LEFT JOIN team t ON s.stadium_id = t.stadium_id
ORDER BY s.stadium_id;

-- 1. ๋ชฉ๋ก ๋ณด๊ธฐ
SELECT s.stadium_name, COALESCE(t.team_name, 'ํ™ˆํŒ€ ์—†์Œ') AS ํ™ˆํŒ€
FROM stadium s
LEFT JOIN team t ON s.stadium_id = t.stadium_id;

 

COALESCE = "NULL์ด๋ฉด ์ด๊ฑธ๋กœ ๋ฐ”๊ฟ”์ค˜!" → ๋ณด๊ธฐ ์ข‹๊ณ , ์ดํ•ด ์‰ฌ์›€

 


ํ•ต์‹ฌ ์ฐจ์ด: COALESCE(t.team_name, 'ํ™ˆํŒ€ ์—†์Œ')

 
ํ•จ์ˆ˜์˜๋ฏธ
COALESCE(a, b) a๊ฐ€ NULL์ด๋ฉด b๋ฅผ ์ถœ๋ ฅ
t.team_name ์›๋ž˜ ๊ฐ’ (์žˆ์œผ๋ฉด ์ถœ๋ ฅ)
'ํ™ˆํŒ€ ์—†์Œ' ๋Œ€์ฒด ๊ฐ’ (์—†์œผ๋ฉด ์ด๊ฑธ ์ถœ๋ ฅ)

๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: "์นœ๊ตฌ๋ž‘ ์ง๊ฟ ๋งŒ๋“ค๊ธฐ"

์ƒ์ƒํ•ด๋ณด์„ธ์š”. ์™ผ์ชฝ ๋ฐ˜ (stadium) ์— 4๋ช…์˜ ํ•™์ƒ์ด ์žˆ์–ด์š”. ์˜ค๋ฅธ์ชฝ ๋ฐ˜ (team) ์— 2๋ช…์˜ ํ•™์ƒ์ด ์žˆ์–ด์š”. "๊ฐ™์€ ๋ฒˆํ˜ธํ‘œ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋ผ๋ฆฌ ์ง๊ฟ ๋งŒ๋“ค๊ธฐ" ๋ผ๋Š” ๊ทœ์น™!


ํ•™์ƒ ๋ช…๋‹จ

 
์™ผ์ชฝ ๋ฐ˜ (stadium)๋ฒˆํ˜ธ์˜ค๋ฅธ์ชฝ ๋ฐ˜ (team)๋ฒˆํ˜ธ
์ˆ˜์›์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ B01 ์‚ผ์„ฑ๋ธ”๋ฃจ์œ™์ฆˆ B01
์„œ์šธ์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ B02 FC์„œ์šธ B02
๊ฒฝ๊ธฐ์žฅ6 S06 (์—†์Œ)  
๊ฒฝ๊ธฐ์žฅ7 S07 (์—†์Œ)

INNER JOIN = "์ง๊ฟ ์žˆ๋Š” ์‚ฌ๋žŒ๋งŒ ๋ฐœํ‘œ"

๊ทœ์น™: ์ง๊ฟ์ด ์žˆ์–ด์•ผ๋งŒ ๋ฌด๋Œ€์— ์˜ฌ๋ผ๊ฐ€์š”!

 
๋ฐœํ‘œ์ž (๊ฒฐ๊ณผ)
์ˆ˜์›์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ + ์‚ผ์„ฑ๋ธ”๋ฃจ์œ™์ฆˆ
์„œ์šธ์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ + FC์„œ์šธ

๊ฒฝ๊ธฐ์žฅ6, ๊ฒฝ๊ธฐ์žฅ7์€ ์ง๊ฟ ์—†์–ด์„œ ํƒˆ๋ฝ!


LEFT JOIN = "์™ผ์ชฝ ๋ฐ˜์€ ๋ฌด์กฐ๊ฑด ๋ฌด๋Œ€์— ์˜ฌ๋ฆฌ๊ณ , ์ง๊ฟ ์žˆ์œผ๋ฉด ๊ฐ™์ด ์˜ฌ๋ฆฌ๊ธฐ"

๊ทœ์น™:

  • ์™ผ์ชฝ ๋ฐ˜ (stadium) ์€ ๋ฌด์กฐ๊ฑด ๋ฌด๋Œ€์— ์˜ฌ๋ผ๊ฐ
  • ์ง๊ฟ ์žˆ์œผ๋ฉด ๊ฐ™์ด ์˜ฌ๋ผ๊ฐ€๊ณ , ์—†์œผ๋ฉด ํ˜ผ์ž ์˜ฌ๋ผ๊ฐ
 
๋ฌด๋Œ€์— ์˜ค๋ฅธ ์‚ฌ๋žŒ (๊ฒฐ๊ณผ)
์ˆ˜์›์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ + ์‚ผ์„ฑ๋ธ”๋ฃจ์œ™์ฆˆ
์„œ์šธ์›”๋“œ์ปต๊ฒฝ๊ธฐ์žฅ + FC์„œ์šธ
๊ฒฝ๊ธฐ์žฅ6 + (์ง๊ฟ ์—†์Œ)
๊ฒฝ๊ธฐ์žฅ7 + (์ง๊ฟ ์—†์Œ)

์ง๊ฟ ์—†์œผ๋ฉด NULL๋กœ ํ‘œ์‹œ์ด๊ฒŒ ๋ฐ”๋กœ "ํ™ˆํŒ€ ์—†๋Š” ๊ฒฝ๊ธฐ์žฅ"



-- 2. ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
SELECT COUNT(*) AS ์นด์šดํŠธ
FROM stadium s
LEFT JOIN team t ON s.stadium_id = t.stadium_id;

 

COUNT(*) → "๋ฌด๋Œ€์— ์˜ค๋ฅธ ์‚ฌ๋žŒ ์ˆ˜" ๋ฅผ ์…ˆ

 



๊ฐ•์‚ฌ๋‹˜ํ•œํ…Œ ์ฝ”๋“œ ๋ณด๋‚ผ๋•Œ ๋ฐฉ๋ฒ•