TIL 210127 | SQL 기초 - 4. Join

Jongyhyuk Kim·2021년 1월 28일
0

SQL

목록 보기
4/4
post-thumbnail

교재: 'Introduction to Oracle9i: SQL'

4. Join

여러 테이블에서 데이터를 얻기위해 별개의 두 테이블을 링크한 후 두 테이블에 들어있는 데이터를 엑세스해야 한다.
옛 버전의 책이지만 Oracle과 SQL:1999 구문에는 다음과 같은 차이가 존재한다고 한다.

Cartesian Product

Oracle 약식

SELECT last_name, department_name dept_name
FROM employees, departments;
  1. join 조건을 생략하는 경우
  2. join 조건이 부적합한 경우
    3 .첫 번째 테이블의 모든 행이 두 번째 테이블의 모든 행에 join된 경우
    처리되는 기본 값으로 첫 번째 테이블의 모든 행이 두 번째 테이블의 모든 행에 join된다.

SQL:1999 방식 - 교차 join

SELECT last_name, department_name dept_name
FROM employees
CROSS JOIN departments;

4-1. 등가 join(simple join, inner join)

같은 테이블을 join할 때

Oracle 약식

SELECT e.employee_id, e.last_name, d.department_id, d.location_id
FROM employees e, departments d
WHERE e.depatment_id = d.department_id;
  • WHERE 절에서 join의 조건을 작성
  • 동일한 열 이름이 여러 테이블에 중복되는 경우 열이름에 테이블 이름을 접두어로 추가
  • 연산자를 통해 추가 검색 조건을 이용

    테이블 별칭으로 자칫하면 길게 작성될 수 있는 테이블 접두어를 줄여 성능을 개선

SQL:1999 방식 - natural join

SELECT e.employee_id, e.last_name, d.department_id, d.location_id
FROM employees e
NATURAL JOIN departments d;

4-2. 비등가 join

서로 다른 테이블을 join할 때

Oracle 약식

SELECT e.last_name, e.salary, j.grade_level
FROM employee e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

나와 같은 책을 통해 공부하다보면 위 코드는 실행이 안되는 사람들이 있는데
이는 현재 예제의 테이블이 예제로 프로그램에서 제공되지 않는 경우이기에 발생한다.
그러므로 다음과 같이 테이블을 추가해주자

create table job_grades(
grade varchar2(1) primary key, 
lowest_sal number(8, 2),
highest_sal number(8, 2)
);
insert into job_grades values('A', 1000, 2999);
insert into job_grades values('B', 3000, 5999);
insert into job_grades values('C', 6000, 9999);
insert into job_grades values('D', 10000, 14999);
insert into job_grades values('E', 15000, 24999);
insert into job_grades values('F', 25000, 40000);

SQL:1999 방식 - USING(column)

둘 이상의 열이 일치할 때 한 열만 일치시키는 문법

4-3. 포괄 조인(outer join)

내용이 일치하는 항목이 없는 레코드 반환

Oracle 약식

SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
  • join 조건을 만족하지 않는 행도 볼 수 있다.
  • 일치하는 행이 없는 테이블 쪽에 (+)기호를 붙인다.

SQL:1999 방식 - LEFT OUTER

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);

물론 LEFT OUTER 외 RIGHT OUTER, FULL OUTER가 존재

4-4. 자체 조인(self join)

같은 테이블을 join할 때

Oracle 약식

SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id;

SQL:1999 방식 - ON(Condtion)

SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker JOIN employees manger
ON (worker.manager_id = manager.employee_id);

임의의 조건을 지정, 다른 검색 조건과 분리됨

profile
Bellhyuk, Bottom out

0개의 댓글