week 7 hyowon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

Join์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ๋‹ค ์„ค๋ช…

  1. ๋‚ด๋ถ€ ์กฐ์ธ(cross join, inner join, equi join, non-equi join, natural join)

  2. ์™ธ๋ถ€ ์กฐ์ธ(left outer join, right outer join, full outer join)

1. ๋‚ด๋ถ€ ์กฐ์ธ

  • cartesian join (cross join) : ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ณฑ์ง‘ํ•ฉ.
# ๋ช…์‹œ์  ํ‘œํ˜„๋ฒ• (explicit notation)
SELECT *
FROM employees
  CROSS JOIN dept_emp;

# ์•”๋ฌต์  ํ‘œํ˜„๋ฒ• (implicit notation)
SELECT *
FROM employees, dept_emp;
  • INNER JOIN : ๋‘ ํ…Œ์ด๋ธ”์˜ ์กฐ๊ฑด๋ฌธ์„ ์ถฉ์กฑ์‹œํ‚ค๋Š” ๊ต์ง‘ํ•ฉ
-- ๋‚ด๋ถ€ ์กฐ์ธ (INNER JOIN) && ๋“ฑ๊ฐ€ ์กฐ์ธ(EQUI JOIN)

# ๋ช…์‹œ์  ํ‘œํ˜„๋ฒ• (explicit notation)
SELECT *
FROM employees
  INNER JOIN dept_emp
    ON employees.emp_no = dept_emp.emp_no;

# ์•”๋ฌต์  ํ‘œํ˜„๋ฒ• (implicit notation)
SELECT *
FROM employees, dept_emp
WHERE employees.emp_no = dept_emp.emp_no;
  • EQUI JOIN : ์กฐ๊ฑด๋ฌธ์—์„œ ๋™๋“ฑ ๋น„๊ต๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ์ธ. ์œ„ ์˜ˆ์ œ ์ฐธ๊ณ .

  • NON-EQUI JOIN : ๋™๋“ฑ๋น„๊ต๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์กฐ์ธ. (๋ฒ”์œ„, ๋น„๊ต ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์กฐ์ธ.)

# ์•”๋ฌต์  ํ‘œํ˜„๋ฒ• (implicit notation)
SELECT *
FROM employees, departments
WHERE employees.emp_no between 10003 and 10004;
  • NATURAL JOIN : ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๋™์ผํ•œ ์ปฌ๋Ÿผ๋ช…์„ ๊ฐ€์ง„ ๊ฒƒ๋“ค๋กœ ์กฐ์ธ
-- ๊ผญ PK๊ฐ€ ์•„๋‹Œ ์ปฌ๋Ÿผ๋„ ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด ์ค‘๋ณต์ œ๊ฑฐํ•จ
-- ๊ทธ๋ž˜์„œ ์“ธ์ผ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.
SELECT * 
FROM member NATURAL JOIN member_info;

mysql์—๋Š” ๋‹ค๋ฅธ RDB์—์„œ ์ง€์›๋˜๋Š”๊ฒŒ ์ง€์›๋˜์ง€ ์•Š๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž์˜ ๋ถ€์กฑ ํƒ“์œผ๋กœ ๋ณด์ž„. 2006๋…„์— ์ด๋ฏธ full outer join ๊ฐœ๋ฐœ ์š”์ฒญ์ด ์žˆ์—ˆ์œผ๋‚˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„ ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์Œ.(๋งํฌ)

2. ์™ธ๋ถ€ ์กฐ์ธ

  • LEFT OUTER JOIN : ํ…Œ์ด๋ธ” a์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์™€ ํ…Œ์ด๋ธ” b์™€ ๊ต์ง‘ํ•ฉ์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์กฐ์ธ
# ๋ช…์‹œ์  ํ‘œํ˜„๋ฒ• (explicit notation)
SELECT *
FROM employees
  LEFT OUTER JOIN departments
    ON employees.dept_no = departments.dept_no;
  • RIGHT OUTER JOIN : ํ…Œ์ด๋ธ” b์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์™€ ํ…Œ์ด๋ธ” a์™€ ๊ต์ง‘ํ•ฉ์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์กฐ์ธ
-- ์˜ค๋ฅธ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ (RIGHT OUTER JOIN)
# ๋ช…์‹œ์  ํ‘œํ˜„๋ฒ• (explicit notation)
SELECT *
FROM employees
  RIGHT OUTER JOIN departments
    ON employees.dept_no = departments.dept_no;
  • FULL OUTER JOIN : ํ…Œ์ด๋ธ” a, b๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ์กฐ์ธ. mysql ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ union์„ ํ™œ์šฉํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
# ๋ฐฉ๋ฒ•1 : JOIN์™€ UINION(์ค‘๋ณต์ œ๊ฑฐ)
SELECT *
  FROM table1
  LEFT OUTER JOIN table2
    ON table1.n = table2.n
UNION
SELECT *
  FROM table1
 RIGHT OUTER JOIN table2
    ON table1.n = table2.n;

# ๋ฐฉ๋ฒ•2 : UNION ALL(์ค‘๋ณต๋ฏธ์ œ๊ฑฐ) and exclusion join
SELECT *
FROM table1
  LEFT OUTER JOIN table2
    ON table1.n = table2.n
UNION ALL
SELECT *
FROM table1
  RIGHT OUTER JOIN table2
    ON table1.n = table2.n
WHERE table1.n IS null; // ??????
  • SELF JOIN : ์ž๊ธฐ ์ž์‹ ๊ณผ ์กฐ์ธ
# ์•”๋ฌต์  ํ‘œํ˜„๋ฒ• (implicit notation)
SELECT A.first_name AS EmployeeName1, B.first_name AS EmployeeName2, A.dept_no
FROM employees AS A, employees AS B
WHERE A.emp_no <> B.emp_no
AND A.dept_no = B.dept_no;
  • ANTI JOIN : ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฉ”์ธ ์ฟผ๋ฆฌ์—์„œ ์ถ”์ถœ
SELECT *
FROM employees AS e
WHERE emp_no >= 10002
      AND NOT EXISTS(SELECT *
                     FROM departments AS d
                     WHERE e.dept_no = d.dept_no
                           AND d.dept_no >= 2);
  • SEMI JOIN : ์„œ๋ธŒ ์ฟผ๋ฆฌ ๋‚ด์—์„œ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ์„ ๊ฐ€์ง€๊ณ  ๋ฉ”์ธ ์ฟผ๋ฆฌ์—์„œ ์ถ”์ถœ
# EXISTS ์‚ฌ์šฉ
SELECT *
FROM departments as d
WHERE EXISTS(SELECT *
             FROM employees AS e
             WHERE e.dept_no = d.dept_no
                   AND e.emp_no >= 10003);

# IN ์‚ฌ์šฉ
SELECT *
FROM departments as d
WHERE d.dept_no IN (SELECT e.dept_no
                    FROM employees AS e
                    WHERE e.emp_no >= 10003);

์ •๊ทœํ™”, ์—ญ์ •๊ทœํ™”๋Š” ๋ฌด์—‡์ธ์ง€?

์ •๊ทœํ™”(normalization) : ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ๊ด€๋ฆฌํ•ด ๋””์Šคํฌ ๊ณต๊ฐ„ ๋‚ญ๋น„๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ, ํ•จ์ˆ˜์  ์ข…์†์œผ๋กœ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฆด๋ ˆ์ด์…˜์„ ๋ถ„ํ•ดํ•˜๋Š” ๊ณผ์ •

์—ญ์ •๊ทœํ™”(denormalization) : ์„ฑ๋Šฅ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต๋œ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •.

์ •๊ทœํ™”์™€ ์—ญ์ •๊ทœํ™”์˜ ์ฐจ์ด

  1. ์ •๊ทœํ™”๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”๋กœ ๋‚˜๋ˆ„๊ณ , ์—ญ์ •๊ทœํ™”๋Š” ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ผ ํ…Œ์ด๋ธ”๋กœ ๊ฒฐํ•ฉ
  2. ์ •๊ทœํ™”๋Š” OLTP ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ์‚ฝ์ž…, ์‚ญ์ œ, ์—…๋ฐ์ดํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š”๋ฐ ์ค‘์ ์„ ๋‘๊ณ , ์—ญ์ •๊ทœํ™”๋Š” OLAP ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์†๋„๋ฅผ ๋†’์ด๋Š”๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.
  3. ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ. ์ •๊ทœํ™” ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ์œ ์ง€๋˜๋Š” ๋ฐ˜๋ฉด ์—ญ์ •๊ทœํ™”์—์„œ๋Š” ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  4. ์ค‘๋ณต ๋ฐ์ดํ„ฐ. ์ •๊ทœํ™”์—์„œ๋Š” ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ์—ญ์ •๊ทœํ™”์—์„œ๋Š” ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  5. ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธ ์ˆ˜. ์ •๊ทœํ™”์—์„œ๋Š” ์ฆ๊ฐ€ํ•˜๋‚˜, ์—ญ์ •๊ทœํ™”์—์„œ๋Š” ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  6. ๋””์Šคํฌ ๊ณต๊ฐ„. ์ •๊ทœํ™”์—์„œ๋Š” ์ตœ์ ํ™”๋˜๋‚˜ ์—ญ์ •๊ทœํ™”์—์„œ๋Š” ๋” ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค.

์ƒํ™ฉ์— ๋”ฐ๋ผ ์ •๊ทœํ™”, ์—ญ์ •๊ทœํ™”๋ฅผ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ •๊ทœํ™”๋Š” ๋” ๋น ๋ฅธ ์“ฐ๊ธฐ ์„ฑ๋Šฅ(์‚ฝ์ž…, ์‚ญ์ œ, ์—…๋ฐ์ดํŠธ)์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๊ณ , ์—ญ์ •๊ทœํ™”๋Š” ์ฝ๊ธฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ€ป ๋น„์ •๊ทœํ™”(unnormalized form)๋Š” ๋‹ค๋ฅด๋‹ค. ์ด๊ฑด 1NF ์ด์ „ ๋‹จ๊ณ„๋กœ, ์ •๊ทœํ™”๋˜๊ธฐ ์ด์ „์˜ ๋‚ ๊ฒƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งํ•œ๋‹ค. DB์™€ table์„ ํšจ์œจ์ ์œผ๋กœ ์—ญ์ •๊ทœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  ์ •๊ทœํ™”๋˜์–ด์•ผ ํ•œ๋‹ค.

์ด์ƒ

ํ…Œ์ด๋ธ”์—์„œ ์ผ๋ถ€ ์†์„ฑ๋“ค์˜ ์ข…์†์œผ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๊ณ , ์ด ์ค‘๋ณต์œผ๋กœ ์ธํ•ด ํ…Œ์ด๋ธ” ์กฐ์ž‘์‹œ ๋ฌธ์ œ

  • ์‚ญ์ œ์ด์ƒ : ์›์น˜ ์•Š๋Š” ์ž๋ฃŒ๊นŒ์ง€ ์‚ญ์ œ๊ฐ€ ์ด๋ค„์ง
  • ์‚ฝ์ž…์ด์ƒ : ์›์น˜ ์•Š๋Š” ์ž๋ฃŒ๊ฐ€ ์‚ฝ์ž…๋๊ฑฐ๋‚˜ ์ž๋ฃŒ๊ฐ€ ๋ถ€์กฑํ•ด ์‚ฝ์ž…์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ 
  • ๊ฐฑ์‹ ์ด์ƒ : ์ผ๋ถ€ ํŠœํ”Œ๋งŒ ๊ฐฑ์‹ ๋˜๊ฑฐ๋‚˜, ๊ฐฑ์‹ ๋˜์ง€ ์•Š์Œ. ๊ทธ๋ž˜์„œ ์ •๋ณด๊ฐ€ ๋ชจํ˜ธํ•ด์ง€๊ฑฐ๋‚˜ ์ผ๊ด€์„ฑ์ด ์—†์–ด์ง.

ํ•จ์ˆ˜์  ์ข…์†

A๊ฐ’์„ ์•Œ๋ฉด B๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜, A์— ๋”ฐ๋ผ B๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค๋ฉด, B๋Š” A์— ์ข…์†๋˜์–ด ์žˆ๋‹ค.

  • ์™„์ „ํ•จ์ˆ˜ ์ข…์† : ๋ฆด๋ ˆ์ด์…˜์—์„œ ํ•œ ์†์„ฑ์ด ์˜ค์ง ๊ธฐ๋ณธํ‚ค์—๋งŒ ์ข…์†๋˜๋Š” ๊ฒฝ์šฐ
  • ๋ถ€๋ถ„ํ•จ์ˆ˜ ์ข…์† : ๋ฆด๋ ˆ์ด์…˜์—์„œ ํ•œ ์†์„ฑ์ด ๊ธฐ๋ณธํ‚ค๊ฐ€ ์•„๋‹Œ ์†์„ฑ์— ์ข…์†๋˜๊ฑฐ๋‚˜, ๊ธฐ๋ณธํ‚ค๊ฐ€ ์—ฌ๋Ÿฌ ์†์„ฑ์œผ๋กœ ์ข…์†๋œ ๊ฒฝ์šฐ ๊ธฐ๋ณธํ‚ค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์†์„ฑ ์ค‘ ์ผ๋ถ€๋งŒ ์ข…์†๋˜๋Š” ๊ฒฝ์šฐ
  • ์ดํ–‰์  ํ•จ์ˆ˜ ์ข…์† : X โ†’ Y, Y โ†’ Z ์ธ ์ข…์†๊ด€๊ณ„์ธ ๊ฒฝ์šฐ X โ†’ Z ๊ฐ€ ์„ฑ๋ฆฝ๋˜๋Š” ๊ฒฝ์šฐ. (X๋ฅผ ์•Œ๋ฉด Y๋ฅผ ์•Œ๊ณ  ๊ทธ๋ฅผ ํ†ตํ•ด Z๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ)

์ •๊ทœํ˜•์˜ 6 ์ข…๋ฅ˜

1NF, 2NF, 3NF, BCNF, 4NF, 5NF