๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ›‹๏ธ ๋ฐ์ดํ„ฐ ๋ถ„์„/๐Ÿ“‚ SQL

JOIN ์‹œ USING๊ณผ ON์˜ ์ฐจ์ด ; ๊ธฐ๋Šฅ&์„ฑ๋Šฅ(์†๋„)

by ์œ ์Šค :) 2024. 12. 7.
๋ฐ˜์‘ํ˜•

<์š”์•ฝ ์„ค๋ช…>

  • ON ์ ˆ
    • ์กฐ์ธํ•  ์—ด ์ด๋ฆ„์ด ๋‹ค๋ฅผ ๋•Œ ์‚ฌ์šฉ
    • ์ถ”๊ฐ€์ ์ธ ํ•„ํ„ฐ๋ง ๋กœ์ง์ด ํ•„์š”ํ•  ๋•Œ (e.g AND, OR)
    • ๋” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ์—์„œ ์กฐ๊ฑด ๋…ผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • USING ์ ˆ
    • ์กฐ์ธํ•  ์—ด ์ด๋ฆ„์ด ๋™์ผํ•˜๊ณ  ๋‹จ์ˆœ์„ฑ์„ ์›ํ•  ๋•Œ
    • ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์กฐ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์ตœ์ ํ™”๋œ SQL์„œ๋ฒ„์—์„œ ON๊ณผ USING ๊ฐ„์˜ ์„ฑ๋Šฅ์ฐจ์ด๋Š” ํฌ์ง€ ์•Š๋‹ค๊ณ  ํ•œ๋‹ค. 

 

< ์ƒ์„ธ ์„ค๋ช…>

์šฐ์„  ON์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

SELECT I.NAME, I.ANIMAL_TYPE
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID=O.ANIMAL_ID

 

๊ทธ๋ฆฌ๊ณ  USING์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๊ฐ€ ๋œ๋‹ค.

SELECT I.NAME, I.ANIMAL_TYPE
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O USING (ANIMAL_ID)

 

๋‘˜ ๋‹ค ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • USING
    • ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ํ…Œ์ด๋ธ”์˜ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ์ปฌ๋Ÿผ ๋ช…์ด ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค. 
    • ๋’ค์— ์ถ”๊ฐ€์ ์œผ๋กœ AND ์กฐ๊ฑด์„ ๋ถ™์ผ ์ˆ˜ ์—†๋‹ค.

๋‘ ๋ฒˆ์งธ AND ์กฐ๊ฑด์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

-- USING 
SELECT I.NAME, I.ANIMAL_TYPE, O.DATETIME
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O USING (ANIMAL_ID)
WHERE DATE_FORMAT(O.DATETIME, '%Y-%m') > 2016-04

-- ON
SELECT I.NAME, I.ANIMAL_TYPE, O.DATETIME
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID=O.ANIMAL_ID AND DATE_FORMAT(O.DATETIME, '%Y-%m') > 2016-04 
ORDER BY O.DATETIME

 

JOIN ๋’ค์— AND๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์กฐ๊ฑด์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ถ™์ด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ,

ON์€ ๊ทธ๋Œ€๋กœ AND ์กฐ๊ฑด์„ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ USING์˜ ๊ฒฝ์šฐ WHERE์ ˆ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

๋˜ํ•œ ๋‘˜์˜ ๊ฒฐ๊ณผ๊ฐ’ ์—ญ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. 

USING, WHERE ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
ON, AND ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

  • USING -> WHERE์ ˆ์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— NULL์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฐ๊ณผ๊ฐ’์ด ์ถ”์ถœ๋จ
    • (๋ถ€๊ฐ€์„ค๋ช…) SQL์—์„œ NULL๊ฐ’์€ ์–ด๋– ํ•œ ๊ฐ’๊ณผ๋„ ๊ฐ™์ง€ ์•Š๋‹ค๋Š” ์ ์ด ํ•ต์‹ฌ์ด๋‹ค. ๋”ฐ๋ผ์„œ WHERE DATE_FORMAT(O.DATETIME, '%Y-%m') > 2016-04 ์—์„œ DATETIME์ด NULL์ธ ๊ฒฝ์šฐ, ์ด ์กฐ๊ฑด์€ FALSE๋กœ ํ‰๊ฐ€๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ NULL์ธ ํ–‰์€ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์—์„œ ์ œ์™ธ ๋œ๋‹ค. 
  • ON -> NULL๊ฐ’์ด์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ๋‹ค. 

๋”ฐ๋ผ์„œ USING์€ INNER JOIN์˜ ๊ฒฝ์šฐ์— ๊ถŒ์žฅ๋œ๋‹ค.

 

๋˜ํ•œ ์„ฑ๋Šฅ์ ์ธ ๋น„๊ต์—์„œ๋Š” ๋‘˜์˜ ์ฐจ์ด๊ฐ€ ๋ณ„๋กœ ์—†๋‹ค.

  • ์ฒ˜๋ฆฌ ์†๋„: ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์ตœ์ ํ™”๋œ SQL ์„œ๋ฒ„์—์„œ ON๊ณผ USING ๊ฐ„์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ํฌ์ง€ ์•Š์œผ๋ฉฐ, ๋‘ ์ฟผ๋ฆฌ๋Š” SQL ์ตœ์ ํ™”๊ธฐ์— ์˜ํ•ด ๋น„์Šทํ•œ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
  • ์‹œ์Šคํ…œ ๋ถ€๋‹ด: ์‹œ์Šคํ…œ ๋ถ€๋‹ด์€ ์ฟผ๋ฆฌ์˜ ๋ณต์žก์„ฑ, ์‚ฌ์šฉ๋˜๋Š” ์ธ๋ฑ์Šค ๋ฐ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ๊ณผ ๋” ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ, ON๊ณผ USING์˜ ์„ ํƒ์— ์˜ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ๋ช…ํ™•์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜: USING์€ SQL ์ฟผ๋ฆฌ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด์ง€๋งŒ, ON์€ ๋ณต์žกํ•œ ์กฐ๊ฑด์ด ํ•„์š”ํ•  ๋•Œ ์„ ํ˜ธ๋œ๋‹ค.
๋ฐ˜์‘ํ˜•