๐Ÿ”ŽRaw query: ํ…Œ์ด๋ธ” ๊ฒฐํ•ฉ( JOIN )

yeeun leeยท2020๋…„ 5์›” 24์ผ

1. ์ง‘ํ•ฉ ์—ฐ์‚ฐ

ํ…Œ์ด๋ธ”์€ ๋ฐ์ดํ„ฐ ํ–‰์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค. MySQL ์—์„œ๋Š” UNION์œผ๋กœ ํ•ฉ์ง‘ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ณ , ๊ต์ง‘ํ•ฉ ์ฐจ์ง‘ํ•ฉ์€ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.

1.1 ํ•ฉ์ง‘ํ•ฉ UNION

์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ํ•ฉ์น  ๋•Œ, select ๊ตฌ๋ฅผ UNION์œผ๋กœ ํ•ฉ์น˜๋ฉด ํ•ฉ์ง‘ํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ,

  • ๊ฐ ํ…Œ์ด๋ธ”์ด ๊ฒฐํ•ฉ์— ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด์–ด์•ผ ํ•˜๊ณ 
  • Order by๋ฅผ ์ง€์ •ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ select ๋ช…๋ น๋“ค ์ค‘ ๋งˆ์ง€๋ง‰ select ๊ตฌ์—์„œ ์ง€์ •ํ•ด์•ผ ํ•˜๊ณ 
  • ์—ด ์ด๋ฆ„์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋ช…์„ ์ง€์ •ํ•ด์„œ(as)๋ถˆ๋Ÿฌ์ค˜์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•”ํ˜ธํ™”ํ ๊ฑฐ๋ž˜์†Œ์—์„œ ๊ธฐ์ค€ ํ™”ํ(์›ํ™”, ๋น„ํŠธ์ฝ”์ธ๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ ์ฝ”์ธ์„ ์‚ด ์ˆ˜ ์žˆ๋Š” ํ™”ํ), ์•”ํ˜ธ ํ™”ํ๋ฅผ ํ•ฉ์ณ์„œ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ฉ์ณ์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

BTC(๋น„ํŠธ์ฝ”์ธ), GT(์ง€๋‹ฅํ† ํฐ)์€ ์›ํ™”๋กœ ์‚ด ์ˆ˜ ์žˆ๋Š” ์•”ํ˜ธํ™”ํ์ž„๊ณผ ๋™์‹œ์— ๋‹ค๋ฅธ ์ฝ”์ธ์„ ์‚ด ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€ํ™”ํ์ด๋‹ค. ๋•Œ๋ฌธ์— ๋‘ ํ…Œ์ด๋ธ”์˜ code์—ด์„ ํ•ฉํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ union all์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ค‘๋ณต์ด ํฌํ•จ๋˜์–ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค. * ํŽธ์˜์ƒ ์•”ํ˜ธ ํ™”ํ๋Š” A์ˆœ๊นŒ์ง€๋งŒ์œผ๋กœ ์ž˜๋ž๋‹ค.

select base_currencies.code from base_currencies
UNION
select quote_currencies.code from quote_currencies;

#UNION ALL   #UNION 
+-------+   +-------+ 
| code  |   | code  |
+-------+   +-------+
| KRW   |   | KRW   |
| BTC   |   | BTC   |
| GT    |   | GT    |
| AERGO |   | AERGO |
| ATOM  |   | ATOM  |
| ATOMX |   | ATOMX |
| BTC   |   +-------+ 
| GT    |
+-------+ 

union์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ distinct(์ค‘๋ณต ์ œ๊ฑฐ)์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ค‘๋ณต๊นŒ์ง€ ํฌํ•จํ•ด์„œ ๋Œ๋ฆฌ๋ ค๊ณ  ํ•˜๋ฉด UNION ALL ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

select base_currencies.code from base_currencies
UNION ALL 
select quote_currencies.code from quote_currencies;

์ค‘๋ณต ๊ด€๋ จ ํ‚ค์›Œ๋“œ
์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ๋Š” select ๊ตฌ์— distinct, ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” all

2. ๊ฒฐํ•ฉ

2.1 ๊ต์ฐจ ๊ฒฐํ•ฉ cross join

๊ณฑ์ง‘ํ•ฉ, ์ ์ง‘ํ•ฉ, ๋˜๋Š” ์นดํ‹ฐ ์ „๊ณฑ(Cartesian product)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•œ ์‹œ์ฆŒ์— 5ํ™”๊นŒ์ง€ ์žˆ๋Š” ๋“œ๋ผ๋งˆ๊ฐ€ 3์‹œ์ฆŒ๊นŒ์ง€ ๋ฐฉ์˜๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

seasons = { 1,2,3 }
episodes = { 1,2,3,4,5}

season/ep12345
season1 1.1 1.2 1.3 1.4 1.5
season2 2.1 2.2 2.3 2.4 2.5
season3 3.1 3.2 3.3 3.4 3.5

from ๊ตฌ์— ๋ณต์ˆ˜์˜ ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•˜๋ฉด ๊ต์ฐจ ๊ฒฐํ•ฉ์„ ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๊ฒฐ๊ณผ๋Š” ๊ณฑ์ง‘ํ•ฉ์ด ๋œ๋‹ค. union์—ฐ๊ฒฐ์€ ์„ธ๋กœ๋กœ ๋Š˜์–ด๋‚˜์ง€๋งŒ, ๊ฒฐํ•ฉ ์—ฐ๊ฒฐ์€ ๊ฐ€๋กœ๋กœ ๋Š˜์–ด๋‚œ๋‹ค. ๊ณฑ์ง‘ํ•ฉ์œผ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ต์ฐจ ๊ฒฐํ•ฉ๋ณด๋‹ค๋Š” ๋‚ด๋ถ€ ๊ฒฐํ•ฉ์ด ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

2.2 ๋‚ด๋ถ€ ๊ฒฐํ•ฉ inner join

๋‚ด๋ถ€ ๊ฒฐํ•ฉ์€ ๊ณฑ์ง‘ํ•ฉ์—์„œ ์›ํ•˜๋Š” ์กฐํ•ฉ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

- old style example

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด๊ฐ€ user, userwallets ํ…Œ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์ž. user๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , userwallet์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž์‚ฐ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ด ๋•Œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด์™€ ์ž์‚ฐ์„ ํ•จ๊ป˜ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด select ๊ตฌ์— *๋ฅผ, ๋‚ด๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ์ •๋ณด๋งŒ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์„ ๋•Œ์—๋Š” Select๊ตฌ์—์„œ table.column๋ช…์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

select users.name, userwallets.asset_id, userwallets.user_id 
from users, userwallets  
where users.id = userwallets.user_id;

```sql
+-----------+----------+---------+
| name      | asset_id | user_id |
+-----------+----------+---------+
| ํ‚น๋‘˜       |       34 |       5 |
| ํ‚น๋‘˜       |        8 |       5 |
| ์˜ˆ์€       |       34 |       7 |
| ์˜ˆ์€       |        8 |       7 |
+-----------+----------+---------+

- new example

๊ตฌ์‹ ๋ฐฉ๋ฒ•์—์„œ๋Š” from ๊ตฌ์—์„œ ์‰ผํ‘œ๋กœ ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•œ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, table ์‚ฌ์ด์— inner join ํ‚ค์›Œ๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค. ์š”๊ฒŒ ์™ธ๋ถ€ ๊ฒฐํ•ฉ์ด๋‹ค. inner join๋งŒ ๋„ฃ์„ ๊ฒฝ์šฐ ์œ„์™€ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

select users.name, userwallets.asset_id, userwallets.user_id  
from users inner join userwallets 
on users.id = userwallets.user_id;

inner join์„ ํ•  ๊ฒฝ์šฐ์— ์กฐ๊ฑด์„ ๊ฑฐ๋Š” on, where์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฐ˜๋ฉด left join, right join์„ ์‚ฌ์šฉํ•˜๋ฉด where์„ ์“ธ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋–ด๋‹ค.

2.3 ์™ธ๋ถ€ ๊ฒฐํ•ฉ left & right join

๊ฒฐํ•ฉํ•˜๋Š” ํ…Œ์ด๋ธ” ์ค‘ ์–ด๋А ์ชฝ์„ ๊ธฐ์ค€์œผ๋กœ ํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. join์„ ์“ธ ๊ฒฝ์šฐ on์„ ํ†ตํ•ด ๊ฒฐํ•ฉ ์กฐ๊ฑด์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. user ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ left join์„ ํ•  ๊ฒฝ์šฐ userwallets ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ˆ˜ํ˜• ๊ฐ’๋„ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ฉด right join์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด ํ‚น๋‘˜, ์ด์˜ˆ์€์˜ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ˆ˜ํ˜•์ด ์ œ์™ธ๋˜์–ด ๋‚˜์˜จ๋‹ค.

select users.name, userwallets.asset_id, userwallets.user_id 
from users left join userwallets 
on users.id = userwallets.user_id;

+-----------+----------+---------+
| name      | asset_id | user_id |
+-----------+----------+---------+
| ํ‚น๋‘˜       |      34  |       5 |
| ํ‚น๋‘˜       |       8  |       5 |
| ์˜ˆ์€       |      34  |       7 |
| ์˜ˆ์€       |       8  |       7 |
| ์ˆ˜ํ˜•       |    NULL  |    NULL |
+-----------+----------+---------+
select users.name, userwallets.asset_id, userwallets.user_id 
from users right join userwallets 
on users.id = userwallets.user_id;

+-----------+----------+---------+
| name      | asset_id | user_id |
+-----------+----------+---------+
| ํ‚น๋‘˜       |       34 |       5 |
| ํ‚น๋‘˜       |        8 |       5 |
| ์˜ˆ์€       |       34 |       7 |
| ์˜ˆ์€       |        8 |       7 |
+-----------+----------+---------+
profile
์ด์‚ฌ๊ฐ„ ๋ธ”๋กœ๊ทธ: yenilee.github.io

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2020๋…„ 5์›” 24์ผ

์™ธ๋ถ€๊ฒฐํ•ฉ ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„์ธ๋ฐ ์ฐธ๊ณ  ์ž˜ํ–ˆ์–ด์š” ใ…Žใ…Žใ…Ž

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ