JOIN
- 둘 이상의 테이블을 합쳐서 하나의 큰 테이블로 만드는 방법
- 관계형 모델에서는 데이터의 일관성이나 효율을 위하여 데이터의 중복을 최소화 (정규화)
- Foreign Key를 이용하여 참조
- 정규화된 테이블로부터 결합된 형태의 정보를 추출할 필요가 있음
🍫 직원의 이름과 직원이 속한 부서명을 함께 보고 싶다면?
- 두 테이블에서 그냥 결과를 선택하면?
- 결과: 두 테이블의 행들의 가능한 모든 쌍이 추출됨
- 일반적으로 사용자가 원하는 결과가 아님.
- 107*27=2889
SELECT *
FROM employees, departments;
1. Join 사용하기
WHERE 절에 공통으로 들어가 있는 컬럼을 선언해준다. → null은 조인안됨(제외됨)
select first_name, em.department_id,
department_name, de.department_id
from employees em, departments de
where em.department_id = de.department_id;
- FROM 절에 필요로 하는 테이블을 모두 적는다.
- 컬럼 이름의 모호성을 피하기 위해(어느 테이블 에 속하는지 알 수 없음)이 있을 수 있으므로 Table 이름에 Alias 사용 (테이블 이름으로 직접 지칭 가능)
- 적절한 Join 조건을 Where 절에 부여 (일반적으로 테이블 개수 -1 개의 조인 조건이 필요)
- 일반적으로 PK와 FK간의 = 조건이 붙는 경우가 많음
2. 자기자신 참조(트리구조)
SELECT er.FIRST_NAME , mr.FIRST_NAME **--사원 이름 , 메니저 이름**
FROM EMPLOYEES er , EMPLOYEES mr **-- 자기 자신 테이블 (사원) , 자기자신 테이블 (메니저)**
WHERE er.EMPLOYEE_ID = mr.MANAGER_ID; **-- 사원 아이디 = 메니저 아이디**
3. OUTER Join
- Join 조건을 만족하지 않는 컬럼이 없는 경우 Null을 포함하여 결과를 생성
- 모든 행이 결과 테이블에 참여
- NULL이 올 수 있는 쪽 조건에 **(+)**를 붙인다 —> (+) 메서드는 오라클에서만 가능
3-1. left outer join
- 왼쪽 테이블의 모든 row를 결과 테이블에 나타냄
select e.department_id, e.first_name, d.department_name
from employees e left outer join departments d
**on** e.department_id = d.department_id ;
select e.department_id, e.first_name, d.department_name
from employees e, departments d
where e.department_id = d.department_id(+) ;
3-2. Right outer join
- 오른쪽 테이블의 모든 row를 결과 테이블에 나타냄
select e.department_id, e.first_name, d.department_name
from employees e RIGHT outer join departments d
**on** e.department_id = d.department_id ;
select e.department_id, e.first_name, d.department_name
from employees e, departments d
where e.department_id(+) = d.department_id ;
3-3. full outer join
select e.department_id, e.first_name, d.department_name
from employees e **full outer join** departments d
on e.department_id = d.department_id ;
4. INNER JOIN
공통 집합 컬럼을 뽑아낼때 사용.
subQuery
- 하나의 SQL 질의문 속에 다른 SQL 질의문이 포함되어 있는 형태
- subQuery 먼저 실행 후 현제 쿼리 진행
- 단일행 연산자
select employee_id, first_name, salary
from employees
where salary > (select salary
from employees
where first_name='Den')
1. subQuery 전용 연산자
연산자 → <> 같지 않다.
ANY ⇒ or
ALL ⇒ and
SELECT e.FIRST_NAME
FROM EMPLOYEES e
WHERE (e.department_id, e.salary) in (SELECT e2.DEPARTMENT_ID, MAX(e2.SALARY)
FROM EMPLOYEES e2
GROUP BY e2.DEPARTMENT_ID
);
select e.department_id, e.employee_id, e.first_name, e.salary
from employees e, (select department_id, max(salary) salary
from employees
group by department_id) s
where e.department_id = s.department_id
and e.salary = s.salary;
rownum
- 질의의 결과에 가상으로 부여되는 Oracle의 가상(Pseudo)의 Column (일렬번호)
- where 절 이후에 rownum이 적용되기 때문에 order by로 준 순서대로 번호가 입력되지 않는다.
- 때문에 서브쿼리를 사용해서 오더바이를 설정해주고 돌아왔을때 사용.
select rownum,
first_name,
salary
from employees ;
1. 실행순서
1) 번 서브 쿼리문 안에서 먼저 순서를 정리해준다.
2) 2번 서브 쿼리문 rownum 을 사용해 순서를 추가해준다.
3) 쿼리문에서 rownum 원하는 번호를 잘라서 사용
'BackEnd > DataBase' 카테고리의 다른 글
[ DB /Oracle ] DDL | 테이블 관리 (0) | 2023.07.04 |
---|---|
[ DB /Oracle ] DCL | 사용자 계정관리 (0) | 2023.07.04 |
[ DB /Oracle ] DML | SELECT - CASE ~ END 문 (0) | 2023.07.04 |
[ DB /Oracle ] DML | SELECT - GROUP BY 절 (0) | 2023.07.04 |
[ DB /Oracle ] DML | SELECT - 함수 (단일행 함수/ 그룹 함수) (0) | 2023.07.04 |