메뉴 건너뛰기

bysql.net

제1절_표준_조인(STANDARD_JOIN)

2012.03.19 06:30

ljw 조회 수:15924

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
  1. UNION 연산 -> UNION
  2. INTERSECTION 연산 -> INTERSECT
  3. DIFFERENCE 연산 -> MINUS(EXCEPT)
  4. PRODUCT 연산 -> CROSS JOIN    SQL_201.jpg

  나.순수 관계 연산자
  1. SELECT 연산 -> WHERE
  2. PROJECT 연산 -> SELECT
  3. (NATURAL) JOIN 연산 -> JOIN
  4. 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


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



SELECT * 실행시 INNER JOIN과 NATURAL JOIN의 JOIN 컬럼 처리
이미지 3.png 이미지 2.png

 

5. USING 조건절
NATURAL JOIN의경우 같은 명칭의 모든 컬럼이 JOIN에 참여하나
FROM절의 USING 조건절을 이용하여 같은 이름을 같는 컬럼중 
원하는 컬럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있음.

--USING조건절을 이용하여 JOIN에서 특절 컬럼만 JOIN에 참여 하도록 지정
SELECT *
  FROM EMPLOYEES JOIN DEPARTMENTS
  USING (DEPARTMENT_ID);
이미지 4.png


--USING조건절에서는 ALIAS 사용불가
SELECT *
  FROM EMPLOYEES JOIN DEPARTMENTS
  USING (EMPLOYEES.DEPARTMENT_ID);  
이미지 5.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


 가.WHEE 절과의 혼용
--ON조건절과 WHERE 조건절을 혼용하여 사용 가능
SELECT *
  FROM EMPLOYEES JOIN DEPARTMENTS
    ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
WHERE DEPARTMENTS.DEPARTMENT_ID = 50;
이미지 7.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


다.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

--다중 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


7.CROSS JOIN(CARTESIAN PRODUCT)
JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합

--CRONSS JOIN
SELECT *
  FROM EMPLOYEES CROSS JOIN DEPARTMENTS;

이미지 12.png

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


8.OUTER JOIN
JOIN 조건에서 동일한 값이 없는 행도 반활할 때 사용
LEFT/RIGHT/FULL OUTER 3종류가 존재
SQL_202.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


 나.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


 다.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


9.INNER vs OUTER vs CROSS JOIN 비교
SQL_203.jpg



번호 제목 글쓴이 날짜 조회 수
58 Front Page file 운영자 2012.02.21 186700
57 Week1_이진우 [5] ljw 2012.07.16 46280
56 제1절_성능_데이터_모델링의_개요 file ljw 2012.03.04 44546
55 제4절_고급_조인_기법 suspace 2012.06.05 31240
54 제1절_Lock balto 2012.05.05 25259
53 제1절_데이터_모델의_이해 실천하자 2012.03.04 22594
52 제5절_식별자 file ljw 2012.03.04 18958
» 제1절_표준_조인(STANDARD_JOIN) file ljw 2012.03.19 15924
50 제3절_반정규화와_성능 file ljw 2012.03.04 15292
49 제5절_WHERE_절 file 보라빛고양이 2012.03.10 14879
48 제4절_관계(Relationship) [1] 실천하자 2012.03.04 13028
47 제5절_그룹_함수(GROUP_FUNCTION) file balto 2012.03.31 12458
46 제2절_소트_튜닝 file ljw 2012.06.04 12024
45 제2절_DDL(DATA_DEFINITION_LANGUAGE) [1] file balto 2012.03.09 11722
44 제7절_GROUP_BY_HAVING_절 suspace 2012.03.12 11531
43 제4절_서브쿼리 오예스 2012.03.27 11529
42 제1절_데이터베이스_아키텍처 [2] ljw 2012.04.23 11523
41 제1절_관계형_데이터베이스_개요 balto 2012.03.09 10446
40 제2절_정규화와_성능 file ljw 2012.03.04 10394
39 제2절_인덱스_튜닝 balto 2012.05.18 9904