CROSS JOIN
테이블 두개를 올려놓고 아무 조건 주지 않고 그냥 실행하면, 두 테이블 사이에 나올 수 있는 모든 케이스가 다 행으로 들어온다.카다시안 곱의 결과가 모두 출력되는 셈.
오라클은 이 경우를 허용하나, ANSI구문에서는 CROSS JOIN이라고 명시해야만 결과를 내 준다. 실수하지 않게 하기 위한 방침인 셈.
CROSS JOIN의 경우 ON구문을 사용할 수 없다.
조인의 요소를 찾아 주는 것이 의미가 없기 때문에. 보통 대용량 테스트데이터를 만들 때 사용한다고 한다.
INNER JOIN
일반적으로 필요한 조인 방식. 양측 테이블에 공통으로 사용하고 있는 key (주로 PK - FK 관계)를 활용하여 적절하게 조인
주의
같은 컬럼명이 양쪽 테이블에 있다면, table.column 으로 명명해야 함. (어느 쪽을 말하는지 모르기 때문에)
한쪽에만 존재하는 컬럼명이라면 테이블명을 제외하고 써도 되나, 서버는 뒷쪽에서 양쪽 테이블을 다 훑으며 연산 처리해야 하니 고생스럽고 성능이 떨어지므로 컬럼명이 중복되던지 안되던지 table.column으로 명명하는 것을 추천
이때,
오라클에서 테이블의 별칭을 사용할때 AS 사용하면 에러난다
ORACLE / ANSI JOIN 어느 쪽의 문법을 적용해도 결과는 잘 나옴.
그런데 ANSI조인은 실수를 방지하고자, 키워드를 제대로 안 넣으면 결과를 안 뱉어준다. 초보자 입장에서 더 안전함
--ORACLE JOIN
SELECT *
FROM EMP E
,DEPT D
WHERE E.DEPTNO = D.DEPTNO ;
--ANSI JOIN
SELECT *
FROM EMP E
JOIN DEPT D
ON E.DEPTNO = D.DEPTNO ;
오라클 조인은 조인조건이 WHERE에 들어가있기 때문에 다른 WHERE조건을 붙이려면 저 밑으로 AND 쭉쭉붙어야함 (OR로 붙으면 우리가 원하는 결과를 안보여줄가능성이있다)
ANSI는 조인과 일반조건을 구분할수있어서 조건이 많으면 이쪽이 더 깔끔할 수 있다.
--ORACLE JOIN
SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, S.GRADE
FROM EMP E
,DEPT D
,SALGRADE S
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL BETWEEN S.LOSAL AND S.HISAL ;
--ANSI JOIN
SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, S.GRADE
FROM EMP E
JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
JOIN SALGRADE S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL ;
참고로 조인은 두 집합을 연결해서 하나의 집합을 만들고 + 그 다음에 또 하나를 만드는거라서,
3개의 테이블에 다 똑같은 컬럼명이 있더라도 세개 한번에 조건을 주는것은 불가능함. 두개씩 두개씩 차근차근,,
위 식에서 SALGRADE와 EMP테이블에는 조인할만한 거리가 없다. =으로 연결되는 EQUI JOIN을 사용할 수 없다.
다만 이렇게 도 쓸수있당
LEFT OUTER JOIN
부서는 있으나 근무하는 사원은 없는 경우,
회원가입은 했으나 구매내역은 없는 경우 등
조인을 하려는데 한쪽에만 데이터가 있는 경우에도 그것까지 보기 원하는 경우에는 LEFT/RIGHT OUTER JOIN을 사용할 수 있다.
오라클의 경우 LEFT OUTER JOIN을 사용할 때
WHERE절에 (+) 을 정보가 없는쪽(오른쪽)에다가 붙인다... 참 이상하고도 헷갈리는 방식이다.
ANSI 방식이 이 때는 훨씬 깔끔하다.
-- ORACLE JOIN
SELECT *
FROM DEPARTMENTS D
,EMPLOYEES E
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID (+) ;
--ANSI JOIN
SELECT *
FROM DEPARTMENTS D LEFT JOIN EMPLOYEES E
ON D.DEPARTMENT_ID = E.DEPARTMENT_ID ;
FULL OUTER JOIN
오른쪽이든 왼쪽이든 한쪽에 들어 있는 내용이면 출력한다. RIGHT OUTER JOIN + LEFT OUTER JOIN 느낌
SELF JOIN
하나의 테이블인데 각각 다른 별칭을 붙여 두개의 테이블인척 사용하는 방법.
NATURAL JOIN, USING
양쪽에 같은 이름을 가진 컬럼을 기준으로 알아서 조인해달라고 컬럼명만 띡 던지는 것이 USING이다
SELECT *
FROM DEPT D
JOIN EMP E
USING (DEPTNO) ;
NATURAL JOIN은 다 모르겠고 눈치껏,, 알아서 조인해줘! 이다.
멋지지만 오류가 많아서 실무에서는 잘 안 쓰인다고 한다.
SELECT *
FROM DEPT D
NATURAL JOIN EMP E ;
주의사항.
NATURAL JOIN과 USING은 반드시 두 테이블 간에 동일한 이름과 데이텉입을 가진 컬럼이 필요하다.
USING이나 NATURAL JOIN는 조인조건에 참여한 컬럼에 별칭 주면 에러가 난다.
( 만약 동일 이름을 가진 컬럼이 여러개라면 그중 하나만 랜덤으로 돌려서 EQUI JOIN 수행함 )
'근거 있는 일하기_SQL' 카테고리의 다른 글
조건절의 서브쿼리 (where, having) (0) | 2024.05.06 |
---|---|
OUTER JOIN 쓸 때 ON과 WHERE에 주는 조건 차이 주의 (0) | 2024.05.04 |
조건문_DECODE, CASE WHEN (0) | 2024.04.20 |
오라클 날짜는 항상 시분초를 달고다닌다 (0) | 2024.04.19 |
ROLLUP (0) | 2024.04.19 |