관계형 데이터베이스의 테이블 안에 있는 행들을 논리에 따라 연결할 수 있도록 하는 기법
조인 기법의 종류
조인 기법 | 설명 |
---|---|
곱집합 (cartesian product) | 가능한 모든 행을 조인 |
동등 조인 (equi join) | 조인 조건이 일치하는 경우 결과 출력 |
비동등 조인 (nonequi join) | 조인 조건이 정확히 일치하지 않는 경우 결과 출력 |
외부 조인 (outer join) | 조인 조건이 정확히 일치하지 않아도 모든 결과 출력 |
자체 조인 (self join) | 자체 테이블에서 조인하고자 할 때 사용 |
동등 조인
예제
SELECT *
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID;
employees 테이블과 departments 테이블과 locations 테이블을 조인하여 각 직원이 어느 부서에 속하는지와 부서의 소재지가 어디인지 조회해 보세요
SELECT A.EMPLOYEE_ID, A.DEPARTMENT_ID, B.DEPARTMENT_NAME, C.LOCATION_ID, C.CITY
FROM EMPLOYEES A, DEPARTMENTS B, LOCATIONS C
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
AND B.LOCATION_ID = C.LOCATION_ID;
외부 조인
EMPLOYEES 테이블과 DEPARTMENTS 테이블을 DEPARTMENT_ID로 외부 조인하여 DEPARTMENT_ID가 NULL 값인 KIMBERELY GRANT도 함께 출력하기
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.LAST_NAME, B.DEPARTMENT_ID, B.DEPARTMENT_NAME
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID(+)
ORDER BY A.EMPLOYEE_ID;
employees 테이블을 자체 조인하여 직원별 담당 매니저가 누구인지 조회하기
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.LAST_NAME, A.MANAGER_ID,
B.FIRST_NAME||' '||B.LAST_NAME MANAGER_NAME
FROM EMPLOYEES A, EMPLOYEES B
WHERE A.MANAGER_ID = B.EMPLOYEE_ID
ORDER BY A.EMPLOYEE_ID;
조인을 사용할 때는 테이블에 별칭을 사용하길 권장
테이블 이름에 별칭을 사용하면 긴 테이블 이름을 축약하여 사용할 수 있음
별칭을 사용하면 SQL문을 간략하게 만들 수 있어 가독성이 높아지고 SQL문을 효율적으로 작성할 수 있음
길게 사용해도 되지만 가급적 짧게 사용하는 것이 좋음
SQL 로직이 복잡할 때는 테이블의 별칭에 의미를 부여해서 사용하는 것도 도움이 됨
집합 연산자는 SELECT 문을 여러 개 연결하여 작성하며, 각 SELECT 문의 조회 결과를 하나로 합치거나 분리할 수 있음
SELECT 열 이름1, 열 이름2, 열 이름3
FROM 테이블 이름
집합 연산자 (UNION, UNION ALL, INTERSET, MINUS)
SELECT 열 이름1, 열 이름2, 열 이름3
FROM 테이블 이름
ORDER BY 열 이름 [ASC or DESC]
집합 연산자의 종류
종류 | 설명 | 집합 종류 |
---|---|---|
UNION | SELECT 문의 조회 결과의 합집합 | |
중복되는 행은 한 번만 출력 | 합집합 | |
UNION ALL | SELECT 문의 조회 결과의 합집합 | |
중복되는 행도 그대로 출력 | 합집합 | |
INTERSET | SELECT 문의 조회 결과의 교집합 | |
중복되는 행만 출력 | 교집합 | |
MINUS | 첫 번째 SELECT 문의 조회 결과에서 두 번째 조회 결과를 뺌 | 차집합 |
employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을 UNION 연산자를 이용해 합치기
SELECT DEPARTMENT_ID
FROM EMPLOYEES
UNION
SELECT DEPARTMENT_ID
FROM DEPARTMENTS;
employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을 UNION ALL 연산자를 이용해 합치기
SELECT DEPARTMENT_ID
FROM EMPLOYEES
UNION ALL
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
ORDER BY DEPARTMENT_ID;
employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합의 교집합을 INTERSECT 연산자를 이용해 출력하기
SELECT DEPARTMENT_ID
FROM EMPLOYEES
INTERSECT
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
ORDER BY DEPARTMENT_ID;
departments 테이블의 department_id 집합에서 employees 테이블의 department_id 집합을 MINUS 연산자를 이용해 빼기
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
MINUS
SELECT DEPARTMENT_ID
FROM EMPLOYEES;