제1절_표준_조인(STANDARD_JOIN)
2012.03.18 21:30
1.STANDARD SQL 개요
SQL : 관계형 데이터베이스를 유일하게 접속할 수 있는(다룰 수 있는) 언어.
ANSI/ISO SQL3 : 벤더별로 상이했던 SQL 문법을 호환 가능한 여러 기준을 제정.(oracle 8i/9i)
대표적인 ANSI/ISO 표준 SQL 기능
- STANDARD JOIN 기능 추가(CROSS, OUTER JOIN 등)
- SCALAR SUBQUERY, TOP-N QUERY 등 새로운 SUBQUERY 기능들
- ROLLUP, CUBE, GROUPING SETS 등의 새로운 리포트 기능
- WINDOW FUNCTION 같은 새로운 개념의 분석기능
가.일반 집합 연산자

- UNION 연산 -> UNION
- INTERSECTION 연산 -> INTERSECT
- DIFFERENCE 연산 -> MINUS(EXCEPT)
- PRODUCT 연산 -> CROSS JOIN
나.순수 관계 연산자
- SELECT 연산 -> WHERE
- PROJECT 연산 -> SELECT
- (NATURAL) JOIN 연산 -> JOIN
- DIVIDE 연산 -> 현재 사용되지 않음
2.FROM 절 JOIN 형태
ANSI/ISO SQL의 JOIN 형태
- INNER JOIN
- NATURAL JOIN
- USING 조건절
- ON 조건절
- CROSS JOIN
- OUTER JOIN
3.INNER JOIN
OUTER JOIN의 비교되는 JOIN방식. JOIN 조건에서 동일한 값이 있는 행만 반환
USING, ON 조건절을 필수적으로 사용해야 함
--WHERE절 JOIN
SELECT EMPLOYEES.LAST_NAME, DEPARTMENTS.department_name
FROM EMPLOYEES , DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID;
--FROM절 JOIN
SELECT EMPLOYEES.LAST_NAME, DEPARTMENTS.department_name
FROM EMPLOYEES INNER JOIN DEPARTMENTS
ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID;

4.NATURAL JOIN
두 테이블 간의 동일한 이름을 갖는 모든 컬럼들에 대해 EQUI(=) JOIN을 수행
**NAUTRAL JOIN이 명시되면 USING, ON, WHERE 절에 JOIN 조건을 정의할 수 없다.
--NATURAL JOIN
SELECT EMPLOYEES.LAST_NAME, DEPARTMENTS.department_name
FROM EMPLOYEES NATURAL JOIN DEPARTMENTS;
--NATURAL JOIN(ON 조건절 기술로 에러)
SELECT EMPLOYEES.LAST_NAME, DEPARTMENTS.department_name
FROM EMPLOYEES NATURAL JOIN DEPARTMENTS
ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID;
--NATURAL JOIN(WHERE 조건절 기술로 에러)
SELECT EMPLOYEES.LAST_NAME, DEPARTMENTS.department_name
FROM EMPLOYEES NATURAL JOIN DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID;
--NATURAL JOIN(JOIN 조건으로 사용된 컬럼의 ALIAS 사용으로 에러)
SELECT EMPLOYEES.LAST_NAME, DEPARTMENTS.department_name, DEPARTMENTS.DEPARTMENT_ID
FROM EMPLOYEES NATURAL JOIN DEPARTMENTS;

SELECT * 실행시 INNER JOIN과 NATURAL JOIN의 JOIN 컬럼 처리


5. USING 조건절
NATURAL JOIN의경우 같은 명칭의 모든 컬럼이 JOIN에 참여하나
FROM절의 USING 조건절을 이용하여 같은 이름을 같는 컬럼중
원하는 컬럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있음.
--USING조건절을 이용하여 JOIN에서 특절 컬럼만 JOIN에 참여 하도록 지정
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
USING (DEPARTMENT_ID);

--USING조건절에서는 ALIAS 사용불가
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
USING (EMPLOYEES.DEPARTMENT_ID);

6.ON절
JOIN 서술부(ON조건절)와 비JOIN 서술부(WHERE 조건절)을 분리하여 이해하기 편함
컬럼명이 달라도 JOIN조건으로 사용할 수 있음.
--ON조건절을 이용하여 JOIN에 참여하는 컬럼 지정(ALIAS 사용가능)
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID);

가.WHEE 절과의 혼용
--ON조건절과 WHERE 조건절을 혼용하여 사용 가능
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
WHERE DEPARTMENTS.DEPARTMENT_ID = 50;

나.ON조건절 + 데이터 검증 조건 추가
ON조건절에 JOIN 조건절 이외에 데이터 검색조건을 추가할 수 있음 (WHERE 절 사용 권장)
--ON조건절과 데이터 검증 조건 추가
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
AND DEPARTMENTS.DEPARTMENT_ID = 50;

다.ON 조건절 예제
위에서 설명한 예제와 동일
라.다중 테이블 JOIN
--다중 JOIN
SELECT DEPARTMENTS.DEPARTMENT_ID, DEPARTMENTS.DEPARTMENT_NAME, EMPLOYEES.LAST_NAME, JOBS.JOB_TITLE
FROM EMPLOYEES JOIN DEPARTMENTS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
JOIN JOBS
ON (EMPLOYEES.JOB_ID = JOBS.JOB_ID);

--다중 JOIN(ERROR)
SELECT DEPARTMENTS.DEPARTMENT_ID, DEPARTMENTS.DEPARTMENT_NAME, EMPLOYEES.LAST_NAME, JOBS.JOB_TITLE
FROM EMPLOYEES JOIN DEPARTMENTS JOIN JOBS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
ON (EMPLOYEES.JOB_ID = JOBS.JOB_ID);

7.CROSS JOIN(CARTESIAN PRODUCT)
JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합
--CRONSS JOIN
SELECT *
FROM EMPLOYEES CROSS JOIN DEPARTMENTS;

--CRONSS JOIN(WHERE 조건 사용 --> INNER JOIN과 결과 동일)
SELECT *
FROM EMPLOYEES CROSS JOIN DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID

8.OUTER JOIN
JOIN 조건에서 동일한 값이 없는 행도 반활할 때 사용
LEFT/RIGHT/FULL OUTER 3종류가 존재

가.LEFT OUTER JOIN (OUTER 생략 가능)
좌측 테이블에 해당하는 데이터를 먼저 읽은 후(드라이빙), 우측 테이블에서 JOIN 대상 데이터를 읽음(INNER)
--LEFT OUTER JOIN
SELECT *
FROM EMPLOYEES LEFT OUTER JOIN DEPARTMENTS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
WHERE EMPLOYEES.EMPLOYEE_ID=178;

나.RIGHT OUTER JOIN (OUTER 생략가능)
--RIGHT OUTER JOIN
SELECT *
FROM DEPARTMENTS RIGHT OUTER JOIN EMPLOYEES
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
WHERE EMPLOYEES.EMPLOYEE_ID=178;

다.FULL OUTER JOIN
LEFT OUTER JOIN
UNION
RIGHT OUTER JOIN
--FULL OUTER JOIN
SELECT *
FROM EMPLOYEES A FULL OUTER JOIN DEPARTMENTS B
ON (A.DEPARTMENT_ID = B.DEPARTMENT_ID);

9.INNER vs OUTER vs CROSS JOIN 비교

댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
38 | 제2절_트랜잭션 | 보라빛고양이 | 2012.05.04 | 9062 |
37 | 제4절_데이터베이스_IO_원리 | 운영자 | 2012.04.30 | 6176 |
36 | 제3절_데이터베이스_Call과_네트워크_부하 | 오예스 | 2012.04.30 | 6128 |
35 | 제2절_SQL_파싱_부하 | ljw | 2012.04.22 | 7268 |
34 | 제1절_데이터베이스_아키텍처 [2] | ljw | 2012.04.22 | 11750 |
33 | 제2절_인덱스_기본 | 실천하자 | 2012.04.11 | 6708 |
32 |
제1절_옵티마이저와_실행계획
![]() | suspace | 2012.04.09 | 9067 |
31 | 제8절_절차형_SQL | 보라빛고양이 | 2012.04.01 | 6721 |
30 | 제7절_DCL(DATA_CONTROL_LANGUAGE) | 보라빛고양이 | 2012.04.01 | 7914 |
29 |
제6절_윈도우_함수(WINDOW_FUNCTION)
![]() | balto | 2012.03.30 | 7841 |
28 |
제5절_그룹_함수(GROUP_FUNCTION)
![]() | balto | 2012.03.30 | 12637 |
27 | 제4절_서브쿼리 | 오예스 | 2012.03.27 | 12940 |
26 | 제3절_계층형_질의와_셀프_조인 | 오예스 | 2012.03.27 | 8817 |
25 | 제9절_조인(JOIN) | 실천하자 | 2012.03.19 | 8634 |
24 | 제8절_ORDER_BY_절 | 실천하자 | 2012.03.19 | 6928 |
23 |
제2절_집합_연산자(SET_OPERATOR)
![]() | ljw | 2012.03.18 | 5985 |
» |
제1절_표준_조인(STANDARD_JOIN)
![]() | ljw | 2012.03.18 | 16120 |
21 | 제6절_분산_데이터베이스와_성능 | 오예스 | 2012.03.14 | 7156 |
20 | 제7절_GROUP_BY_HAVING_절 | suspace | 2012.03.11 | 11711 |
19 | 제6절_함수(FUNCTION) | suspace | 2012.03.11 | 8940 |