-- ORDER BY 1: 테이블의 첫번째 컬럼 기준으로 정렬하겠다는 뜻
-- 웬만하면 order by절에 컬럼명을 써주는 것이 좋음
SELECT *
FROM emp, dept
ORDER BY 1 ;
-- 오류 발생 (emp에도 dept에도 deptno가 있기 때문)
SELECT *
FROM emp, dept
WHERE deptno = deptno ;
SELECT *
FROM emp, dept
WHERE emp.deptno = dept.deptno ;
-- 테이블명에 alias(별칭) 가능
SELECT *
FROM emp e, dept d
WHERE e.deptno = d.deptno ;
- NATURAL JOIN
- USING절
- ON절
- INNER JOIN
- OUTER JOIN
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
- CROSS JOIN
SELECT employee_id, first_name, job_id, job_title
FROM employees NATURAL JOIN jobs;
SELECT employee_id, last_name,
location_id, department_id
FROM employees JOIN departments
USING (department_id) ;
SELECT employee_id, last_name, e.manager_id,
location_id, department_id
FROM employees e JOIN departments d
USING (department_id) ;
e.manager_id 이런 식으로 테이블을 지정해줘야 됨d.department_id 이렇게 쓰면 에러 발생SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id) ;
ON (e.department_id > d.department_id);
-> 이것도 가능
-> natural join과 using절은 무조건 같은 값끼리만 가능한데 on절은 >, < 이런 것도 가능
-- ANSI JOIN 방식
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
-- Oracle JOIN 방식
SELECT employee_id, city, department_name
FROM employees e
,departments d
,locations 1
WHERE d.department_id = e.department_id
AND d.location_id = l.location_id;
AND나 WHERE 사용SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
AND e.manager_id = 149 ;
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
WHERE e.manager_id = 149 ;
INNER JOIN: 교집합. 일치하는 행만 반환하는 두 테이블의 조인LEFT OUTER JOIN: 왼쪽 테이블 기준으로 JOIN 하겠다는 것
- 왼쪽 테이블 A의 모든 데이터와 A와 B 테이블의 중복데이터들이 검색됨
RIGHT OUTER JOIN: 오른쪽 테이블 기준으로 JOIN 하겠다는 것
- 오른쪽 테이블 B의 모든 데이터와 A와 B 테이블의 중복데이터들이 검색됨
FULL OUTER JOIN: 왼쪽 테이블과 오른쪽 테이블의 합집합. 만약 A에는 데이터가 있지만 B에 데이터가 없으면, B부분은 null이 되고 반대의 경우에는 A부분이 null이 됨
- 두 테이블 간의 모든 행을 포함하며, 일치하지 않는 경우에는
NULL로 표시
💡 OUTER JOIN의 경우, 테이블 전체를 검색해서 JOIN하기 때문에 성능 저하를 야기함. 꼭 필요할 때만 사용하기!
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) ;
SELECT e.last_name, d.department_id, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
SELECT e.last_name, d.department_id, d.department_name
FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
N개의 행을 가진 테이블과 M개의 행을 가진 테이블의 카티시안 곱은 N*M
첫 번째 테이블의 행 수 * 두 번째 테이블의 행 수SELECT last_name, department_name
FROM employees
CROSS JOIN departments ;
OUTER JOIN은 JOIN한 뒤 일부 행에서 특정컬럼 값이 NULL값인게 존재한다
OUTER JOIN: NULL값 O
CROSS JOIN: NULL값 X