본문 바로가기

Database/Oracle

Select 문 -3 (join)

커미션을 받는 모든 사원들의 이름, 연봉, 커미션을 출력하되

연봉은 ANNSAL로 출력하고 연봉을 기준으로 역순 정렬하라.

 

이름의 4번째 글자가 a인 사원의 이름을 조회한다.

_하나당 한자리씩, a% a로 시작하는 이다.

 

 

 

 

【 JOIN 조건 】

 

조인기능, 여러 테이블에서 데이터를 얻는  select문의 조인 방법 [셀렉트, 프로젝션, 조인 중]

ex : dept(dept_id, dept_name) , emp(e_id, dept_id) 일 때

e_id, dept_name 을 조회하고 싶을 때.
 

조인 기능은 두 테이블의 컬럼  dept, emp 를 하나로 합한다.

from dept, emp

이렇게 합할 때는 무결성 원칙을 지키면서 행을 일치를 시켜야 함

예를들어 저기서는 두 행이 일치시키려고 할 때 

dept_id와 e_id 를 일치시킴으로서 두 행을 일치시킬 수 있다.

조인 조건을 부여하지 않으면, 양 테이블을 하나로 합하지 않은 것이므로
양 테이블의 결과가 행열의 곱[ 카티션 프로덕트 (emp 행 수  * dept 행 수] 만큼 나와버린다.


& ( n-1 ) 개 만큼의 조건을 조인조건으로 명시해야 함

 

카티션 프로덕트는 조인조건을 생략하거나 잘못된 조인 조건을 지정했을때 나타나는 현상이다.

 

조인의 종류

등가 조인

비등가 조인

포괄 조인

자체 조인

 

사원 이름에 따른 직무 명을 나타낸 것이다.

employees 테이블과 departments 테이블을 from 에 선언하여

where 절에 두개의 행을 일치 시켜 무결성을 보장시켜야 한다.

 

○ n-1 개의 조인조건을 where에 명시

○ 조인시킬 table 에 똑같은 이름의 칼럼이 존재할시, 반드시 소유주인 table 이름을 접두어로 명시 

 

 

 

『 등가 조인 』 

 

조인 시킬 테이블에 같은 데이터가 존재 시,

PK 와 FK가 연결이 된 경우, 많이 사용된다. (대부분 현업에선 등가조인 사용)

ex: 위의 dept_id = emp_id

 

 

이 문제는, department_id가

departments 테이블과 employees 테이블 양쪽에 존재하여

어느쪽에서 가져와야 할지 몰라 오류가 나는 것인데

다음과 같이 어떤 테이블을 참조할지 명시를 해주면 (employees.department_id)

이 문제가 해결된다.

 

 

from 절에도 똑같이 as문을 이용하여 별칭을 지정해 줄 수 있다.

순서는 from -> where -> select 순이 되므로 from 이후의 모든 절에 적용된다.

단, as로 해당 문에서 별칭을 정해 주었을 경우 그 다음부터는 별칭으로 기입하여야 한다.

 

다중 조건 사용시, 조인 조건 후 반드시 AND 조건을 사용하여야 한다. ( OR 조건등 기입하면 카티션 프로덕트 발생)

 

matos 라는 회사원의 이름과 직무번호를 출력하는 문장으로

조인 조건뒤에 AND 그리고 조건을 붙였다.

 

 

 

* PK 와 FK 가 연결되어 있을경우,  PK = FK 하면 조인이 된다.

 

세 개 이상의 테이블을 조인할 때 다음과 같이 각 테이블의 PK와 FK를 묶어서 사용한다.

이는 각 사원의 이름, 부서이름, 도시를 선택하고, 

employees의 department_id와 departments의 department_id

그리고 

d.location의 location_id와 locations의 location_id 가 똑같은 데이터라는 것을 명시 할 수 있도록

조인 조건을 입력하여 준다.

 

 

이 문장의 수행 결과로 106명이 나오는데, 회사에는 107명이 존재.

저 where절로서 = 등호는 즉, department_id가 존재하는 사람만 표기하므로 직무번호가 NULL 을 제외한 106명만 색인됨

여기서 outer 연산자 + 를 적용하게 되면

outer 연산자는 부족한 테이블에 NULL을 추가시켜준다. 

그렇게 원래   로 (107):(106) 106개만 표기되었던 행에 NULL 추가하여 107:107 로 일치시킬 수 있다.

행이 부족한 테이블에 NULL을 추가해 주는 outer 조인

 

 

 

본래 이렇게 테이블이 두개고 사원에 따른 관리자를 매핑할때는

사원의 매니저 ID와,  매니저의 고용 ID 를 매핑 시킬 수 있다.

하지만 관리자 테이블이 없는 경우, 사원 테이블의 eid와 mid를 셀프 조인 할 수 있다.

 

 from 절에 as 문을 이용해서 한개의 테이블을 두개로 쪼갠것 처럼 사용하였다.

따라서 각각의 테이블을 사용하는 것 처럼 where, select 절에

축약어로 사용할 수도 있고, where절에 조인 조건으로 활용할 수도 있다.

 

 

『 비등가 조인 』

 

조인 시킬 테이블에 같은 데이터가 아닌 경우

컬럼이 어떤 데이터의 범위에 들어가 있는 경우, 

 

 

 

 

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

데이터 정의어 [DDL] 의 활용  (0) 2021.01.05
데이터 조작어 [DML] 와 트랜잭션  (0) 2021.01.05
Select문 -2  (0) 2020.12.30
SQL 운용 상식  (0) 2020.12.29
SELECT 문 -1  (0) 2020.12.29