INNER JOIN
CROSS JOIN
OUTER JOIN
SELF JOIN
SQ은 명시적 조인 표현과 암시적 조인 표현으로 구분을 지정한다.
(1) 명시적 조인 표현
SELECT *
FROM EMPLOYEE INNER JOIN DEPARTMENT
ON EMPLOYEE.DepartmentID = DEPARTMENT.DepartmentID;
(2) 암시적 조인 표현
SELECT *
FROM EMPLOYEE, DEPARTMENT
WHERE EMPLOYEE.DepartmentID = DEPARTMENT.DepartmentID;
(Inner join 결과)
EQUAL 연산자(=)를 사용해서 EQUI JOIN이라고 한다.
WHERE 절에 기술되는 JOIN 조건을 검사해서 양쪽 테이블에 같은 조건의 값이 존재할 경우 해당 데이터를 가져오는 조인 방법이다.
SELECT *
FROM EMPLOYEE , DEPARTMENT
WHERE EMPLOYEE.DepartmentID = Department.DepartmentID;
SELECT *
FROM EMPLOYEE JOIN DEPARTMENT
ON EMPLOYEE.DEPARTMENTID = DEPARTMENT.DEPARTMENTID;
즉, 두 번째 테이블로부터 각 열과 첫 번째 테이블에서 각 열이 한번씩 결합된 열을 만들 것이다. 예를 들어 m열을 가진 테이블과 n열을 가진 테이블이 교차 조인되면 m*n 개의 열을 생성한다. 그래서 테이블의 각 값을 연결하여 테이블 행의 수를 모두 곱한 값만큼 만들어진다.
SELECT *
FROM EMPLOYEE CROSS JOIN DEPARTMENT;
employee 테이블의 튜플이 6개이고 department 테이블의 튜플이 4개면 6 X 4 = 24개의 결과가 나오는 것이다.
Outer Join에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.
SELECT *
FROM EMPLOYEE E LEFT OUTER JOIN DEPARTMENT D
ON E.DEPARTMENTID = D.DEPARTMENTID;
<ORACLE>
SELECT *
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DepartmentID = D.DepartmentID(+);
SELECT *
FROM EMPLOYEE E RIGHT OUTER JOIN DEPARTMENT D
ON E.DepartmentID = D.DepartmentID;
<ORACLE>
SELECT *
FROM EMPLOYEE E , DEPARTMENT D
WHERE E.DepartmentID(+) = D.DepartmentID;
양쪽 모두 조건이 일치하지 않는 것들까지 모두 결합하여 출력한다.
SELECT *
FROM EMPLOYEE E FULL OUTER JOIN DEPARTMENT D
ON E.DepartmentID = D.DepartmentID;
MySql에서는 Full Outer Join 키워드가안되므로 이런식으로 해준다.(물론 방법은 다양하지만..)
SELECT *
FROM EMPLOYEE E LEFT OUTER JOIN department D
ON E.DepartmentID = D.DepartmentID
UNION
SELECT *
FROM EMPLOYEE E RIGHT OUTER JOIN DEPARTMENT D
ON E.DEPARTMENTID = D.DEPARTMENTID;
select F.empno, F.ename, S.empno, S.ename, S.job
from emp F inner join Emp S
on F.job = S.job
where F.empno < S.empno
order by F.empno, S.empno;