교재: 'Introduction to Oracle9i: SQL'
여러 테이블에서 데이터를 얻기위해 별개의 두 테이블을 링크한 후 두 테이블에 들어있는 데이터를 엑세스해야 한다.
옛 버전의 책이지만 Oracle과 SQL:1999 구문에는 다음과 같은 차이가 존재한다고 한다.
SELECT last_name, department_name dept_name
FROM employees, departments;
SELECT last_name, department_name dept_name
FROM employees
CROSS JOIN departments;
같은 테이블을 join할 때
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;
테이블 별칭으로 자칫하면 길게 작성될 수 있는 테이블 접두어를 줄여 성능을 개선
SELECT e.employee_id, e.last_name, d.department_id, d.location_id
FROM employees e
NATURAL JOIN departments d;
서로 다른 테이블을 join할 때
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);
둘 이상의 열이 일치할 때 한 열만 일치시키는 문법
내용이 일치하는 항목이 없는 레코드 반환
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
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가 존재
같은 테이블을 join할 때
SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id;
SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker JOIN employees manger
ON (worker.manager_id = manager.employee_id);
임의의 조건을 지정, 다른 검색 조건과 분리됨