-
[ SQL ] JOIN 의 종류Database/SQL (oracle, mysql) 2019. 5. 27. 17:51
JOIN
- 한개 이상의 테이블에서 데이터를 조회하기 위해 사용한다.
- 두개 이상의 테이블을 참조해서 데이터를 검색한다.
- FROM 뒤에 두개 이상의 테이블을 명시한다.
크로스 조인(곱)과 , EQUI조인 두가지가 있다.
CROSS JOIN
특정 조건을 주지 않는다면 CROSS JOIN의 형태가 출력된다.
(2행 3열) + (3행 2열) = 6행 5열
ex. SELECT ENAME, DNAME FROM EMP, DEPT;
ex. SELECT ENAME, EMP.DEPTNO FROM EMP, DEPT;
( DEPTNO은 EMP, DEPT 테이블에서 같이 갖고 있기 때문에 꼭 어느 테이블의 DEPTNO인지 표시해 줘야 한다.)
( 그렇지 않다면 에러가 난다. ambiguously defind -- 애매모호하다라는 에러 )
EQUI JOIN
ex. SELECT ENAME, EMP.DEPTNO FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;( 조건을 걸어서 1대1 매핑이 가능하다.)
ex. SELECT ENAME, EMP.DEPTNO, DNAME, LOC FROM EMP, DEPT
WHERE ENAME='SCOTT' AND EMP.DEPTNO=DEPT.DEPTNO;
Non-Equi JOIN
ex. FROM EMP, SALGRADE WHERE EMP.SAL BETWEEN SALGRADE.LOSAL AND SALGRADE.HISAL;
특정 범위 내에 있는 값을 조회시 사용
문제) 각 사원의 정보를 출력하는데 사원번호, 사원명, 급여, 급여등급을 출력하시오
SELF JOIN
ex. SELECT E1.EMPNO "사원명", E1.ENAME "직속상사명", E1.SAL, E2.ENAME FROM EMP E1, EMP E2
WHERE E1.MGR=E2.EMPNO AND E1.ENAME='SCOTT';
하나의 테이블이 마치 두개인 것처럼 자기 테이블과 조인하는것
같은 행에 원하는 데이터가 없을때 셀프 조인을 사용한다.
SCOTT 사원의 MANAGER 사원코드로 MANAGER이름을 출력하겠다.
FROM 테이블1, 테이블1 에 각각 별칭을 꼭! 써줘야 한다. 왜? 동일한 테이블 명이 두개 들어가니까
OUTER JOIN
( 아싸 -> 인싸로)
ex. SELECT E1.ENAME, E2.ENAME FROM EMP E1, EMP E2 WHERE E1.MGR= E2.EMPNO(+);
* null은 비교, 연산, 할당 불가
* 해결: null이 포함된곳에 (+) 를 붙여준다.
테이블 조인 중 한쪽 테이블에 존재하지 않는 데이터로 인해서 출력되지 않는 행을 출력하고 싶을 때 사용.
'(+)' 기호를 사용하여 OUTER JOIN인지를 판별한다.
값이 NULL이면 연산이 불가하기 때문에 NULL처리를 해줘야 한다.
밖으로 빠진 NULL데이터를 다시 내부로 가져 오기 위한 조인이 OUTER JOIN이다.
NULL값이 포함된 테이블에 (+)를 해준다.
결과에서 빠진 결과를 추가해준다.
ANSI 조인 (, 가 없으면 ANSI) <- 9i부터
** DBMS 종류와 상관없이 실행된다.
FROM 테이블1, 테이블2 <-콤마를 제거하고 컬럼명만 적어야 한다.
1. CROSS JOIN 표현시
SELECT EMPNO, ENAME, DNAME
FROM EMP CROSS JOIN DEPT; ( ' , ' 대신 CROSS JOIN 사용)
ANSI JOIN을 사용하는 이유는 MY SQL, MARIA DB 등 모든곳에 동일하게 JOIN을 사용하기 위함이다.
2. INNER JOIN 표현시
- ON + 공통칼럼(동등조건식) ( WHERE은 써도 안써도 된다.)
SELECT EMPNO, ENAME, DNAME FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO
WHERE ENAME='JAMES'; (= USING (DEPTNO))
3. INNER JOIN을 USING절 사용하기
※USING절 사용시 공통된 컬럼에 대해 emp.deptno 또는 dept.deptno 사용 불가!!
---> 특정 테이블이 아닌 USING절에서 정의한 deptno컬럼명만 사용!!
select empno, ename, emp.deptno, dname -- 에러발생
from emp inner join dept
USING (deptno);
SELECT EMPNO, ENAME, DNAME
FROM EMP INNER JOIN DEPTUSING (DEPTNO) WHERE ENAME='JMES'
4. NATURAL JOIN 사용하기
SELECT EMPNO, ENAME, DNAME FROM EMP NATURAL JOIN DEPT
두 테이블이 갖는 컬럼중 공통된 이름의 컬럼을 자동으로 동등조건 해준다. 이름기준으로 묶어줌
5. ANSI OUTER JOIN
SELECT ENAME, DEPT.DEPTNO, DNAME, LOC
FROM EMP RIGHT OUTER JOIN DEPT
ON DMP.DEPTNO = DEPT.DEPTNO <-- using (deptno); 로 변경가능하다.
-- 왼쪽 컬럼에 조인시킬 값이 없는 경우에 RIGHT OUTER JOIN을 해준다.
FROM 테이블명1 ( LEFT | RIGHT | FULL ) OUTER JOIN 테이블명 2 <- 조건절은 ON
원인 제공쪽에 방향 표시를 한다.
문제) 각 사원의 이름과 부서번호, 부서명, 부서위치를 출력하시오.
(14명 사원이 속하지 않은 40번 부서에 대해서 출력)반응형'Database > SQL (oracle, mysql)' 카테고리의 다른 글
[SQL] DDL - CREATE, DROP, ALTER, RENAME, TRUNCATE (0) 2019.05.28 [SQL] SUB QUERY ( 서브 쿼리) (0) 2019.05.28 [DB] SQL 숫자, 날짜, 문자 함수 (0) 2019.05.24 [DB] SQL 연산자 종류 (0) 2019.05.23 [DB] 쿼리문 사용법 - SELECT (0) 2019.05.23