INNER JOIN (내부 조인)개념: 두 테이블을 연결할 때, 조인 조건에 일치하는 행들만을 결과에 포함시키는 가장 기본적인 조인 방식입니다.
동작: ON 절에 명시된 조인 조건(e.g., EMP.DEPTNO = DEPT.DEPTNO)을 만족하는 데이터의 조합(교집합)만을 반환합니다.
문법:
SELECT E.ENAME, D.DNAME
FROM EMP E
INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
-- INNER는 생략 가능
SELECT E.ENAME, D.DNAME
FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
OUTER JOIN (외부 조인)개념: INNER JOIN과 달리, 조인 조건에 일치하지 않는 행도 어느 한쪽 테이블을 기준으로 결과에 포함시키는 조인 방식입니다.
목적: 기준이 되는 테이블의 모든 데이터를 보존하고 싶을 때 사용합니다. (e.g., 부서에 배정되지 않은 신입사원도 목록에 포함시키고 싶을 때)
종류:
LEFT OUTER JOIN: 왼쪽 테이블의 모든 행을 기준으로, 오른쪽 테이블에 일치하는 데이터가 없으면 해당 컬럼을 NULL로 채워서 반환합니다.RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행을 기준으로, 왼쪽 테이블에 일치하는 데이터가 없으면 NULL로 채워서 반환합니다.FULL OUTER JOIN: 양쪽 테이블의 모든 행을 기준으로, 어느 한쪽에 일치하는 데이터가 없으면 NULL로 채워서 반환합니다. (합집합)-- LEFT OUTER JOIN 예시: 부서가 없는 사원도 조회
SELECT E.ENAME, D.DNAME
FROM EMP E
LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
SELF JOIN (자체 조인)EMP) 내에서, 각 사원의 이름과 그 사원의 관리자(사수) 이름을 함께 조회하고 싶을 때.-- 사원(E)과 관리자(M)로 별칭을 부여하여 SELF JOIN
SELECT E.ENAME AS "사원명", M.ENAME AS "관리자명"
FROM EMP E
JOIN EMP M ON E.MGR = M.EMPNO; -- 사원의 관리자번호(MGR)와 관리자의 사원번호(EMPNO)를 조인SELECT, INSERT, UPDATE, DELETE) 내부에 포함된 SELECT 문으로, 복잡한 조회를 간결하게 만들어 줍니다. 괄호()로 감싸야 합니다.| 위치 | 종류 | 설명 | 반환 값 형태 |
|---|---|---|---|
SELECT 절 | 스칼라 서브쿼리 (Scalar Subquery) | • SELECT 목록에 포함되어, 외부 쿼리의 각 행에 대해 하나의 값을 반환. | 단일 값 (1행 1열) |
FROM 절 | 인라인 뷰 (Inline View) | • 서브쿼리의 결과를 하나의 가상 테이블처럼 사용. | 테이블 (다중 행, 다중 열) |
WHERE, HAVING 절 | 중첩 서브쿼리 (Nested Subquery) | • 조건절에서 비교 값으로 사용. • 단일 행, 다중 행, 다중 열 등 다양한 형태 가능. | 단일 행, 다중 행, 다중 열 |
WHERE 절에서 사용되는 서브쿼리는 반환하는 행의 수에 따라 사용 가능한 연산자가 달라집니다.| 종류 | 설명 | 사용 가능 연산자 |
|---|---|---|
| 단일 행 서브쿼리 | 서브쿼리의 실행 결과가 하나의 행만 반환. | =, >, <, >=, <=, <> |
| 다중 행 서브쿼리 | 서브쿼리의 실행 결과가 여러 개의 행을 반환. | IN, ANY, ALL, EXISTS |
IN: 서브쿼리 결과 중 하나와 일치하면 TRUE.ANY (또는 SOME): 서브쿼리 결과 중 하나라도 조건을 만족하면 TRUE. (e.g., > ANY는 최소값보다 크면 TRUE)ALL: 서브쿼리 결과 모두를 만족하면 TRUE. (e.g., > ALL은 최대값보다 크면 TRUE)EXISTS: 서브쿼리의 결과가 존재하면 TRUE. (결과값 자체는 중요하지 않음)-- 단일 행 서브쿼리 예시: 'JONES'의 급여보다 많이 받는 사원
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'JONES');
-- 다중 행 서브쿼리 예시: 30번 부서의 사원들과 동일한 직업을 가진 사원
SELECT ENAME, JOB
FROM EMP
WHERE JOB IN (SELECT JOB FROM EMP WHERE DEPTNO = 30);
INNER JOIN은 조건에 맞는 교집합 데이터만, OUTER JOIN은 기준 테이블의 모든 데이터를 포함하여 조회합니다.SELECT, FROM, WHERE)와 반환하는 행의 수(단일 행, 다중 행)에 따라 종류가 나뉘며, 그에 맞는 연산자를 사용해야 합니다.