본문 바로가기

Database/Oracle

JOIN

P키 - NULL값을 허용하지 않고 중복되면 안됨

F키 - 외부 키( 외부테이블에서 가져온 키)

 

사용목적 : 우리테이블에 없는 정보를 상대방 테이블로 대입해서 데이터를 가져오기위함

 

 

 

  *JOIN
    두개 이상의 테이블을 연결에서 데이터를 검색하는 방법이다
    보통 두개이상의 행(row)들의 공통된 값 Primary Key(기본 키), Foreign Key(외래 키)값을 
    사용해서 JOIN한다.
    
    *Primary Key(기본 키) : 테이블에서 중복이 되지않고 null값을 허용하지 않는 키    -- id, 주민번호 등
    *Foreign Key(외래 키) : 다른 테이블에서 PK, UK인 경우가 많다
    
    *JOIN의 종류
    inner JOIN : 교집합    *****(중요도)
    full outer JOIN 
    cross JOIN 
    outer JOIN : 1.left     ***
                     2.right    ***
    self JOIN : 같은 테이블의 데이터를 산출  *****

 

 

 


A와 B의 겹치는 부분만

inner JOIN

-> INNER JOIN (조건문)

--1. Ansi SQL(통용)
--departmen_name 얻어오기
SELECT e.employee_id, e.first_name,
    e.department_id, d.department_id,
    d.department_name
FROM employees e INNER JOIN departments d
    ON e.department_id = d.department_id;       --조건문

--2. Oracle(오라클만의 문법)
SELECT employee_id, first_name,     -- Ansi나 Oracle이나 한쪽에만있는것(em_id, first_name등은 e.안해도됨)
    e.department_id, d.department_id,
    d.department_name, d.location_id
FROM employees e, departments d
WHERE e.department_id = d.department_id
    AND e.first_name = 'Adam';  --first_name 은 empl 소속 나머진 departments
 

 

 

 


A와 B의 객체들을 각각서로 1개씩 대입되도록하여 출력

 

cross JOIN

--테이블 안 객체하나하나들 상대 테이블 안 객체에 하나하나 대입함하여 표로 출력
--1. Ansi SQL
SELECT e.employee_id, e.first_name,
    d.department_id, e.department_id,
    d.department_name
FROM employees e CROSS JOIN departments d;

--2. 오라클
SELECT e.employee_id, e.first_name,
    d.department_id, e.department_id,
    d.department_name
FROM employees e, departments d;

 

 


 

 

 

A와 B의 전체 합

full outer JOIN

--1. Ansi
SELECT e.employee_id, e.first_name,     --em과 dep테이블 전체 출력
    e.department_id, d.department_id,
    d.department_name
FROM employees e FULL OUTER JOIN departments d
    ON e.department_id = d.department_id;

 

 


 

 

A와 B의 left/right 안겹치는 부분

outer JOIN

1. left

2. right

--1. left JOIN  -> 왼쪽 원만
--Ansi
SELECT e.employee_id, e.first_name,
    e.department_id, d.department_id,
    d.department_name
FROM employees e LEFT OUTER JOIN departments d
    ON e.department_id = d.department_id;

--오라클
SELECT e.employee_id, e.first_name,
    e.department_id, d.department_id,
    d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+); -- left, right는 (+)위치로 판단


--2. right JOIN
--Ansi

--오라클
SELECT e.employee_id, e.first_name,
    e.department_id, d.department_id,
    d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;

 

 


 

A테이블에서 2개의 A테이블객체를 생성

self JOIN : 동일한 테이블을 JOIN

--사원의 직속상사의 정보를 알기
SELECT a.employee_id, a.first_name,
    a.manager_id, b.employee_id, b.first_name
FROM employees a, employees b   --a : 사원들, b : 상사들   -> 다른테이블로 구분됨
WHERE a.manager_id = b.employee_id; --선배 정보 가져오기 

--계층형 구조 오름/내림
SELECT a.employee_id, a.first_name AS "사원",
    a.manager_id as "사원의 상사", b.employee_id,
    b.first_name as "상사 이름"
FROM employees a, employees b
WHERE a.manager_id = b.employee_id(+)   --사원정보가 다 나옴
--CONNECT BY PRIOR a.manager_id = a.employee_id;  --상향식 연결(상사의 상사의 상사순서로 출력)
CONNECT BY a.manager_id = PRIOR a.employee_id;  --하향식 PRIOR위치변경(상사의 부하직원들을 보는식으로 출력)

 

 

 

 

 

 

'Database > Oracle' 카테고리의 다른 글

헷깔린 문제~  (0) 2020.06.22
문자  (0) 2020.06.19
SORTING, GROUP BY, 통계  (0) 2020.06.19
WHERE  (0) 2020.06.18
오라클 기본 함수1 (날짜//+++)  (0) 2020.06.17