์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„(25.12.01~)

์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_๋ณธ์บ ํ”„_data11๊ธฐ ๊น€์„ ์˜_TIL_Day 10

0๏ธโƒฃ 2026. 1. 6. 21:50

<์˜ค๋Š˜์˜ ํ•™์Šต>

  • SQL ์ฝ”๋“œ์นดํƒ€ : โญ๏ธโญ๏ธ๊ธฐ์ดˆ ๋ ˆ๋ฒจ
  • Python_๋ฌธ์ž์—ด ์ˆ˜์—…์ž๋ฃŒ ๋ณต์Šต
  • Python_๋ฌธํ’€๋‚ _แ„‹แ…งแ†ซแ„‰แ…ณแ†ธแ„†แ…ฎแ†ซแ„Œแ…ฆ

<ํ•™์Šต๋‚ด์šฉ ์ •๋ฆฌ>

SQL ์ฝ”๋“œ์นดํƒ€ : โญ๏ธโญ๏ธ๊ธฐ์ดˆ ๋ ˆ๋ฒจ

Q. ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋ณดํ˜ธํ•œ ๋™๋ฌผ

๋”๋ณด๊ธฐ

์ž…์–‘์„ ๊ฐ„ ๋™๋ฌผ ์ค‘, ๋ณดํ˜ธ ๊ธฐ๊ฐ„์ด ๊ฐ€์žฅ ๊ธธ์—ˆ๋˜ ๋™๋ฌผ ๋‘ ๋งˆ๋ฆฌ์˜ ์•„์ด๋””์™€ ์ด๋ฆ„์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ๋ณดํ˜ธ ๊ธฐ๊ฐ„์ด ๊ธด ์ˆœ์œผ๋กœ ์กฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

01
  • ๐Ÿšซ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ๋งž์ง€๋งŒ, ์ ‘๊ทผ์ด ๋ณต์žกํ•จ.
select
    Date_diff.ANIMAL_ID
    , Date_diff.NAME
from (
    SELECT
        ai.ANIMAL_ID
        , ai.NAME
        , datediff(ao.DATETIME, ai.DATETIME) as date_diff
    from ANIMAL_INS ai
    inner join ANIMAL_OUTS ao
    on ai.ANIMAL_ID=ao.ANIMAL_ID
    order by date_diff desc
    ) as Date_diff
limit 2
  • ๐Ÿ’ก ๋” ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ
SELECT
    ai.ANIMAL_ID
    , ai.NAME
from ANIMAL_INS ai
inner join ANIMAL_OUTS ao
on ai.ANIMAL_ID=ao.ANIMAL_ID
order by datediff(ao.DATETIME, ai.DATETIME) desc
limit 2
<์˜ค๋‹ต๋…ธํŠธ>
ORDER BY์—๋Š” (1)์ง‘๊ณ„ํ•จ์ˆ˜ (2)๋ณ„์นญ (3)๊ณ„์‚ฐ์‹ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

- ๊ฑฐ์˜ ๋งˆ์ง€๋ง‰ ์‹คํ–‰์ˆœ์„œ๋กœ, ์•ž์— ๋ชจ๋“  ์ง‘๊ณ„๊ฐ€ ๋๋‚œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅ.
- ์ง‘๊ณ„ํ•จ์ˆ˜: SELECT, HAVING, ORDER BY

Q. ๋ณดํ˜ธ์†Œ์—์„œ ์ค‘์„ฑํ™”ํ•œ ๋™๋ฌผ

SELECT
    ai.ANIMAL_ID
    , ai.ANIMAL_TYPE
    , ai.NAME
from ANIMAL_INS ai
    inner join ANIMAL_OUTS ao
    on ai.ANIMAL_ID=ao.ANIMAL_ID
where ai.SEX_UPON_INTAKE like "%Intact%"
    and (ao.SEX_UPON_OUTCOME like "%Neutered%"
    or ao.SEX_UPON_OUTCOME like "%Spayed%")
order by ai.ANIMAL_ID
<์˜ค๋‹ต๋…ธํŠธ>
WHERE ์กฐ๊ฑด์—์„œ OR์ด ์šฐ์„ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ž˜ ํŒŒ์•…ํ•ด์„œ ๊ด„ํ˜ธ ์‚ฌ์šฉํ•˜๊ธฐ

์‚ฌ์ „์บ ํ”„ SQL ๋‹ฌ๋ฆฌ๊ธฐ๋ฐ˜ ๋ฌธ์ œํ’€์ด

Lv4. ๋‹จ๊ณจ ๊ณ ๊ฐ๋‹˜ ์ฐพ๊ธฐ ๐Ÿ”ด๐Ÿ˜ฉ

๋”๋ณด๊ธฐ

๋‚˜๋ผ๋ณ„๋กœ ์ด ์ฃผ๋ฌธ ๊ธˆ์•ก์ด ๊ฐ€์žฅ ๋†’์€ ๊ณ ๊ฐ์˜ ์ด๋ฆ„๊ณผ ๊ทธ ๊ณ ๊ฐ์˜ ์ด ์ฃผ๋ฌธ ๊ธˆ์•ก์„ ์กฐํšŒํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๋ชธ๋ถ€๋ฆผ....๐Ÿ˜ญ

  • ์ˆ™์ง€ํ•œ ๊ฑฐ ๋ณต๊ธฐํ•˜๋ฉด์„œ ํ’€์—ˆ์„ ๋•Œ 1ํŠธ ์„ฑ๊ณต ๐Ÿ˜Ž

SELECT
	c.Country
	, c.CustomerName
	, SUM(TotalAmount)
FROM Customers c
LEFT JOIN Orders o
ON c.CustomerID=o.CustomerID
GROUP BY c.Country, c.CustomerName
HAVING SUM(TotalAmount) = (-- = ("๊ตญ๊ฐ€๋ณ„ MAX์ธ ๊ฒƒ ")
	SELECT MAX(sum_total)
	FROM (
		SELECT SUM(o2.TotalAmount) AS sum_total
		FROM Customers c2
			LEFT JOIN Orders o2
			ON c2.CustomerID=o2.CustomerID
		WHERE c2.Country = c.Country
		GROUP BY c2.CustomerID
		) AS total_amount
	);

Python ๋ฌธํ’€๋‚ 

๋ฌธ์ œ 4-2) ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์ •์ˆ˜ 3๊ฐœ์˜ ํ‰๊ท 

๋”๋ณด๊ธฐ

๋ฌธ์ œ ์„ค๋ช…
์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์ •์ˆ˜ 3๊ฐœ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ํ‰๊ท ์„ ์†Œ์ˆ˜ ๋‘˜์งธ ์ž๋ฆฌ๊นŒ์ง€ ์ถœ๋ ฅํ•˜์„ธ์š”.


์ž…๋ ฅ ์˜ˆ์‹œ:
10,20,30


๋ชฉํ‘œ ์ถœ๋ ฅ:
20.00

  • ์ œ์ถœํ•œ ๋‹ต
data = input()
data_list = data.split(",")

a, b, c = map(int, data_list)

avg = sum([a, b, c]) / len(data_list)
print(f"{avg:.2f}")
  • GPT ์ถ”์ฒœ ๊ฐ„๋‹จํ•œ ๋‹ต
nums = list(map(int, input().split(",")))
avg = sum(nums) / len(nums)
print(f"{avg:.2f}")
  • mean()ํ•จ์ˆ˜ ์‚ฌ์šฉ
from statistics import mean
a, b, c = map(int, input("์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ์ •์ˆ˜ ์„ธ ๊ฐœ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: ").split(","))
print(mean([a, b, c]))
<์˜ค๋‹ต๋…ธํŠธ>
โ— Python์—๋Š” avg()ํ•จ์ˆ˜๊ฐ€ ์—†์Œ
    SUM() / LEN() ์‚ฌ์šฉํ•ด์„œ ํ‰๊ท  ๊ตฌํ•จ
โ— SUM(๋ฐ˜๋ณต๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด, ์‹œ์ž‘ ๊ฐ’)
    - ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด: ๋ฆฌ์ŠคํŠธ, ํŠœํ”Œ, ๋”•์…”๋„ˆ๋ฆฌ, ์ง‘ํ•ฉ
    - ์‹œ์ž‘ ๊ฐ’: SUM์„ ์‹œ์ž‘ํ•  ๊ฐ’ (๊ธฐ๋ณธ: 0)
    - SUM ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ์ฒด์˜ Type์€ '์ˆซ์žํ˜•'์ด์–ด์•ผ ํ•œ๋‹ค.
โ— LEN(๊ฐ์ฒด)
    - ๋ฌธ์ž์—ด(string), ๋ฆฌ์ŠคํŠธ(list), ํŠœํ”Œ(tuple), ๋”•์…”๋„ˆ๋ฆฌ(dictionary), ์ง‘ํ•ฉ(set) ๋“ฑ

 

๋ฌธ์ œ 4-5) ์‰ผํ‘œ + ๊ณต๋ฐฑ์ด ์„ž์ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ

  • ์˜ค๋‹ต
data = input()
data_list = list(map(int, data.split(",").split()))

avg = sum(data_list) / len(data_list)
print(avg)
  • ์ˆ˜์ •ํ•œ ๋‹ต
data = input()
data_list = list(map(int, data.replace(",", "").split()))
avg = int(sum(data_list) / len(data_list))
print(avg)
<์˜ค๋‹ต๋…ธํŠธ>
โ— data.split(",").split()
    -------------   ----
    =>๊ฒฐ๊ณผ: ๋ฆฌ์ŠคํŠธ    ใ„ด> ๋ฌธ์ž์—ด์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜
    ๐Ÿ’กreplace()๋กœ ๊ตฌ๋ถ„์ž ์ฒ˜๋ฆฌ → split์œผ๋กœ ๊ณต๋ฐฑ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž ๋‚˜๋ˆ„๊ธฐ

๋ฌธ์ œ 4-10) ๋ชจ๋“  ๊ตฌ๋ถ„์ž ์ฒ˜๋ฆฌํ•˜๊ธฐ (๋„์ „, ์„ ํƒํ’€๊ธฐ) ๐Ÿ˜Ž
import re / re.findall ๋ณต์Šต

๋ฌธ์ œ ์„ค๋ช…
์ž…๋ ฅ์ด ๊ณต๋ฐฑ / ์‰ผํ‘œ / # ์ค‘ ์–ด๋–ค ๊ฒƒ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด๋„ ๋‘ ์ •์ˆ˜์˜ ํ•ฉ์ด ์ถœ๋ ฅ๋˜๋„๋ก ๋งŒ๋“œ์„ธ์š”.

import re

data = input("์ž…๋ ฅํ•œ ๊ฐ’: ")

nums_list = list(map(int, re.findall(r'\d+', data)))
list_sum = sum(nums_list)

print(f"์ž…๋ ฅํ•œ ๋ชจ๋“  ์ˆ˜์˜ ํ•ฉ: {list_sum}")

๋ฌธ์ œ 10) ๋‚ ์งœ ๋ฌธ์ž์—ด ๋ถ„๋ฆฌํ•˜์—ฌ ์ €์žฅํ•˜๊ธฐ
๋‚ ์งœ์— 0๊นŒ์ง€ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฌธ์ œ ์„ค๋ช… "2026/01/04" ๋ฌธ์ž์—ด์„ / ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด ์—ฐ, ์›”, ์ผ์„ ๊ฐ๊ฐ ๋ณ€์ˆ˜์— ๋‹ด์•„ ์ถœ๋ ฅํ•˜์„ธ์š”.

๋‚ ์งœ Type = INT
f-string ํ•จ์ˆ˜ → {}์˜ ํ˜•์‹์„ ์ง€์ •ํ•ด์ค€๋‹ค "02d"
- d: ์ •์ˆ˜(decimal)
- 2: 2์นธ
- 0: ๋นˆ ์นธ์— ๋“ค์–ด๊ฐˆ ์ˆซ์ž
date_str = "2026/01/04"
year, month, day = map(int, date_str.split("/"))
print(f"์—ฐ๋„:{year}, ์›”:{month:02d}, ์ผ:{day:02d}")
๋‚ ์งœ Type = str
zfill(
๋ฌธ์ž์—ด ๊ธธ์ด ์ง€์ • ์ˆซ์ž) : ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ์ˆซ์ž๋ณด๋‹ค ์งง์œผ๋ฉด, ๋นˆ ์นธ์— 0์„ ์‚ฝ์ž…
* ๋ฌธ์ž์—ด ์ „์šฉ ํ•จ์ˆ˜
date_str = "2026/01/04"
year, month, day = date_str.split("/")
print(f"์—ฐ๋„:{year}, ์›”:{month.zfill(2)}, ์ผ:{day.zfill(2)}")

<๋‚ด์ผ์˜ ํ•™์Šต>

  • ํŒ€ ์•„ํ‹ฐํด(https://yozm.wishket.com/magazine/detail/1070/)
  • SQL ์ฝ”๋“œ์นดํƒ€_๊ธฐ์ดˆ ๋ ˆ๋ฒจ ์™„๋ฃŒ ๋ชฉํ‘œ
  • SQL ์‚ฌ์บ  ๋‹ฌ๋ฆฌ๊ธฐ๋ฐ˜ ๋ฌธ์ œ_5๋ฒˆ ๋ฌธ์ œ ํ’€์ด
  • ํŒŒ์ด์ฌ ์„ธ์…˜ 2ํšŒ์ฐจ
  • ํŒŒ์ด์ฌ 2ํšŒ์ฐจ_๋ณต์Šต๊ณผ์ œ ์ œ์ถœ
  • ํŒŒ์ด์ฌ 1ํšŒ์ฐจ_์‹ฌํ™”๊ณผ์ œ ์‹œ๋„