제1절_표준_조인(STANDARD_JOIN)
2012.03.19 06: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 같은 새로운 개념의 분석기능
가.일반 집합 연산자
![SQL_200.jpg](http://bysql.net/files/attach/images/22118/011/023/1176b6f457b478ad1ecc27ae73fc1dec.jpg)
- 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;
![20120318_194706.png](http://bysql.net/files/attach/images/22118/011/023/8710ab00408eadc8325384ad3d78c855.png)
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;
![20120318_195452.png](http://bysql.net/files/attach/images/22118/011/023/344279bab49c37978182f2371c618261.png)
SELECT * 실행시 INNER JOIN과 NATURAL JOIN의 JOIN 컬럼 처리
![이미지 3.png](http://bysql.net/files/attach/images/22118/011/023/1b88d682c2c0550197cfe06c8db223f6.png)
![이미지 2.png](http://bysql.net/files/attach/images/22118/011/023/01ef37dd44f82044de3aa6bcdf1fcfcb.png)
5. USING 조건절
NATURAL JOIN의경우 같은 명칭의 모든 컬럼이 JOIN에 참여하나
FROM절의 USING 조건절을 이용하여 같은 이름을 같는 컬럼중
원하는 컬럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있음.
--USING조건절을 이용하여 JOIN에서 특절 컬럼만 JOIN에 참여 하도록 지정
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
USING (DEPARTMENT_ID);
![이미지 4.png](http://bysql.net/files/attach/images/22118/011/023/80430570640ce79ed90b0c9de214af66.png)
--USING조건절에서는 ALIAS 사용불가
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
USING (EMPLOYEES.DEPARTMENT_ID);
![이미지 5.png](http://bysql.net/files/attach/images/22118/011/023/bc51f19566a9868cf940fa1748af6f3a.png)
6.ON절
JOIN 서술부(ON조건절)와 비JOIN 서술부(WHERE 조건절)을 분리하여 이해하기 편함
컬럼명이 달라도 JOIN조건으로 사용할 수 있음.
--ON조건절을 이용하여 JOIN에 참여하는 컬럼 지정(ALIAS 사용가능)
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID);
![이미지 6.png](http://bysql.net/files/attach/images/22118/011/023/82a4b0603d8d5c1cb128ea888827174d.png)
가.WHEE 절과의 혼용
--ON조건절과 WHERE 조건절을 혼용하여 사용 가능
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
WHERE DEPARTMENTS.DEPARTMENT_ID = 50;
![이미지 7.png](http://bysql.net/files/attach/images/22118/011/023/989e4c89c5dd772c99b94c18b2561f7e.png)
나.ON조건절 + 데이터 검증 조건 추가
ON조건절에 JOIN 조건절 이외에 데이터 검색조건을 추가할 수 있음 (WHERE 절 사용 권장)
--ON조건절과 데이터 검증 조건 추가
SELECT *
FROM EMPLOYEES JOIN DEPARTMENTS
ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
AND DEPARTMENTS.DEPARTMENT_ID = 50;
![이미지 8.png](http://bysql.net/files/attach/images/22118/011/023/4b2e71e29edf76e7b4f1aaf61635b56a.png)
다.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);
![이미지 10.png](http://bysql.net/files/attach/images/22118/011/023/73d656ca829cc607864a0284f9e62d8f.png)
--다중 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);
![이미지 11.png](http://bysql.net/files/attach/images/22118/011/023/cf7f8df76039f40690d4ff78709c14c6.png)
7.CROSS JOIN(CARTESIAN PRODUCT)
JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합
--CRONSS JOIN
SELECT *
FROM EMPLOYEES CROSS JOIN DEPARTMENTS;
![이미지 12.png](http://bysql.net/files/attach/images/22118/011/023/51fd32db477bf65ce83dbec3baed745d.png)
--CRONSS JOIN(WHERE 조건 사용 --> INNER JOIN과 결과 동일)
SELECT *
FROM EMPLOYEES CROSS JOIN DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
![이미지 13.png](http://bysql.net/files/attach/images/22118/011/023/ea71bfe98b4aeb678715046f3a965238.png)
8.OUTER JOIN
JOIN 조건에서 동일한 값이 없는 행도 반활할 때 사용
LEFT/RIGHT/FULL OUTER 3종류가 존재
![SQL_202.jpg](http://bysql.net/files/attach/images/22118/011/023/4e17c44951ea7ce0d9ce01568fb205cf.jpg)
가.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;
![이미지 14.png](http://bysql.net/files/attach/images/22118/011/023/d2044aa2d624c06600a10bc16ebb639d.png)
나.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;
![이미지 15.png](http://bysql.net/files/attach/images/22118/011/023/43c2e722cd2b9563ebbd157bc4010129.png)
다.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);
![이미지 16.png](http://bysql.net/files/attach/images/22118/011/023/148b02c435a9f9b680a421e0957dbcd9.png)
9.INNER vs OUTER vs CROSS JOIN 비교
![SQL_203.jpg](http://bysql.net/files/attach/images/22118/011/023/406fc73e411ef30b5e66151448bec88c.jpg)
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
58 |
Front Page
![]() | 운영자 | 2012.02.21 | 186700 |
57 | Week1_이진우 [5] | ljw | 2012.07.16 | 46376 |
56 |
제1절_성능_데이터_모델링의_개요
![]() | ljw | 2012.03.04 | 44547 |
55 | 제4절_고급_조인_기법 | suspace | 2012.06.05 | 31259 |
54 | 제1절_Lock | balto | 2012.05.05 | 25262 |
53 | 제1절_데이터_모델의_이해 | 실천하자 | 2012.03.04 | 22598 |
52 |
제5절_식별자
![]() | ljw | 2012.03.04 | 18958 |
» |
제1절_표준_조인(STANDARD_JOIN)
![]() | ljw | 2012.03.19 | 15924 |
50 |
제3절_반정규화와_성능
![]() | ljw | 2012.03.04 | 15292 |
49 |
제5절_WHERE_절
![]() | 보라빛고양이 | 2012.03.10 | 14879 |
48 | 제4절_관계(Relationship) [1] | 실천하자 | 2012.03.04 | 13028 |
47 |
제5절_그룹_함수(GROUP_FUNCTION)
![]() | balto | 2012.03.31 | 12458 |
46 |
제2절_소트_튜닝
![]() | ljw | 2012.06.04 | 12025 |
45 | 제4절_서브쿼리 | 오예스 | 2012.03.27 | 11954 |
44 |
제2절_DDL(DATA_DEFINITION_LANGUAGE)
[1] ![]() | balto | 2012.03.09 | 11723 |
43 | 제7절_GROUP_BY_HAVING_절 | suspace | 2012.03.12 | 11531 |
42 | 제1절_데이터베이스_아키텍처 [2] | ljw | 2012.04.23 | 11523 |
41 | Week1_박우창 [1] | balto | 2012.07.17 | 10836 |
40 | 제1절_관계형_데이터베이스_개요 | balto | 2012.03.09 | 10447 |
39 |
제2절_정규화와_성능
![]() | ljw | 2012.03.04 | 10394 |