Join

RNR·2022년 10월 31일
0

SQL

목록 보기
6/17
post-thumbnail

1. 조인의 필요성

관계형 데이터베이스는 두 개 이상의 테이블에 정보가 나뉘어져있다.
중복 저장을 지양하기 위해서다.
그러다보니 기존의 방식은 여러 테이블을 넘나들어야한다.

소속되어있는 부서의 이름이 무엇인지 알아볼 경우


  1. 모든 사원의 부서 번호를 알아낸다
select * from emp;
  1. 특정 사람의 부서번호를 알아낸다
select deptno
from emp
where ename='이문세';
  1. 특정 사람의 부서번호를 알아낸다
select deptno
from dept
where deptno=10;

2. Join?

  • from절에 재료 집합이 두 개 이상 (more than one)
select *
from employees, departments 
-- ^cartesian product^

      || 

for employess
  for departments
  
      || 
  
for dept in (select * from departments) loop
  dbms_outpu.put_line(dept.department_id);
  for emp in()

3. 조인의 종류

  • Equi join : 동일 컬럼을 기준으로 조인
  • Non-Equi Join : 동일 컬럼이 없이 다른 조건을 사용하여 조인
  • Outer Join : 조인 조건에 만족하지 않는 행도 나타냄
  • Self Join : 한 테이블 내에서 조인

3.1. Equi Join

: 동일 컬럼의 기준으로 조인
1. 특정 컬럼을 추출하기 ㄷ위해 SELECT 다음에 원하는 컬럼 기술
2. 특별한 키워드 없이 SELECT 문의 FROM 절에 사원 테이블과 부서 테이블을 콤마로 연결하여 기술
3. 이 때, 조인 조건을 명시하지 않으면 모든 테이블이 Cross Join 됨. 그러니 WHERE절에 두 테이블에 공통된 컬럼을 조인 조건으로 제시할 것.

-- 전체 출력
select *
from employees, departments
where employees.department_id = departments.department_id;

-- 다수의 조건은 and, or로
select *
from employees, departments
where employees.department_id = departments.department_id
      and employees.salary <= 10000;

3.2. Non-Equi Join

조인 조건이 특정 범위 내에 있는지를 조사하기 위해, WHERE절에 조인조건을 = 연산자 외에 비교연산자를 사용한다.

3.3. Outer Join

3.4. Self Join

: 한 테이블 내에서 조인

select ename, mgr
from emp;

4. ANSI systax

4.1. Natural Join

Natural Join 문제점 : 같은 이름의 컬럼 모두를 equi 조인 조건으로 사용한다는 것

해결방법
1. Join Using(단, Join Using은 equi 조인만 가능)
2. Join On(equi, non-equi, self, outer모두 가능)

-> NATURAL JOIN, JOIN USING, JOIN ON으로 변환 가능

4.2. Cross Join

특별한 키워드 없이 SELECT 문의 FROM 절에 사원(emp) 테이블과 부서(dept) 테이블을 콤마로 연결해서 연속으로 기술하는 것.

select *
from employees, departments;

Cross Join의 결과, Column수는 양 테이블 Column의 수를 더한 수.
Row 수는 emp의 row 수 (사원 한 명) X dept 테이블의 row


Column명 중복, 모호성 해결

이 때, 중복될 경우 .을 이용해 테이블명을 기술하여 소속을 구분한다.
중복되지 않는 경우라면 굳이 명시하지 않아도 괜찮다.

-- 컬럼명의 모호성 해결
SELECT employees.EMPLOYEE_ID, employees.FIRST_NAME, departments.department_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;

테이블에 별칭 부여

FROM절 다음 테이블명을 명시, 공백 하나를 두고 별칭을 지정하면 된다.
ex) from emp e, dept d

지정한 이후, 컬럼 앞에 별칭을 붙이면 된다.

SELECT e.EMPLOYEE_ID, e.FIRST_NAME, d.department_id
from employees e, departments d
where e.department_id = d.department_id;
profile
개인적 공부 기록. 그때그때 메모합니다.

0개의 댓글