MySQL

MySQL) ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ” ์กฐ์ธํ•˜๊ธฐ

567Rabbit 2024. 5. 16. 16:15

์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์‹œ ์™ธ๋ž˜ํ‚ค(foreign key) ์„ค์ •ํ•˜๊ธฐ

 

 

 

decimal(8,2)๋Š” ์†Œ์ˆซ์ ์„ ํ•ฉ์ณ์„œ 8์ž๋ฆฌ, ์†Œ์ˆซ์  ์•„๋ž˜ 2์ž๋ฆฌ๊ฐ€ ํ‘œํ˜„๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

***********

 

์™ธ๋ž˜ํ‚ค์— UN(unsigned data type)์„ ์ฒดํฌํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

 

customers ํ…Œ์ด๋ธ”์˜ id(๊ธฐ๋ณธํ‚ค)๊ฐ€ UN(unsigned data type)์ด ์ฒดํฌ๋˜์–ด, ์–‘์ˆ˜๊ฐ’๋งŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ

์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” customer_id ๋˜ํ•œ UN(unsigned data type)์œผ๋กœ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋งž์ถฐ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

***********

 

 

 

 

Foreign Key Name์€ ์•Œ์•„์„œ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

Referenced Table๋Š” ์ฐธ์กฐํ•  ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๊ณ ,

Referenced Column์„ customer ํ…Œ์ด๋ธ”์˜ id ์ปฌ๋Ÿผ๊ณผ, order ํ…Œ์ด๋ธ”์˜ customer_id ์ปฌ๋Ÿผ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

 

์กฐ์ธํ•˜๊ธฐ

- as๋Š” ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ , ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค

 

select *
from students as s
join papers as p
on s.id = p.student_id ;

 

๋˜๋Š”

 

select *
from papers p
join students s
on p.student_id = s.id ;

 

 

 

 

LEFT JOIN ๊ณผ RIGHT JOIN

 

 

๋งŒ์•ฝ ํ•™์ƒํ…Œ์ด๋ธ”์˜ ํ•™์ƒ์ด paperํ…Œ์ด๋ธ”์— ์—†๋”๋ผ๋„, ๋ชจ๋“  ํ•™์ƒ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด, left join๊ณผ right join์„ ์‚ฌ์šฉํ•œ๋‹ค.

left join์€ ์™ผ์ชฝ์˜ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๊ณ , right join ์€ ์˜ค๋ฅธ์ชฝ์˜ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

join๋œ ํ…Œ์ด๋ธ”์€ ๋ฐ์ดํ„ฐ์˜ ์˜ค๋ฅธ์ชฝ์— ๋ถ™์–ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ,

 

select *
from A
join B
on ~ ;

 

A๊ฐ€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”, B๊ฐ€ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ

 

 

 

select *
from students as s
left join papers as p
on s.id = p.student_id ;  ์ด๋ฉด students ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ณด์—ฌ์ฃผ๋ฉฐ



select *
from students as s
right join papers as p
on s.id = p.student_id ;  ์ด๋ฉด papers์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ณด์—ฌ์ค€๋‹ค.

 

 

 

 

 

์กฐ๊ฑด๋ฌธ์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ์กฐ์ธ ํ…Œ์ด๋ธ”

 

-- 2019๋…„ 12์›” 20์ผ๋ถ€ํ„ฐ 2020๋…„ 1์›” 10์ผ ์‚ฌ์ด์˜ ์ฃผ๋ฌธ๋ฐ์ดํ„ฐ์—์„œ 

-- ๊ณ ๊ฐ๋ณ„ ์ฃผ๋ฌธ๊ธˆ์•ก ํ‰๊ท ์ด 300๋‹ฌ๋Ÿฌ ์ด์ƒ์ธ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„๊ณผ ํ‰๊ท ๊ธˆ์•ก์„ ๊ฐ€์ ธ์˜ค์„ธ์š”

 

select c.first_name, c.last_name , avg(o.amount) as avg_amount
from orders o
join customers c
on o.customer_id = c.id
where between '2019-12-20' and '2020-01-10'
group by c.id having avg_amount >= 300
order by avg_amount desc;