메뉴 건너뛰기

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