[SQL] JOIN

hyunsooSong·2022년 5월 22일
0

SQL

목록 보기
3/14
post-thumbnail

👨‍👨‍👧‍👦 JOIN

1. CROSS JOIN (or Cartesian Product)

💡 CROSS JOIN은 Cartesian Product라고도 하는데, 테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 말한다. 결과는 양쪽 집합의 M*N건의 데이터 조합이 발생한다.

  • 아래 두 SQL은 같은 결과를 나타낸다. 결과 : M*N

SELECT ENAME, DNAME
FROM EMP, DEPT
ORDER BY ENAME;

카타시안 프로덕트 표기법 = AXB

SELECT ENAME, DNAME
FROM EMP CROSS JOIN DEPT
ORDER BY ENAME;


2. LEFT OUTER JOIN, RIGHT OUTER JOIN

💡 'LEFT OUTER JOIN'은 조인 수행시 먼저 표기된 좌측 테이블에 해당하는 데이터를 먼저 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 데이터를 읽어온다. ( 'RIGHT OUTER JOIN'은 우측 테이블에 해당하는 데이터를 먼저 읽어온다. )

  • Table A와 B가 있을 때 B의 JOIN 컬럼에서 같이 값이 있을 경우 그 값을 가져오지만 같은 값이 없을 경우 B 테이블에서 가져오는 컬럼들은
    'NULL 값'으로 채운다.

[OS]

OSID (PK)OS명
100Android
200iOS
300Bada

[단말기]

단말기ID (PK)단말기명OSID (FK)
1000A100
2000B200
3000C300

[고객]

고객번호 (PK)고객명단말기ID (FK)
11000홍길동1000
12000강감찬NULL
13000이순신NULL

SELECT a.고객번호, a.고객명, b.단말기ID, c.OSID
FROM 고객 a LEFT OUTER JOIN 단말기 b
    ON (a.고객번호 IN (11000, 12000) AND a.단말기ID = b.단말기ID)
    LEFT OUTER JOIN OS c
    ON (b.OSID = c.OSID)
ORDER BY a.고객번호;

[✔ SQL 쿼리 결과 테이블]

고객번호고객명단말기IDOSID (FK)
11000홍길동1000100
12000강감찬NULLNULL
13000이순신NULLNULL

3. FULL OUTER JOIN

💡 FULL OUTER JOIN은 조인 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN 하여 결과를 생성한다.

  • Table A와 B가 있을 때 RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다. (합집합은 UNION으로 표기한다.)
✅ 아래 세개의 SQL은 모두 같은 FULL OUTER JOIN을 나타낸다.

SELECT A.ID, B.ID
FROM A FULL OUTER JOIN B ON A.ID = B.ID;

SELECT A.ID, B.ID
FROM A LEFT OUTER JOIN B ON A.ID = B.ID
UNION
SELECT A.ID, B.ID
FROM A RIGHT OUTER JOIN B ON A.ID = B.ID;

SELECT A.ID, B.ID
FROM A INNER JOIN B ON A.ID = B.ID
UNION ALL
SELECT A.ID, NULL
FROM A
WHERE NOT EXISTS (SELECT 1 FROM B WHERE A.ID = B.ID)
UNION ALL
SELECT NULL, B.ID
FROM B
WHERE NOT EXISTS (SELECT 1 FROM A WHERE B.ID = A.ID);



+ 👀 틈새 지식

✅ ORACLE에서의 OUTER JOIN 표기 : (+)를 Inner쪽 테이블에 붙인다.

[Oracle]

SELECT A.ID, B.ID
FROM A, B
WHERE A.ID = B.ID (+)
    AND B.이름(+) = 'SONG'
    AND A.이름 = 'HYUN';

[ANSI 표준]

SELECT A.ID, B.ID
FROM A LEFT OUTER JOIN B
    ON (A.ID = B.ID AND B.이름 = 'SONG')
WHERE A.이름 = 'HYUN';

profile
🥕 개발 공부 중 🥕

0개의 댓글