Programming/SQL

[SQL] 조인 질의문 - 간단한 조인, 다양한 조인 ( 카티션프로덕트 / 동등조인 / 자연조인 / 쎄타조인 / 셀프조인 / 외부조인 )

reeme 2020. 12. 17. 14:12

조인

하나의 SQL 질의문에 의해서 여러 테이블에 저장된 데이터를 한번에 조회할 수 있는 기능

두 개 이상의 테이블을 ‘결합’ 한다는 의미

 

간단한 조인

-- FROM 절에 조인에 참여하는 두 테이블을 기록함

-- 콤마 (,) 로 구분함

-- WHERE 절에 조인 조건을 기술함

 

예) 사번이 103 인 사원의 부서명 을 알고 싶을 때

사원 정보 : EMPLOYEE

부서 정보 : DEPARTMENT

조인 조건

EMPLOYEE.DNO = DEPARTMENT.DNO

=> 두 테이블을 dno 값으로 연결한다는 뜻

select dname from employee, department where eno=103 and employee.dno=department.dno;

 

조인 작성시 유의사항
컬럼 이름의 모호성
서로 다른 두 테이블의 컬럼 ( 속성 ) 명이 같을 경우

DNO = DNO
: DBMS 에서 어느 속성이 어느 테이블에 있는 것인지 알 수 없어짐

select dname from employee, department where eno=103 and dno=dno;

 

해결방법

컬럼 이름 앞에 테이블 이름을 표기해줌

테이블 이름과 컬럼 이름은 점 (.) 으로 구분함

DEPARTMENT.DNO = EMPLOYEE.DNO

 

tip ) 테이블 별명 

테이블의 이름이 긴 경우 SQL 문 작성이 성가심

테이블 이름 대신 별명 사용이 가능함

FROM 절에 테이블 이름 다음에 공백을 두고 별명을 정의함

select * 
from employee e , department d 
where e.dno=d.dno;

point) 별명을 정의한 후에는 별명만을 써야함.

 

 

다양한 조인들

 

1. 카티션 프로덕트 (join 조건이 없는거)

select eno, ename, job, manager, hiredate, hiredate, salary,commission, e.dno, dname, loc 
from employee e , department d 
where eno='103'
;

2. 동등 조인 (조인 조건이 있는거)

select eno, ename, job, manager, hiredate, hiredate, salary,commission, e.dno, dname, loc 
-- dno속성은 employee 테이블과 department 테이블 둘 다 있는 속성이므로,
-- 명확하게 구분시켜줘야한다(테이블명.속성명)
from employee e , department d 
-- 테이블명 e 로 변경 employee as e -> employee e 
-- 테이블이름이 길어서 sql문장 작성하기가 힘들때는 별칭을 줄 수 있음
where e.dno=d.dno -- 동등 조인
and eno='103'
;

3. 자연조인

select eno, ename, job, manager, hiredate, hiredate, salary,commission, e.dno, dname, loc
from employee e natural join department d
;

4. 쎄타조인

select eno, ename, job, manager, hiredate, hiredate, salary,commission, e.dno, dname, loc
from employee e , department d
where e.dno>=d.dno  -- 쎄타 조인 >= <= 이런 등호가 들어갈 수 있음 
;

5. 셀프조인

select eno, ename, job, manager, hiredate, hiredate, salary,commission, e.dno, dname, loc
from employee e , department d
where e.dno>=d.dno  
;

6. 외부조인

select eno, ename, manager, hiredate, salary, commission, d.dno, dname, loc
from employee e right join department d  
-- left라고하면 왼쪽에는 있지만 오른쪽에는 없는거 right라고 하면 오른쪽에는 있지만 왼쪽에는 없는것 
-- left join department d : employee 테이블에는 있지만 department테이블에는 없는 속성을 조회
-- right join department d -- employee 테이블에는 없지만 department테이블에는 있는 속성을 조회
on e.dno=d.dno
; -- 외부조인 해당하는사람이 없는 항목까지 표시해주는거