minlog
article thumbnail

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 원하는 번호를 잘라서 사용

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!