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 |