728x90
01. 표준조인 (STANDARD JOIN)
사용자 입장에서 쉽게 데이터를 추출하고 SQL 업그레이드 효과를 얻을 수 있는 SQL 기능 중 하나이다
일반 집합 연산자
일반 집합 연산자 | 현재의 SQL |
UNION | UNION |
INTERSECTION | INTERSECT |
DIFFERENCE | EXCEPT(Oracle은 MINUS) |
PRODUCT | CROSS JOIN |
순수 관계 연산자
일반 집합 연산자 | 현재의 SQL |
SELECT | WHERE 절 |
PROJECT | SELECT 절 |
(NATURAL) JOIN | JOIN |
DIVIDE | 현재 없어짐 |
02. FROM 절 JOIN 형태
ANSI/ISO SQL 에서 표시하는 FROM 절의 JOIN 형태
내부조인 (INNER JOIN)
JOIN 조건에서 동일한 값이 있는 행만 반환한다. (교집합)
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
-- 위 SQL과 아래 SQL은 같은 결과를 얻을 수 있다
SELECT EMP.DEPTNO, EPMNO, ENAME, DNAME
FROM EMP INNER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;
-- INNER는 JOIN의 디폴트 옵션으로 'INNER JOIN' → 'JOIN' 같이 생략 가능하다
외부조인 (OUTER JOIN)
JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용할 수 있다. (합집합)
- 왼쪽 외부 조인 (LEFT OUTER JOIN): 외부조인에서 왼쪽 테이블에만 있는 값을 포함시켜 조회
- 오른쪽 외부 조인(RIGHT OUTER JOIN): 외부조인에서 오른쪽 테이블에만 있는 값을 포함시켜 조회
[LEFT OUTER JOIN]
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
[RIGHT OUTER JOIN]
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E OUTER OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
[FULL JOIN]
SELECT *
FROM DEPT FULL OUTER JOIN DEPT_TEMP ON DEPT.DEPTNO = DEPT_TEMP.DEPTNO;
NATURAL JOIN
- 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행
- USING 조건절, ON 조건걸, WHERE절에서 JOIN을 정의할 수 없음
- SQL Server 미지원
SELECT DEPTNO, EMPNO, ENAME, DNAME
FROM EMP NATURAL JOIN DEPT;
SELECT EMP.DEPTNNO, EMPNO, ENAME, DNAME
FROM EMP NATURAL JOIN DEPT;
-- ORA-25155: NATURAL JOIN에 사용된 열은 식별자를 가질 수 없음
USING 조건절
- FROM 절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있다
- SQL Server 미지원
SELECT *
FROM DEPT JOIN DEPT_TEMP USING (DEPTNO);
SELECT DEPTNO, DEPT.DNAME, DEPT.LOC, DEPT_TEMP.DNAME, DEPT_TEMP.LOC
FROM DEPT JOIN DEPT_TEMP USING (DEPTNO);
SELECT a.DEPTNO, a.DNAME, a.LOC, b.DNAME, b.LOC
FROM DEPT a JOIN DEPT b USING (DEPTNO);
-- ORA-25154: USING 절의 열 부분은 식별자를 가질 수 없음
ON 조건절
- JOIN 서술부 (ON 조건절)와 비 JOIN 서술부(WHERE 조건절)를 분리하여 이해가 쉬우며, 칼럼명이 다르더라도 JOIN 조건을 사용할 수 있는 장점이 있다
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO);
[WHERE 절과 혼용]
SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
WHERE E.DEPTNO = 30;
[ON 조건절 + 데이터 검증조건 추가]
SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO AND E.MGR = 7698);
[ON 조건절]
SELECT TEAM_NAME, TEAM.STANIUM_ID, STADIUM_NAME
FROM TEAM JOIN STADIUM ON TEAM.STADIUM_ID = STADIUM.STADIUM_ID
ORDER BY STADIUM_ID;
[다중 테이블 JOIN]
SELECT E.EMPNO, D.DEPTNO, D.DNAME, T.DNAME NEW_DNAME
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
JOIN DEPT_TEMP T ON (E.DEPTNO = T.DEPTNO);
CROSS JOIN
- 테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 말한다
SELECT COUNT(*) FROM EMP; -- 10건
SELECT COUNT(*) FROM DEPT; -- 5건
SELECT ENAME, DNAME
FROM EMP CROSS JOIN DEPT
ORDER BY ENAME; -- 55건
728x90
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] SQL 활용 - 계층형 질의 (0) | 2023.08.31 |
---|---|
[SQLD] SQL 활용 - 집합연산자 (SET OPERATOR) (0) | 2023.08.31 |
[SQLD] SQL 기본 - 조인 (0) | 2023.08.31 |
[SQLD] SQL 기본 - ORDER BY 절, TOP() (0) | 2023.08.31 |
[SQLD] SQL 기본 - GROUP BY, HAVING 절 (0) | 2023.08.31 |