Database - Oracle DB/1주차(Database - Oracle DB)

[SQL] DB 스터디 - 04

김야키 2019. 1. 2. 16:27


JOIN, Sub Query를 사용한 여러 테이블 표시


1. JOIN 이란

- 서로 다른 두 개 이상의 테이블을 합칠 때 사용하는 구문

- 조건절에 두 테이블의 적절한 조회 조건식이 없다면 두 테이블 간의 모든 경우의 수의 행의 개수가 출력 됨

- 동일한 값으로 하는 조인을 Equijoin, 다른 값으로 하는 조인을 Nonequijoin이라 함

- 거의 대부분의 조인은 같은 값을 가지고 조인을 진행 하게 됨

예)

-> emp테이블에서 empno가 7788인 사원의 deptno의 부서 번호와 부서 명을 표시하는 SQL문


-- 아래 두 SQL문을 합치는 작업 필요

SELECT *

FROM emp

WHERE empno = 7788;


SELECT *

FROM dept

WHERE deptno = 20;


-- 실행은 되지만 원하는 결과가 아닌 다른 결과가 출력 됨

-- 4개 행의 결과가 출력 됨

SELECT *

FROM 

emp, dept

WHERE 

empno = 7788;

-- 2차원 구조의 표집합이 만들어 져야 하기 때문에,

-- emp테이블이 dept테이블에 대응되어서 출력 됨


-- 올바른 결과를 위한 SQL JOIN문

SELECT *

FROM 

emp, dept

WHERE 

    empno = 7788

AND

    emp.deptno = dept.deptno;

-- emp 테이블에서 empno가 7788인 값을 가져와서 dept테이블과 연결 시키는데,

-- emp 테이블의 deptno와 dept 테이블의 deptno가 동일한 값 즉, 20인 컬럼의 정보를

-- 합쳐서 출력 하라는 의미




2. ANSI-JOIN, ORACLE-JOIN

- ANSI-JOIN : 각 테이블을 JOIN 키워드로 구분 함

-> 서로 다른 DB(mysql, oracle-db, mssql등)에서 통상적으로 사용되는 SQL 명령어

-> Natural JoinOuter Join이 있음

-> JOIN 내에서 조건 식은 WHERE대신 ON절을 이용

- ORACLE-JOIN : 각 테이블을 ,(콤마)로 구분 함

예)

->

-- ANSI-JOIN

SELECT *

FROM 

    emp JOIN dept

ON

    emp.deptno = dept.deptno

WHERE

    emp.empno = 7788;

-- 3가지 employees, departments, locations 테이블을 JOIN 시키기

-- ON절을 사용 할 때에는 한 번의 JOIN을 완료 하고 그 다음에 ON절을 다시 사용

SELECT *

FROM 

employees E

JOIN departments D

ON E.department_id = D.department_id

JOIN locations L

ON D.location_id = L.location_id;


-- ORACLE-JOIN

SELECT *

FROM 

    emp, dept

WHERE 

    emp.deptno = dept.deptno

AND

    emp.empno = 7788;




3. 모호한 열 이름 한정

- 테이블 접두어를 사용하여 여러 테이블에 있는 열 이름을 한정

- 테이블 접두어를 사용하여 성능을 향상 시킴

- 전체 테이블 이름 접두어 대신 테이블 Alias를 사용

- 테이블 Alias로 테이블에 짧은 이름을 지정

- 열 Alias를 사용하여 이름은 같지만 서로 다른 테이블에 상주하는 열을 구분




4. Natural Join 생성

- 두 테이블의 모든 행을 기반으로 진행

- 두 테이블에서 대응되는 모든 열의 값이 동일한 행을 선택 하여 출력

- 동일한 이름을 가진 열이 서로 다른 데이터 유형을 가지면 오류 반환

- 실제로 사용하지 않음

- 동일한 이름이 같은 컬럼이 중복 되면 원하지 않는 결과가 출력 됨

예)

->

-- 동일한 조건으로 JOIN을 진행하는 JOIN(Equijoin)

-- 동일한 컬럼의 명이 같은 것을 기중으로 JOIN

SELECT 

*

FROM 

emp

NATURAL JOIN 

dept;




5. USING 절로 조인 생성

- 여러 열이 이름은 같지만 데이터 유형이 다른 경우 USING 절을 사용하여 Equijoin에 대한 열을 지정할 수 있음

- USING절을 사용하면 두 개 이상의 열이 일치하는 경우 하나의 열만 일치하도록 지정할 수 있음

- NATURAL JOIN과 USING절은 상호 배타적

- 암시적인 형 변환도 이루어 지기도 함

- Alias를 사용하여 조건절에서 접두어를 붙히면 에러 발생

- 실제로 사용하지 않음.

예)

-> 컬럼의 이름을 한정이어서 해당 컬럼 으로만 Equijoin 진행

-- USING

SELECT 

*

FROM 

employees E

JOIN 

departments D

USING 

(department_id);




6. ON절로 JOIN 생성

- Natural Join의 조인 조건은 기본적으로 이름이 같은 모든 컬럼의 Equijoin

- ON 절을 사용하여 임의 조건을 지정하거나 조인할 열을 지정 함

- 조인 조건은 다른 검색 조건과는 별개

- ON 절을 사용하면 코드를 이해하기 쉬움

예)

->

SELECT 

    e.employee_id, e.last_name, e.department_id,

    d.department_id, d.location_id

FROM 

employees e 

JOIN 

departments d

ON 

    (e.department_id = d.department_id);





7. Self JOIN

- FROM 절에서 테이블 명에 별칭을 주면 모든 SQL문에서는 그 별칭을 사용해야 함

- 동일한 테이블이라도 별칭만 다르게 주면 다른 테이블로 인식 시킬 수 있음

예)

->

-- 누가 누구의 메니저인지 확인하는 SQL문

SELECT

    W.ename, M.ename

FROM 

    emp W 

JOIN 

emp M

ON

    W.mgr = M.empno;



8. Nonequijoin

- 값이 다른 두 컬럼에 조건에 따른 조인을 시킬 수 있음

예)

->

-- emp 테이블의 sal에 따른 급여에 salgrade 테이블의 grade 조인 시키기

SELECT 

    E.ename, E.sal, S.grade

FROM 

    emp E JOIN salgrade S

ON 

    E.sal BETWEEN S.losal AND S.hisal;


-- JONES(ename)보다 sal이 더 큰 행만 출력

SELECT 

*

FROM

    emp a

JOIN 

    emp b

ON  

    b.ename = 'JONES'

AND 

    a.sal > b.sal;