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

SQL ๊ฑท๊ธฐ๋ฐ˜ ๋ฌธ์ œ ํ†ตํ•ฉ

0๏ธโƒฃ 2025. 12. 27. 20:51

1) first

// 1. ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋“  ์ง์›์˜ ์ด๋ฆ„(name)๊ณผ ์ง๊ธ‰(position)์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// ์ •๋‹ต
select name,
       position
from sparta_employees;

// 2. ํ…Œ์ด๋ธ”์—์„œ ์ค‘๋ณต ์—†์ด ๋ชจ๋“  ์ง๊ธ‰(position)์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// ์ •๋‹ต
select distinct position
from sparta_employees;

// 3. ํ…Œ์ด๋ธ”์—์„œ ์—ฐ๋ด‰(salary)์ด 40000๊ณผ 60000 ์‚ฌ์ด์ธ ์ง์›๋“ค์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// ์ •๋‹ต
select *
from sparta_employees
where selary between 40000 and 60000;

// 4. ํ…Œ์ด๋ธ”์—์„œ ์ž…์‚ฌ์ผ(hire_date)์ด 2023๋…„ 1์›” 1์ผ ์ด์ „์ธ ๋ชจ๋“  ์ง์›๋“ค์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// ์ •๋‹ต
select *
from sparta_employees
where hire_date < '2023-01-01';

2)

// 5. products ํ…Œ์ด๋ธ”์—์„œ ์ œํ’ˆ ์ด๋ฆ„(product_name)๊ณผ ๊ฐ€๊ฒฉ(price)๋งŒ์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// ์ •๋‹ต
select produst_name, price
from products;

// 6. products ํ…Œ์ด๋ธ”์—์„œ ์ œํ’ˆ ์ด๋ฆ„์— 'ํ”„๋กœ'๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ์ œํ’ˆ์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// ์ •๋‹ต
select *
from products
where product_name like '%ํ”„๋กœ%';

// 7. products ํ…Œ์ด๋ธ”์—์„œ ์ œํ’ˆ ์ด๋ฆ„์ด '๊ฐค'๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์ œํ’ˆ์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// ์ •๋‹ต
select *
from products
where product_name like '๊ฐค%';

// 8. products ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋“  ์ œํ’ˆ์„ ๊ตฌ๋งคํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ˆ์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// ์ •๋‹ต
select sum(price) as sum_price --๋ณ„์นญ ์‚ฌ์šฉํ•ด์„œ ๊ฒฐ๊ณผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ธฐ
from products;

3)

// 9. orders ํ…Œ์ด๋ธ”์—์„œ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰(amount)์ด 2๊ฐœ ์ด์ƒ์ธ ์ฃผ๋ฌธ์„ ์ง„ํ–‰ํ•œ ์†Œ๋น„์ž์˜ ID(customer_id)๋งŒ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
// ์ •๋‹ต
select customer_id
from orders
where amount >= 2;

// 10. orders ํ…Œ์ด๋ธ”์—์„œ 2023๋…„ 11์›” 2์ผ ์ดํ›„์— ์ฃผ๋ฌธ๋œ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰(amount)์ด 2๊ฐœ ์ด์ƒ์ธ ์ฃผ๋ฌธ์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
// ์ •๋‹ต
select *
from orders
where order_date > '2023-11-02' and amount >= 2;

// 11. orders ํ…Œ์ด๋ธ”์—์„œ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰์ด 3๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด์„œ ๋ฐฐ์†ก๋น„(shipping_fee)๊ฐ€ 15000์›๋ณด๋‹ค ๋น„์‹ผ ์ฃผ๋ฌธ์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
// ์ •๋‹ต
select *
from orders
where amount<3 and shipping_fee>15000;

// 12. orders ํ…Œ์ด๋ธ”์—์„œ ๋ฐฐ์†ก๋น„๊ฐ€ ๋†’์€ ๊ธˆ์•ก ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
// ์ •๋‹ต
select *
from orders
order by shipping_fee desc;

4)

// 13. sparta_students ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋“  ํ•™์ƒ์˜ ์ด๋ฆ„(name)๊ณผ ํŠธ๋ž™(track)์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
// ์ •๋‹ต
select name, track
from sparta_students;

// 14. sparta_students ํ…Œ์ด๋ธ”์—์„œ Unity ํŠธ๋ž™ ์†Œ์†์ด ์•„๋‹Œ ํ•™์ƒ๋“ค์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
//๐Ÿ“Œ์˜ค๋‹ต
select *
from sparta_students
where track <> 'Unity'; --๋ฌธ์ž์—ด์— ''

// 15. sparta_students ํ…Œ์ด๋ธ”์—์„œ ์ž…ํ•™๋…„๋„(enrollment_year)๊ฐ€ 2021๋…„์ธ ํ•™์ƒ๊ณผ 2023๋…„์ธ ํ•™์ƒ์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
// ์ •๋‹ต
select *
from sparta_students
where enrollment_year in (2021, 2023);

// 16. sparta_students ํ…Œ์ด๋ธ”์—์„œ Node.js ํŠธ๋ž™ ์†Œ์†์ด๊ณ  ํ•™์ ์ด ‘A’์ธ ํ•™์ƒ์˜ ์ž…ํ•™๋…„๋„๋ฅผ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
//๐Ÿ“Œ์˜ค๋‹ต
select enrollment_year
from sparta_students
where track='Node.js' and grade='A'; --๋ฌธ์ž์—ด์— ''
<์˜ค๋‹ต๋…ธํŠธ>
14, 16. ๋ฌธ์ž์—ด ์‚ฌ์šฉ ์‹œ ์ž‘์€๋”ฐ์˜ดํ‘œ('') ์‚ฌ์šฉํ•˜๊ธฐ

5)

//17.team_projects ํ…Œ์ด๋ธ”์—์„œ AWS ์˜ˆ์‚ฐ(aws_cost)์ด 40000 ์ด์ƒ ๋“ค์–ด๊ฐ„ ํ”„๋กœ์ ํŠธ๋“ค์˜ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
// ์ •๋‹ต
select name
from team_projects
where aws_cost >= 40000;

//18.team_projects ํ…Œ์ด๋ธ”์—์„œ 2022๋…„์— ์‹œ์ž‘๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”! ๋‹จ, start_date < ‘2023-01-01’ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
//๐Ÿ“Œ์˜ค๋‹ต
select *
from team_projects
where int(date(start_date, '%y')) = 2022;
//๐Ÿ’กํ•ด์„ค
select *
from team_projects
where year(start_date) = 2022; --year() ๊ฒฐ๊ณผ ํƒ€์ž…: date(์ˆซ์ž๋กœ ์ธ์‹)

//19.team_projects ํ…Œ์ด๋ธ”์—์„œ ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๋‹จ, ์ง€๊ธˆ ์‹œ์ ์˜ ๋‚ ์งœ๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•ด์„œ ์ฟผ๋ฆฌํ•˜์ง€ ๋ง์•„์ฃผ์„ธ์š”!
//๐Ÿ“Œ์˜ค๋‹ต
//๐Ÿ’กํ•ด์„ค
select *
from team_projects
where curdate() between start_date and end_date; --curdate(): ํ˜„์žฌ ๋‚ ์งœ ๋ฐ˜ํ™˜

//20.team_projects ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ํ”„๋กœ์ ํŠธ์˜ ์ง€์† ๊ธฐ๊ฐ„์„ ์ผ ์ˆ˜๋กœ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
//๐Ÿ“Œ์˜ค๋‹ต
select date((int(end_date)-int(start_date)) + 1), '%d') as "ํ”„๋กœ์ ํŠธ ์ง€์† ๊ธฐ๊ฐ„"
from team_projects
//๐Ÿ’กํ•ด์„ค
select name,
       datediff(day, start_date, end_date) as working_days --๋‚ ์งœ(์ผ) ์ฐจ์ด ๊ณ„์‚ฐ ํ•จ์ˆ˜
from team_projects;
<์˜ค๋‹ต๋…ธํŠธ>
18. date_format('๋‚ ์งœ๊ฐ’(๋ฌธ์ž์—ด)' or ์ปฌ๋Ÿผ, '๋‚ ์งœ ์ถœ๋ ฅ ํฌ๋งท(๋ฌธ์ž์—ด)') [๊ฒฐ๊ณผ ํƒ€์ž…: ๋ฌธ์ž์—ด]
     *date(): ๋‚ ์งœ/์‹œ๊ฐ„ ๊ฐ’์—์„œ ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœ [๊ฒฐ๊ณผ ํƒ€์ž…: date]
      year('๋‚ ์งœ๊ฐ’(๋ฌธ์ž์—ด)' or ์ปฌ๋Ÿผ) [๊ฒฐ๊ณผํƒ€์ž…: INT]
19. curdate(): ํ˜„์žฌ ๋‚ ์งœ ์ถœ๋ ฅ [๊ฒฐ๊ณผ ํƒ€์ž…: DATE]
      now(): ํ˜„์žฌ ๋‚ ์งœ/์‹œ๊ฐ„ ์ถœ๋ ฅ [๊ฒฐ๊ณผ ํƒ€์ž…: DATETIME]
20. datediff(datepart, start date, end date) [๊ฒฐ๊ณผ ํƒ€์ž…: INT]
       : dateapart์— ๋”ฐ๋ฅธ ์ผ์ž ์ฐจ์ด๋ฅผ ๋ฐ˜ํ™˜

6)

//21.lol_users ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์œ ์ €์˜ ๋ ˆ์ดํŒ…(rating) ์ˆœ์œ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”! ์ „์ฒด ์ง€์—ญ(region) ๊ธฐ์ค€์ด๊ณ  ์ˆœ์œ„๋Š” ๋ ˆ์ดํŒ…์ด ๋†’์„์ˆ˜๋ก ๋†’์•„์•ผํ•ด์š”. (e.g. rating 1400 ์œ ์ €์˜ ์ˆœ์œ„ > rating 1350 ์œ ์ €์˜ ์ˆœ์œ„)
//๐Ÿ“Œ์˜ค๋‹ต
select *
from lol_users
order by region asc, rating desc
//๐Ÿ’กํ•ด์„ค
select id,
       name,
       region,
       rating,
       rank() over(order by rating desc) as lol_ranking --rank() over(partition by(์„ ํƒ) order by(ํ•„์ˆ˜))
from lol_users;

//22.lol_users ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•œ(join_date) ์œ ์ €์˜ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
//์ •๋‹ต
select name,
       join_date
from lol_users
where join_date is not null
order by join_date desc
limit 1;

//23.lol_users ํ…Œ์ด๋ธ”์—์„œ ์ง€์—ญ๋ณ„๋กœ ๋ ˆ์ดํŒ…์ด ๋†’์€ ์ˆœ์œผ๋กœ ์œ ์ €๋“ค์„ ์ •๋ ฌํ•ด์„œ ๋‚˜์—ดํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
//์ •๋‹ต
select *
from lol_users
order by region, rating desc;

//24.lol_users ํ…Œ์ด๋ธ”์—์„œ ์ง€์—ญ๋ณ„๋กœ ํ‰๊ท  ๋ ˆ์ดํŒ…์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
//์ •๋‹ต
select region,
       avg(rating) as avg_rating
from lol_users
group by region;
<์˜ค๋‹ต๋…ธํŠธ>
21. ๋žญํ‚น ์ง‘๊ณ„ ํ•จ์ˆ˜
rank() over(partition by ์ˆœ์œ„๋ฅผ ๋‚˜๋ˆ ์„œ ๋งค๊ธธ ๊ธฐ์ค€(์„ ํƒ) order by ์ˆœ์œ„ ๊ธฐ์ค€(ํ•„์ˆ˜))
     - ๋™์  ํ—ˆ์šฉ / ๊ฐ™์€ ์ˆœ์œ„๋กœ ํŒ๋‹จ
     - partition by : ํ•ด๋‹น ๊ธฐ์ค€๋งˆ๋‹ค ์ˆœ์œ„ ๋ฆฌ์…‹ (ex.๊ฐ ๊ตญ๊ฐ€ ๋‚ด์—์„œ ๊ฒฝ์Ÿํ•  ๋•Œ)

7)

//25. lol_feedbacks ํ…Œ์ด๋ธ”์—์„œ ๋งŒ์กฑ๋„ ์ ์ˆ˜(satisfaction_score)์— ๋”ฐ๋ผ ํ”ผ๋“œ๋ฐฑ์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select id, user_name, satisfaction_score, feedback_date
from lol_feedbacks
order by satisfaction_score desc;

//26.lol_feedbacks ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์œ ์ €๋ณ„๋กœ ์ตœ์‹  ํ”ผ๋“œ๋ฐฑ์„ ์ฐพ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select user_name,
       max(feedback_date) as latest_feedback_date
from lol_feedbacks
group by user_name;

//27.lol_feedbacks ํ…Œ์ด๋ธ”์—์„œ ๋งŒ์กฑ๋„ ์ ์ˆ˜๊ฐ€ 5์ ์ธ ํ”ผ๋“œ๋ฐฑ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select count(*) as feedback_cnt
from lol_feedbacks
where satisfaction_score=5;

//28.lol_feedbacks ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์„ ๋‚จ๊ธด ์ƒ์œ„ 3๋ช…์˜ ๊ณ ๊ฐ์„ ์ฐพ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--๐Ÿ“Œ์˜ค๋‹ต
select user_name,
       count(user_name) as cnt_fb
from lol_feedbacks
order by count(user_name) desc
limit 3;
--๐Ÿ’กํ•ด์„ค
select user_name,
       count(user_name) as cnt_fb
from lol_feedbacks
group by user_name --๋ถ„๋ฅ˜ ๊ธฐ์ค€ ๊ผญ ์ ๊ธฐ
order by count(user_name) desc --order by cnt_fb๊ณผ ๊ฐ™์ด ๋ณ„์นญ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
--order by๊ฐ€ select ๋ณด๋‹ค ๋’ค์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— select์˜ ๋ณ„์นญ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ.
limit 3;

//29.lol_feedbacks ํ…Œ์ด๋ธ”์—์„œ ํ‰๊ท  ๋งŒ์กฑ๋„ ์ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋‚ ์งœ๋ฅผ ์ฐพ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select feedback_date,
       avg(satisfaction_score) as avg_scor
from lol_feedbacks
group by feedback_date
order by avg_score desc
limit 1;

8)

// 30. doctors ํ…Œ์ด๋ธ”์—์„œ ์ „๊ณต(major)๊ฐ€ ์„ฑํ˜•์™ธ๊ณผ์ธ ์˜์‚ฌ์˜ ์ด๋ฆ„์„ ์•Œ์•„๋‚ด๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select name, major
from doctors
where major='์„ฑํ˜•์™ธ๊ณผ';

// 31. doctors ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์ „๊ณต ๋ณ„ ์˜์‚ฌ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select major,
       count(name) --null๊ฐ’ ์—†์œผ๋‹ˆ count(*) ์‚ฌ์šฉ ๊ฐ€๋Šฅ
from doctors
group by major;

// 32. doctors ํ…Œ์ด๋ธ”์—์„œ ํ˜„์žฌ ๋‚ ์งœ ๊ธฐ์ค€์œผ๋กœ 5๋…„ ์ด์ƒ ๊ทผ๋ฌด(hire_date)ํ•œ ์˜์‚ฌ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--๐Ÿ“Œ์˜ค๋‹ต
select count(*) 
from doctors
where year(curdate())-year(hire_date)>=5; --์ •ํ™•ํ•œ 5๋…„์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋…„๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ '5๋…„์ฐจ'๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜. ์ •ํ™•๋„ ๋–จ์–ด์ง.
--๐Ÿ’กํ•ด์„ค
select count(*)
from doctors
where date_sub(curdate(), interval 5 year) >= hire_date --DATE_SUB(๊ธฐ์ค€๋‚ ์งœ, ํŠน์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ)

// 33.doctors ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์˜์‚ฌ์˜ ๊ทผ๋ฌด ๊ธฐ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select name,
       hire_date,
       datediff(curdate(), hire_date) as working_dates --datediff(๋๋‚˜๋Š” ๋‚ ์งœ, ์‹œ์ž‘ ๋‚ ์งœ): ๋‘ ๋‚ ์งœ์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
from doctors;
<ํ•จ์ˆ˜ ์˜ค๋‹ต๋…ธํŠธ>
32. year() ํ•จ์ˆ˜์˜ ์ฐจ์ด๋Š” '์—ฐ์ฐจ'๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๋‹ค.
       DATE_SUB(๊ธฐ์ค€ ๋‚ ์งœ, INTERVAL ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ) : '๊ธฐ์ค€ ๋‚ ์งœ'์—์„œ '์‹œ๊ฐ„ ๊ฐ„๊ฒฉ'๋งŒํผ ์ด์ „ (-)
       DATE_ADD(๊ธฐ์ค€ ๋‚ ์งœ, INTERVAL ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ) : '๊ธฐ์ค€ ๋‚ ์งœ'์—์„œ '์‹œ๊ฐ„ ๊ฐ„๊ฒฉ'๋งŒํผ ์ดํ›„ (+)
33. ๋‘ ๋‚ ์งœ์˜ ์ฐจ์ด ๊ตฌํ•˜๊ธฐ
      DATEDIFF(๋ ๋‚ ์งœ, ์‹œ์ž‘ ๋‚ ์งœ)

9)

//34. patients ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ์„ฑ๋ณ„(gender)์— ๋”ฐ๋ฅธ ํ™˜์ž ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select gender,
       count(gender) as gender_cnt --count(*)์‚ฌ์šฉ ๊ฐ€๋Šฅ
from patients
group by gender;

//35. patients ํ…Œ์ด๋ธ”์—์„œ ํ˜„์žฌ ๋‚˜์ด๊ฐ€ 40์„ธ ์ด์ƒ์ธ ํ™˜์ž๋“ค์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--๐Ÿ“Œ์˜ค๋‹ต
select count(*) as "age_>=40"
from patients
where year(curdate())-year(birth_date)+1 >= 40
--๐Ÿ’กํ•ด์„ค
select count(*)
from patients
where birth_date <= date_sub(curdate(), interval 40 year);

//36. patients ํ…Œ์ด๋ธ”์—์„œ ๋งˆ์ง€๋ง‰ ๋ฐฉ๋ฌธ ๋‚ ์งœ(last_visit_date)๊ฐ€ 1๋…„ ์ด์ƒ ๋œ ํ™˜์ž๋“ค์„ ์„ ํƒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select *
from patients
where last_visit_date <= date_sub(curdate(), interval 1 year);

//37. patients ํ…Œ์ด๋ธ”์—์„œ ์ƒ๋…„์›”์ผ์ด 1980๋…„๋Œ€์ธ ํ™˜์ž๋“ค์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select count(*)
from patients
where year(birth_date) between 1980 and 1989;
--๐Ÿ’ก๊ถŒ์žฅ
select count(*)
from patients
where birth_date between '1980-01-01' and '1989-12-31';
<์˜ค๋‹ต๋…ธํŠธ>
35. ์ƒ์ผ ๊ฐ’์„ ๊ตฌํ•  ๋•Œ year() ํ•จ์ˆ˜๋กœ ์—ฐ๋„๋งŒ ๊ณ„์‚ฐํ•˜๋ฉด ํ•œ๊ตญ๋‚˜์ด๋งŒ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ.
      ๊ฐ€๋Šฅํ•˜๋ฉด ๋‚ ์งœ ๊ณ„์‚ฐ์€ date_sub() / date_add() ํ•จ์ˆ˜ ์ด์šฉํ•˜๊ธฐ
37. ์—ฐ๋„๊ณ„์‚ฐ์— year() ์‚ฌ์šฉ ๊ฐ€๋Šฅ
      ๋‹จ, ๊ทธ๋Ÿฌ๋ฉด ์ปฌ๋Ÿผ์˜ ๋ชจ๋“  date ๊ฐ’์„ year๋กœ ์žฌ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ. ๋น„ํšจ์œจ์ . date ํฌ๋งท ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋„๋ก.

10)

//38. ํ˜„์žฌ ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ์ด ๋ถ€์„œ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select count(*) as cnt_departments
from departments;

//39. ๋ชจ๋“  ์ง์›๊ณผ ๊ทธ๋“ค์ด ์†ํ•œ ๋ถ€์„œ์˜ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select e.name,
       d.name --join์œผ๋กœ ์—ฐ๊ฒฐํ•œ ํ…Œ์ด๋ธ”์ด ๊ผญ select์— ํฌํ•จ๋˜์ง€ ์•Š์•„๋„ ๋จ.
FROM employees AS e INNER JOIN departments AS d ON e.department_id=d.id;

//40. '๊ธฐ์ˆ ํŒ€' ๋ถ€์„œ์— ์†ํ•œ ์ง์›๋“ค์˜ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select e.name
from employees e inner join departments d on e.department_id=d.id
where d.name='๊ธฐ์ˆ ํŒ€';

//41. ๋ถ€์„œ๋ณ„๋กœ ์ง์› ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--๐Ÿ“Œ์˜ค๋‹ต
select d.name as department,
       count(*)
from employees e inner join departments d on e.department_id=d_id --inner join:์ง์›์ด ์žˆ๋Š” ๋ถ€์„œ๋งŒ ๋ณด์—ฌ์ค€๋‹ค.(์˜ค๋‹ต/๋ชจ๋“  ๋ถ€์„œ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•จ.)
group by d.name;
--๐Ÿ’กํ•ด์„ค
select e.name as department,
       count(e.id) --count ํ•  ๋•Œ null์ผ ๊ฐ€๋Šฅ์„ฑ(๋ณ€๋™๋  ๊ฐ€๋Šฅ์„ฑ)์ด ์ ์€ ์ปฌ๋Ÿผ์„ ์ ๋Š” ๊ฒŒ ์•ˆ์ „ํ•จ.
from departments d --๊ธฐ์ค€ ํ…Œ์ด๋ธ”๋กœ ์„ค์ •(๋ฌธ์ œ๊ฐ€ '๋ถ€์„œ๋ณ„๋กœ ์ง์› ์ˆ˜~)
	left join employees e on d.id=e.department_id --๋ถ€์„œ์— ์ง์›์ด 0๋ช…์ธ ๋ถ€์„œ๋„ ํฌํ•จ์ด์–ด์„œ 'left join'์‚ฌ์šฉ.
group by d.name;

//42. ์ง์›์ด ์—†๋Š” ๋ถ€์„œ์˜ ์ด๋ฆ„์„ ์ฐพ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select d.name as department
       count(e.id) as cnt_employee
from departments d
     left join employees e
     on d.id=e.department_id
group by d.name
having count(e.id)=0;
--๐Ÿ’ก๊ถŒ์žฅ
SELECT d.name
FROM departments d LEFT JOIN employees e ON d.id = e.department_id
WHERE e.id IS NULL; --๋‹จ์ˆœ null๊ฐ’์„ ์กฐํšŒํ•  ๋•Œ๋Š” where๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ.

//43. '๋งˆ์ผ€ํŒ…ํŒ€' ๋ถ€์„œ์—๋งŒ ์†ํ•œ ์ง์›๋“ค์˜ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select e.name
from employees e
     inner join departments d
     on e.department_id=d.id
where d.name='๋งˆ์ผ€ํŒ…ํŒ€';
<์˜ค๋‹ต๋…ธํŠธ>
41. ๋ฌธ์ œ์— ๋”ฐ๋ผ ๊ธฐ์ค€ํ…Œ์ด๋ธ”๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค.
      ํ‘ผ ๊ฒƒ์ฒ˜๋Ÿผ employees ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€ํ…Œ์ด๋ธ”๋กœ ์„ค์ •ํ•˜๋ฉด, ์ง์›์ด ์—†๋Š” ๋ถ€์„œ๋Š” ์กฐํšŒ๋˜์ง€ ์•Š๋Š”๋‹ค.
      '๋ถ€์„œ๋ณ„๋กœ ์ง์› ์ˆ˜'๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— (1)๋ชจ๋“  ๋ถ€์„œ๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋ฉฐ (2)๋งŒ์•ฝ ์ง์›์ด ์—†์œผ๋ฉด ๊ทธ ๋ถ€์„œ์˜ ์ง์›์ˆ˜๋Š” 0์œผ๋กœ ํ‘œ์‹œ.
42. ๋‹จ์ˆœ null๊ฐ’์„ ์กฐํšŒํ•˜๋ฉด ๋  ๋•Œ๋Š” where๋กœ ๊ฐ€๋ฒผ์šด ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ.
      **LEFT JOIN์—์„œ NULL ์กฐํšŒ**
      LEFT JOIN์—์„œ ๋งค์นญ๋˜์ง€ ์•Š์€ ํ–‰์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์ค€ ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋ฉฐ,
      ๊ทธ์ค‘์—์„œ๋„ NULL์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ๊ณ ์œ  ์‹๋ณ„์ž(PK)๋ฅผ ๊ธฐ์ค€์œผ๋กœ NULL ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๋‹ค.

11) last

//44. ๋ชจ๋“  ์ฃผ๋ฌธ์˜ ์ฃผ๋ฌธ ID์™€ ์ฃผ๋ฌธ๋œ ์ƒํ’ˆ์˜ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select o.id, p.name
from orders o inner join products p on o.product_id=p.id;

//45. ์ด ๋งค์ถœ(price * quantity์˜ ํ•ฉ)์ด ๊ฐ€์žฅ ๋†’์€ ์ƒํ’ˆ์˜ ID์™€ ํ•ด๋‹น ์ƒํ’ˆ์˜ ์ด ๋งค์ถœ์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select p.id,
       sum(p.price * o.quantity) as sum_price
from products p
     inner join orders o
     on p.id=o.product.id
group by p.id
order by sum(p.price * o.quantity) desc
limit 1;

//46. ๊ฐ ์ƒํ’ˆ ID๋ณ„๋กœ ํŒ๋งค๋œ ์ด ์ˆ˜๋Ÿ‰(quantity)์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select p.id,
       sum(o.quantity) as sum_qty --์–ด๋–ค ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์˜จ ์ปฌ๋Ÿผ์ธ์ง€ ๊ผญ ํ‘œ๊ธฐ!!
from products p
     left join orders o
     on p.id=o.product_id
group by p.id;

//47. 2023๋…„ 3์›” 3์ผ ์ดํ›„์— ์ฃผ๋ฌธ๋œ ๋ชจ๋“  ์ƒํ’ˆ์˜ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
-์ •๋‹ต
select p.name
from products p inner join orders o on p.id=o.product_id
where o.order_date > '2023-03-03';

//48. ๊ฐ€์žฅ ๋งŽ์ด ํŒ๋งค๋œ ์ƒํ’ˆ์˜ ์ด๋ฆ„์„ ์ฐพ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select p.name,
       sum(o.quantity) as total_qty
from products p inner join orders o on p.id=o.product_id
group by p.name
order by sum(quantity) desc
limit 1;

//49. ๊ฐ ์ƒํ’ˆ ID๋ณ„๋กœ ํ‰๊ท  ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต
select p.id,
       avg(o.quantity) as avg_qty
from products p inner join orders o on p.id=o.product_id
group by p.id;

//50. ํŒ๋งค๋˜์ง€ ์•Š์€ ์ƒํ’ˆ์˜ ID์™€ ์ด๋ฆ„์„ ์ฐพ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”!
--์ •๋‹ต.
select p.id, p.name
from products p left join orders o on p.id=o.product_id
where o.quantity is null; --o.quantity๋Š” ๋‹จ์ˆœ ๊ธฐ์ž… ๋ˆ„๋ฝ์ผ ์ˆ˜ ์žˆ์–ด์„œ ์‹ค๋ฌด์—์„œ๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ.
--์ฃผ๋ฌธ ์ž์ฒด์˜ ๊ณ ์œ ๊ฐ’์ธ o.id๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์•ˆ์ „ํ•จ.
<์˜ค๋‹ต๋…ธํŠธ>
- select, group by, count() ๋“ฑ ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๊ณ ์œ ๊ฐ’์œผ๋กœ ๋ณ€๋™ ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•จ.
- group by์—์„œ A์ปฌ๋Ÿผ์„ ์‚ฌ์šฉ, ์ปฌ๋ŸผA์™€ ์ปฌ๋ŸผB๊ฐ€ 'ํ•จ์ˆ˜ ์ข…์†์„ฑ(1:1 ๋งค์นญ)'์ด ์žˆ๋‹ค๋ฉด select์— ์ปฌ๋ŸผB๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋จ.(๊ณ ์œ ๊ฐ’์ธ ์ปฌ๋Ÿผ์œผ๋กœ ์‚ฌ์šฉ)

์˜ค๋‹ต๋…ธํŠธ ์ดํ•ฉ

  • ๋ฌธ์ž์—ด ์‚ฌ์šฉ ์‹œ ์ž‘์€๋”ฐ์˜ดํ‘œ('') ์‚ฌ์šฉ
  • select, group by, count() ๋“ฑ ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๊ณ ์œ ๊ฐ’์œผ๋กœ ๋ณ€๋™ ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•จ.
  • group by์—์„œ A์ปฌ๋Ÿผ์„ ์‚ฌ์šฉ, ์ปฌ๋ŸผA์™€ ์ปฌ๋ŸผB๊ฐ€ 'ํ•จ์ˆ˜ ์ข…์†์„ฑ(1:1 ๋งค์นญ)'์ด ์žˆ๋‹ค๋ฉด select์— ์ปฌ๋ŸผB๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋จ.
    (๊ณ ์œ ๊ฐ’์ธ ์ปฌ๋Ÿผ์œผ๋กœ ์‚ฌ์šฉ)

# ๋‚ ์งœ ๊ด€๋ จ ํ•จ์ˆ˜

  • DATE_FORMAT('๋‚ ์งœ๊ฐ’(๋ฌธ์ž์—ด)' or ์ปฌ๋Ÿผ, '๋‚ ์งœ ์ถœ๋ ฅ ํฌ๋งท(๋ฌธ์ž์—ด)')
    : ๋‚ ์งœ(Date/Datetime)๋ฅผ ์‚ฌ๋žŒ์ด ์›ํ•˜๋Š” “๋ฌธ์ž์—ด ํ˜•์‹”์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜
    [Data Type: Str/Varchar]
ํฌ๋งท ์˜๋ฏธ ์˜ˆ์‹œ
%Y ์—ฐ๋„(4์ž๋ฆฌ) 2025
%y ์—ฐ๋„(2์ž๋ฆฌ) 25
%m ์›”(01~12) 12
%d ์ผ(01~31) 27
%Y-%m ์—ฐ-์›” 2025-12
%Y-%m-%d ์—ฐ-์›”-์ผ 2025-12-27
%H:%i:%s ์‹œ:๋ถ„:์ดˆ 14:30:00
  • DATE('๋‚ ์งœ๊ฐ’ ์‹œ๊ฐ„๊ฐ’' or ์ปฌ๋Ÿผ)
    : ๋‚ ์งœ/์‹œ๊ฐ„ ๊ฐ’์—์„œ ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœ
    [Data Type: DATE]
  • YEAR('๋‚ ์งœ๊ฐ’(๋ฌธ์ž์—ด)' or ์ปฌ๋Ÿผ)
    : ๋‚ ์งœ(Date / Datetime)์—์„œ ‘์—ฐ๋„(๋…„๋„)’๋งŒ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜
    [Data Type: INT]
  • CURDATE()
    : ํ˜„์žฌ ๋‚ ์งœ ์ถœ๋ ฅ
    [Data Type: DATE]
  • NOW()
    : ํ˜„์žฌ ๋‚ ์งœ/์‹œ๊ฐ„ ์ถœ๋ ฅ
    [Data Type: DATETIME]
  • DATEDIFF(date1, date2)
    : ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ‘์ผ(day)’ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    ๊ณ„์‚ฐ: date1 - date2

    **๋‹จ์ˆœ ์ผ์ฐจ ๊ณ„์‚ฐ / ์ •ํ™•ํ•œ ๋‚ ์งœ ๊ธฐ์ค€์˜ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ๋Š” 'DATE_SUB() ํ•จ์ˆ˜ ์‚ฌ์šฉ'
    [Data Type: INT]
  • DATE_SUB(๊ธฐ์ค€ ๋‚ ์งœ, INTERVAL ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ)
    : '๊ธฐ์ค€ ๋‚ ์งœ'์—์„œ '์‹œ๊ฐ„ ๊ฐ„๊ฒฉ'๋งŒํผ ์ด์ „ (-)
    ** ์—ฐ์ฐจ / ๊ทผ์† / ๋‚˜์ด ๊ณ„์‚ฐ ๋“ฑ ์ •ํ™•ํ•œ ์ผ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•  ๋•Œ๋Š” ์ด ํ•จ์ˆ˜ ์‚ฌ์šฉ.

    [Data Type: DATE]
  • DATE_ADD(๊ธฐ์ค€ ๋‚ ์งœ, INTERVAL ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ)
    : '๊ธฐ์ค€ ๋‚ ์งœ'์—์„œ '์‹œ๊ฐ„ ๊ฐ„๊ฒฉ'๋งŒํผ ์ดํ›„ (+)
    ** ์—ฐ์ฐจ / ๊ทผ์† / ๋‚˜์ด ๊ณ„์‚ฐ ๋“ฑ ์ •ํ™•ํ•œ ์ผ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•  ๋•Œ๋Š” ์ด ํ•จ์ˆ˜ ์‚ฌ์šฉ.
    [Data Type: DATE]

# ๋žญํ‚น ์ง‘๊ณ„ ํ•จ์ˆ˜

  • rank() over(partition by ์ˆœ์œ„๋ฅผ ๋‚˜๋ˆ ์„œ ๋งค๊ธธ ๊ธฐ์ค€(์„ ํƒ) order by ์ˆœ์œ„ ๊ธฐ์ค€ [ASC | DESC](ํ•„์ˆ˜))
    :RANK()๋Š” ์ •๋ ฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๋˜, ๊ฐ™์€ ๊ฐ’์€ ๊ฐ™์€ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ๋‹ค์Œ ์ˆœ์œ„๋Š” ๊ฑด๋„ˆ๋›ด๋‹ค.
    - partition by : ํ•ด๋‹น ๊ธฐ์ค€๋งˆ๋‹ค ์ˆœ์œ„ ๋ฆฌ์…‹ (ex.๊ฐ ๊ตญ๊ฐ€ ๋‚ด์—์„œ ๊ฒฝ์Ÿํ•  ๋•Œ)
  • DENSE_RANK()
    : ๋™์ฒจํ—ˆ์šฉ, ๋‹ค์Œ์ˆœ์œ„ ์•ˆ ๊ฑด๋„ˆ๋œ€.
  • ROW_NUMBER()
    : ๋™์  ๋ฌด์‹œ, ๋ฌด์กฐ๊ฑด 1์”ฉ ์ฆ๊ฐ€

# JOIN

  • ๋ฌธ์ œ์— ๋”ฐ๋ผ ๊ธฐ์ค€ํ…Œ์ด๋ธ”๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค.
    ํ‘ผ ๊ฒƒ์ฒ˜๋Ÿผ employees ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€ํ…Œ์ด๋ธ”๋กœ ์„ค์ •ํ•˜๋ฉด, ์ง์›์ด ์—†๋Š” ๋ถ€์„œ๋Š” ์กฐํšŒ๋˜์ง€ ์•Š๋Š”๋‹ค.
    '๋ถ€์„œ๋ณ„๋กœ ์ง์› ์ˆ˜'๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— (1)๋ชจ๋“  ๋ถ€์„œ๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋ฉฐ (2)๋งŒ์•ฝ ์ง์›์ด ์—†์œผ๋ฉด ๊ทธ ๋ถ€์„œ์˜ ์ง์›์ˆ˜๋Š” 0์œผ๋กœ ํ‘œ์‹œ.
  • ๋‹จ์ˆœ null๊ฐ’์„ ์กฐํšŒํ•˜๋ฉด ๋  ๋•Œ๋Š” where๋กœ ๊ฐ€๋ฒผ์šด ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ.
    **LEFT JOIN์—์„œ NULL ์กฐํšŒ**
    LEFT JOIN์—์„œ ๋งค์นญ๋˜์ง€ ์•Š์€ ํ–‰์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์ค€ ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋ฉฐ,
    ๊ทธ์ค‘์—์„œ๋„ NULL์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ๊ณ ์œ  ์‹๋ณ„์ž(PK)๋ฅผ ๊ธฐ์ค€์œผ๋กœ NULL ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๋‹ค.