์ ๋จธ๋ฆฌ ์ฐ๊ธฐ ์ซ๋ค..
๋ด๊ฐ ๋ณด๋ ค๊ณ ์ ๋ฆฌ
ํค์๋๋ณ๋ก ๊ตฌ๊ธ๊ฒ์ + GPT + ์ฑ ๋ณด๊ณ ์ ๋ฆฌ์ค
JOIN๊น์ง๋ง ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ๊ณ ๊ทธ ๋ค์๊บผ๋ ๊ทธ๋ฅ ํผ์์ ๋ณด๊ณ ์๊ธฐ๋ง ํด์ผ ๊ฒ ๋ค...
์ ๋ฆฌํ๋ค๊ฐ ์ปจ๋์ ๊ด๋ฆฌ ์ ๋ ๋ฏ ใ ใ ใ ....
์ด์ฐจํผ ๋ณต์ตํ๋๊ฑฐ๋ผ ๊ฐ๋ ์ ๋ค ์๊ณ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ๋ง ์ ๋ฆฌํ๊ฑฐ
ํฐ์คํ ๋ฆฌ ํ ๊ธฐ๋ฅ ๊ตฌ๋ ค๋ ๋๋ฌด ๊ตฌ๋ฆฌ๋ค
ํ๋ฅผ ๋ง๋ค๋ฉด ์ ๋ฉ๋๋ก ์์์ด ์น ํด์ง๊ณ ํ ๋๋ฆฌ๊ฐ ์๋ณด์ < ์ง์ง ๋ชป์ฐ๊ฒ ๋ค
์ธ๋ด์ฌ ํ ์คํธ..
ํฌํ ์ต๋ง ๊น๋ ค์์ผ๋ฉด ๋ง๋๋๋ฐใ ใ ํ.....
๋ค์๋ถํฐ๋ Google Spread Sheet๋ก ๋ง๋ค์ด์ผ๊ฒ ์
์ฐธ๊ณ ๋ก 2024.11.17 ๊ธฐ์ค
๋ด์ฉ๋ฌผ ์ค ํ์ ์ ์๋ณด์ด๊ณ ๋ฐฐ๊ฒฝ์ ๋ง์๋๋ก ์น ํด์ง ๊ฑด ๋ด๊ฐ ๊ณ ์น ์ ์๋ ๋ถ๋ถ์ด ์๋
ํ ์คํธ์๋ํฐ์์๋ ๋ฌธ์ ์์ด ๋ณด์ฌ๋ ๋ฐํํ๋ฉด ๋ค ๊นจ์ ธ์์,
๋ช๋ฒ์ ์์ ํด๋ ๋ต์ด ์๋๋ฐ ๋ด์ผ ์ค์ ์ ๋น์ฅ SQL ์๊ฒฉ ์ํ์ด๋ผ
๊ธํ๋ฐ๋ก ํ ์ญ์ ํ๊ณ ํ ์คํธ์๋ํฐ์์ ์บก์ฒํด์ ๋ถ์ฌ๋ฃ๊ธฐํจ
EQUI JOIN VS Non EQUI JOIN
- `EQUI JOIN`์ `Equal(=)` ์กฐ๊ฑด์ผ๋ก JOIN
- `Non EQUI JOIN`์ ๊ทธ ์ธ ์กฐ๊ฑด(BETWEEM, >, >=, <, <=)์ผ๋ก JOIN
โEQUI JOIN๊ณผ Non EQUI JOIN์ ํ๋์ ์ฟผ๋ฆฌ์์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
โญํ ์ด๋ธ ๊ฐ์ PK, FK์ ์ฐ๊ด๊ด๊ณ๊ฐ ์์ด๋ JOIN์ด ๊ฐ๋ฅํ๋ค.
โญNon EQUI JOIN์ ๊ฒฝ์ฐ JOIN ์ปฌ๋ผ์ด๋ผ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ SELECT ์ ์์ A.COL1์ B.COL1๋ก ๋์ฒด ํ ์ ์๋ค. p.124 <-> p.128์์๋ ๊ฐ๋ฅ
โญJOIN ๋๋ ๋ ํ ์ด๋ธ์ ๋ชจ๋ ์กด์ฌํ๋ ์ปฌ๋ผ์ ๊ฒฝ์ฐ ์ปฌ๋ผ๋ช ์์ ๋ฐ๋์ ํ ์ด๋ธ๋ช ์ด๋ ALIAS๋ฅผ ๋ช ์ ํด ์ฃผ์ด์ผ ํ๋ค. ํ์ชฝ์๋ง ์กด์ฌํ๋๋ผ๋ ALIAS ๋ช ์ํด ์ฃผ์ด์ผ ํ๋ค. ์? SQL์ ํด๋น ์ปฌ๋ผ์ ์ด๋์ชฝ ํ ์ด๋ธ์์ ๊ฐ์ ธ์ฌ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ
JOIN ์ข ๋ฅ
์ฐ๋ฆฌ๊ฐ ์ฐ๋ ํต์ ์ฌ๊ฐ SKT, KT, LG ๋ฑ์ด ์๋ฏ์ด DBMS์์๋ ๋ฒค๋๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ค. ๋ฒค๋๋ณ๋ก ๊ตฌ๋ถ ํด ๋ณด์๋ฉด Oracle, SQL Server(MSSQL), MySQL, MariaDB ๋ฑ์ด ์๋ค. ๋ฒค๋๋ง๋ค SQL๋ฌธ๋ฒ์ ์ฐจ์ด๊ฐ ๋๋ฌด ํด ๊ฒฝ์ฐ ํธํ์ฑ ์ด์๊ฐ ๋ฐ์ํ๊ณ SQL์ ์ฌ์ฉํ๋ ์ฌ๋๋ค ์ ์ฅ์์๋ ํจ์จ์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ด ํ์ค์ด ๋๋ ANSI SQL์ ์ง์ ํ๊ฒ ๋์๋ค. STANDARD JOIN์ ANSI JOIN ์ค ํ๋๋ก ์ฝ๊ฒ ๋งํด Oracle ์์๋ ๋์๊ฐ๊ณ MySQL์์๋ ๋์๊ฐ๋ JOIN ์ฟผ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. STANDARD JOIN ๋ณด๋ค๋ ANSI JOIN, ํ์ค ์กฐ์ธ์ด๋ผ๋ ๋ง์ด ๋ง์ด ์ฐ์ธ๋ค.
`INNER JOIN`์ ๋ ํ ์ด๋ธ์์ ์ผ์นํ๋ ํ๋ง ๋ฐํ
`OUTER JOIN` ๋ ํ ์ด๋ธ์์ ์ผ์นํ์ง ์๋ ํ๋ ๊ฒฐ๊ณผ์ ํฌํจ์ํค๋ฉฐ, LEFT, RIGHT, FULL๋ก ๋๋จ
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
`NATURAL JOIN`
- ๋์ผํ ์ด๋ฆ์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก JOIN
- ์ค๋ณต๋ ์ปฌ๋ผ์ด ํ๋๋ง ๋ฐํ
`CROSS JOIN`
๋ฐ์นด๋ฅดํธ ๊ณฑ(Cartesian Product)์ผ๋ก ๋ ํ ์ด๋ธ์ ๋ชจ๋ ์กฐํฉ์ ๋ฐํ(ํ ์ด๋ธ1์ ํ ์ * ํ ์ด๋ธ2์ ํ ์)
`SELF JOIN`
SELECT e1.id, e1.name, e2.name AS manager_name
FROM employees e1
JOIN employees e2
ON e1.manager_id = e2.id;
Employees ํ ์ด๋ธ์ ์๊ธฐ ์์ ๊ณผ ์กฐ์ธํ์ฌ, ๊ฐ ์ง์์ ๋งค๋์ ์ด๋ฆ์ ํ์ํฉ๋๋ค.
1. INNER JOIN
p.128
๋ค์ SQL ์ค ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ํ๋๋ ๋ฌด์์ธ๊ฐ? 3
// 1
SELECT A.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1;
// 2
SELECT A.COL1, B.COL2
FROM SAMPLE1 A INNER JOIN SAMPLE2 B
ON A.COL1 = B.COL1;
// 3
SELECT A.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1(+);
// 4
SELECT B.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1;
4์ ๊ฒฝ์ฐ EQUI JOIN์ด๊ธฐ ๋๋ฌธ์ SELECT ์ ์์ A.COL1์ B.COL1๋ก ๋์ฒด ๊ฐ๋ฅ
๋ ์ฟผ๋ฆฌ๋ ๊ฐ์ ๊ฒฐ๊ณผ ๋์ถ
// 1
SELECT B.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1;
// 4
SELECT B.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1;
p.124
Non EQUI JOIN์ ๊ฒฝ์ฐ JOIN ์ปฌ๋ผ์ด๋ผ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ SELECT ์ ์์ A.COL1์ B.COL1๋ก ๋์ฒดํ ์ ์๋ค.
๋ ์ฟผ๋ฆฌ๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ ๋์ถ
// 1
SELECT A.COL1, B.COL3
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 >= B.COL1
AND A.COL1 <= B.COL2;
// 2
SELECT A.COL1, B.COL3
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 >= B.COL1
AND A.COL1 <= B.COL2;
2. OUTER JOIN
JOIN ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๋ฐ์ดํฐ๊ฐ ์๋์ด๋ ์ถ๋ ฅ๋ ์ ์๋ ๋ฐฉ์์ด๋ค.
LEFT OUTER JOIN
์ผ์ชฝ์ ํ๊ธฐ๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ ๋ฌด์กฐ๊ฑด ์ถ๋ ฅ๋๋ JOIN์ด๋ค. ๋์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ JOIN๋๋ ๋ฐ์ดํฐ๊ฐ ์๋ Row๋ค์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ ์ปฌ๋ผ์ ๊ฐ์ด NULL๋ก ์ถ๋ ฅ ๋๋ค.
SELECT A.PRODUCT_CODE,
A.PRODUCT_NAME,
B.MEMBER_ID,
B.CONTENT,
B.REG_DATE
FROM PRODUCT A LEFT OUTER JOIN PRODUCT_REVIEW B
ON A.PRODUCT_CODE = B.PRODUCT_CODE;
์ด ๊ฒฝ์ฐ ์ํ ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ ๋ค ๋์จ๋ค.
Oracle์์๋ LEFT OUTER JOIN์ (+) ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ํํํ ์ ์๋ค. (+)๋ ๊ธฐ์ค์ด ๋๋ ํ ์ด๋ธ์ ๋ฐ๋์ชฝ ํ ์ด๋ธ์ ๋ถ์ธ๋ค.
LEFT OUTER JOIN ํ๊ณ ์ถ์ผ๋ฉด ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ (+)๋ถ์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ์กฐ์ธ ์กฐ๊ฑด์ ON์ด ์๋๋ผ WHERE ์ ์ ์จ ์ค๋ค.
SELECT A.PRODUCT_CODE,
A.PRODUCT_NAME,
B.MEMBER_ID,
B.CONTENT,
B.REG_DATE
FROM PRODUCT A, PRODUCT_REVIEW B
WHERE A.PRODUCT_CODE = B.PRODUCT_CODE(+);
RIGHT OUTER JOIN
์์ ๊ฐ๋ค
p.136 ๋ฌธ์
๋ค์ SQL์ ๊ฒฐ๊ณผ๋ก ๊ฐ์ฅ ์ ์ ํ ๊ฒ์?
[SQL]
SELECT *
FROM SAMPLE1 A RIGHT OUTER JOIN SAMPLE2 B
ON (A.COL1=B.COL1 AND B.COL2 IS NOT NULL);
[๊ฒฐ๊ณผ]
์ผ๋จ SAMPLE2์ ๋ฐ์ดํฐ๋ ๋ชจ๋ ์ถ๋ ฅ ๋์ง๋ง, (A.COL1 = B.COL1 AND B.COL2 IS NOT NULL)์ ๋ง์กฑํ๋ SAMPLE1์ ๋ฐ์ดํฐ๋ง ์กฐ์ธ๋์ด ์ต์ข ์ ์ผ๋ก ํจ๊ป ์ถ๋ ฅ ๋๋ค.
p.138 ๋ฌธ์
๋ค์ SQL์ ๊ฒฐ๊ณผ๋ก ๊ฐ์ฅ ์ ์ ํ ๊ฒ์?
[SQL]
SELECT *
FROM SAMPLE1 RIGHT OUTER JOIN SAMPLE2 B
ON A.COL1 = B.COL1
WHERE B.COL2 IS NOT NULL;
[๊ฒฐ๊ณผ]
OUTER JOIN์์ ๊ธฐ์ค์ด ๋๋ ํ ์ด๋ธ์ ํญ์ ๋ชจ๋ ์ถ๋ ฅ๋์ง๋ง ์ต์ข ์ ์ผ๋ก WHERE ์กฐ๊ฑด์ ์ํด ํํฐ๋ง์ ๊ฑฐ์น๊ฒ ๋๋ค.
SELECT *
FROM SAMPLE1 RIGHT OUTER JOIN SAMPLE2 B
ON A.COL1 = B.COL1
์์ฒ๋ผ WHERE์ ์ด ์๋ ๊ฒฝ์ฐ COL1์ด 3์ธ Row๋ JOIN์ ์ฑ๊ณตํ์ฌ ์ถ๋ ฅ๋์ง๋ง WHERE B.COL2 IS NOT NULL ์กฐ๊ฑด์ ์ํด ํํฐ๋ง์ด ๋์ด ์ต์ข ์ ์ผ๋ก๋ ์ถ๋ ฅ๋์ง ์๋๋ค.
FULL OUTER JOIN
์ผ์ชฝ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ถ๋ ฅ๋๋ ๋ฐฉ์์ด๋ค. LEFT OUTER JOIN๊ณผ RIGHT OUTER JOIN์ ํฉ์งํฉ๋๋ค. (๋จ, ์ค๋ณต๊ฐ์ ์ ๊ฑฐ)
3. NATURAL JOIN
Aํ ์ด๋ธ๊ณผ Bํ ์ด๋ธ์์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ปฌ๋ผ๋ค์ด ๋ชจ๋ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ JOIN์ด ๋๋ ๋ฐฉ์์ด๋ค. MYSQL์์๋ ์ง์ํ์ง ์๋๋ค. p.141
๊ฐ์ ์ด๋ฆ์ ์ปฌ๋ผ ์ค ๊ฐ์ด ๋์ผํ์ง ์์ ๋ฐ์ดํฐ์ผ ๋๋ JOIN ์ ์ถ๋ ฅ๋์ง ์๋๋ค.
์ด ๋ USING ์กฐ๊ฑด์ ์ ์ด์ฉํ์ฌ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ปฌ๋ผ ์ค ์ํ๋ ์ปฌ๋ผ๋ง JOIN์ ์ด์ฉ ํ ์ ์๋ค.
CAST, GENDER, JOB ์ ๊ฐ์ง ํ ์ด๋ธ 2๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ... ๋ง์ฝ ์ฒซ๋ฒ์งธ ํ ์ด๋ธ์์๋ ์ธ์คํด์ค์ JOB๊ฐ๊ณผ ๋๋ฒ์งธ ํ ์ด๋ธ์์์ JOB์ด ๋์ผํ์ง ์์ ์ํฉ์ธ ๊ฒ์ด๋ค. ๊ทธ ๋ USING (CAST, GENDER) ํด ์ฃผ๋ฉด JOB์ด ๋ฌ๋ผ๋ JOIN ๊ฒฐ๊ณผ์ ์ถ๋ ฅ๋๋ค.
4. CROSS JOIN
๋ค์ SQL๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ SQL์?
[SQL]
SELECT BOY_NAME, GIRL_NAME
FROM GIRL, BOY B;
๋ณ๋์ JOIN ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ ๋ ํ ์ด๋ธ์ Cartesian Product(์นดํฐ์ ๊ณฑ)๊ฐ ๋๋ค. CROSS JOIN์ A ํ ์ด๋ธ๊ณผ B ํ ์ด๋ธ ์ฌ์ด์ JOIN ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ, ์กฐํฉํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ถ๋ ฅํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
SELECT BOY_NAME, GIRL_NAME
FROM GIRL CROSS JOIN BOY;
์ ํฐ์คํ ๋ฆฌ ํ ๊ธฐ๋ฅ ๊ตฌ๋ ค์ ๋ชป์ฐ๊ฒ ๋ค ์ง์ง๋ก....
'Coding > SQL&DataBase' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQLD] ์ค๋ต์ ๋ฆฌ & ์๋ธ์ฟผ๋ฆฌ & ์งํฉ์ฐ์ฐ์ UNION, UNION ALL (7) | 2024.11.17 |
---|---|
[SQLD] NULL ๊ด๋ จ ํจ์, CASE, DECODE, SQL์คํ์์ (5) | 2024.11.16 |
[SQLD] SQL ๊ธฐ๋ณธ ํจ์ (๋ฌธ์์ด, ์ซ์, ๋ ์ง ๋ฑ) (7) | 2024.11.16 |
[SQLD] ์ ๊ทํ, ๋ฐ์ ๊ทํ (36) | 2024.11.16 |
[SQLD] ๋ฐ์ดํฐ๋ชจ๋ธ๋ง์ ์ดํด (6) | 2024.11.16 |