![](https://blog.kakaocdn.net/dn/u0mji/btrmLz7ujGi/mvC3GQCOfZSDzZ5zYafYjk/img.jpg)
JOIN은 테이블과 테이블을 연결하기 위해 사용됩니다.
이런 조인을 알아보기 위해 테이블을 만들어서 비교해보려고 합니다.
DROP TABLE X,S,M;
CREATE TABLE M
(M1 CHAR(6), M2 VARCHAR(10));
CREATE TABLE S
(S1 CHAR(6), S2 VARCHAR(10));
CREATE TABLE X
(X1 CHAR(6), X2 VARCHAR(10));
INSERT INTO M VALUES('A','1');
INSERT INTO M VALUES('B','1');
INSERT INTO M VALUES('C','3');
INSERT INTO M VALUES(NULL, '3');
INSERT INTO S VALUES('A','X');
INSERT INTO S VALUES('B','Y');
INSERT INTO S VALUES(NULL, 'Z');
INSERT INTO X VALUES('A','DATA');
COMMIT;
위의 코드를 입력해서 M, S, X 테이블을 만들고 각 테이블에 값을 인서트 해주세요!
![](https://blog.kakaocdn.net/dn/boGxbW/btrmLBjWFdX/4fhhe9mPkloPCsbG21k370/img.png)
1. INNER JOIN
![](https://blog.kakaocdn.net/dn/bChGey/btrmGg9tq7A/Brc0W5tKBOkaN2QjulisAK/img.png)
교집합과 같은 형태입니다.
--ANSI 표준
SELECT * FROM M INNER JOIN S ON M1 = S1;
![](https://blog.kakaocdn.net/dn/VQi3N/btrmGhAw71s/vsrftHOT7NbeEpz7mJ7BvK/img.png)
--ORACLE 표준
SELECT * FROM M,S WHERE M1 = S1;
![](https://blog.kakaocdn.net/dn/ZOqrk/btrmFoGGg59/gYWrJ8PoAMqBTJjWqmfIfK/img.png)
2. CROSS JOIN
-- ANSI 표준
SELECT * FROM M CROSS JOIN S;
![](https://blog.kakaocdn.net/dn/kKo7A/btrmLz7ujI5/7NthFqbEWDkPNuXNGKs8H1/img.png)
--ORACLE 표준
SELECT * FROM M,S;
![](https://blog.kakaocdn.net/dn/cnTzWq/btrmGhm2KMt/Kp0C0hX9bXhhHCd6VF5QO0/img.png)
3. OUTER JOIN
![](https://blog.kakaocdn.net/dn/ttyhd/btrmHEvtULZ/t6Z172KzH3KzHlkq6e8ws0/img.png)
--ANSI 표준
SELECT * FROM M LEFT OUTER JOIN S ON M1 = S1;
![](https://blog.kakaocdn.net/dn/mApcL/btrmLBK11nT/JfsH9ZkxvLsGpdzTAtejUk/img.png)
--ORACLE 표준
SELECT * FROM M,S WHERE M1 = S1(+);
![](https://blog.kakaocdn.net/dn/cpXaFl/btrmGgO745p/cHXQGBg8ZwSr7KbOUEYfjk/img.png)
--ANSI 표준
SELECT * FROM M RIGHT OUTER JOIN S ON M1 = S1;
![](https://blog.kakaocdn.net/dn/kXh88/btrmLAyA5tc/JILkT0ll103f2qKOfA2qU1/img.png)
--ORACLE 표준
SELECT * FROM M,S WHERE M1(+) = S1;
![](https://blog.kakaocdn.net/dn/LemjO/btrmGgBDj54/BGAddwf3n3iPTHMqFYrTb1/img.png)
4. NON EQUO JOIN
테이블의 어떤 컬럼도 JOIN할 테이블의 컬럼과 일치하지 않을 때
SELECT ENAME, SAL, GRADE
FROM EMP JOIN SALGRADE ON (SAL BETWEEN LOSAL AND HISAL);
![](https://blog.kakaocdn.net/dn/cyd425/btrmHFHV6i9/Y83CvZ0LXOgpgqyanauky1/img.png)
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
![](https://blog.kakaocdn.net/dn/blGTPA/btrmGhm2KNI/eNbu25J1GE6AacIV2pPFw1/img.png)
5. SELF JOIN
--Q) 모든 사원의 사번, 이름, 관리자의 사번, 관리자의 이름을 출력하자.
SELECT 사원.EMPNO, 사원.ENAME, 관리자.EMPNO, 관리자.ENAME
FROM EMP 사원, EMP 관리자
WHERE 사원.MGR = 관리자.EMPNO;
![](https://blog.kakaocdn.net/dn/djVsnC/btrmKY7yQp0/2tlBwwFXuGK4kKhbsY8Xv1/img.png)
--Q1) 사원테이블과 부서테이블에서 사원들의 이름, 부서번호, 부서이름을 출력하자.
--ANSI 표준
SELECT ENAME, DEPTNO, DNAME
FROM EMP JOIN DEPT USING(DEPTNO);
![](https://blog.kakaocdn.net/dn/bsRl2X/btrmKhmdhmw/WCzK531RmtWRgMkzLzT5Kk/img.png)
--ORACLE 표준
SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
![](https://blog.kakaocdn.net/dn/9uIKu/btrmK05l8hs/MxdAc1SQuG6KxjayXgOUb0/img.png)
--Q2) 사원테이블과 부서테이블에서 'DALLAS'에서 근무하는 사원의 이름, 직위, 부서번호, 부서이름을 출력하자.
--ANSI 표준
SELECT ENAME, JOB, DEPTNO, DNAME
FROM EMP JOIN DEPT USING(DEPTNO)
WHERE LOC = 'DALLAS';
![](https://blog.kakaocdn.net/dn/bSJ7jO/btrmGhtPHnn/OenYHclau5cNHawe3p98nk/img.png)
--ORACLE 표준
SELECT E.ENAME, E.JOB, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND D.LOC = 'DALLAS';
![](https://blog.kakaocdn.net/dn/MW05c/btrmK0j1gpB/LNjob5hDJBq7igYpK9H981/img.png)
--Q3) 사원테이블과 부서테이블에서 이름에 'A'가 들어가는 사원들의 이름과 부서이름을 출력하자.
--ANSI 표준
SELECT ENAME, DNAME
FROM EMP JOIN DEPT USING(DEPTNO)
WHERE ENAME LIKE '%A%';
![](https://blog.kakaocdn.net/dn/6CCNW/btrmKY0LQ9i/V4Lnakp26YkApJrP1I0iY0/img.png)
--ORACLE 표준
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.ENAME LIKE '%A%';
![](https://blog.kakaocdn.net/dn/crE1VV/btrmGhN1ra0/3qrNCmXhvWRGdxkMnYHoGk/img.png)
--Q4) 사원테이블과 부서테이블에서 사원이름과 그 사원이 속한 부서의 부서명, 월급을 출력하자.
--단 월급이 3000 이상인 사원들을 출력하자.
--ANSI 표준
SELECT ENAME, DNAME, SAL
FROM EMP JOIN DEPT USING(DEPTNO)
WHERE SAL >= 3000;
![](https://blog.kakaocdn.net/dn/dRSS8W/btrmHDJ4HzJ/eqfEABgUoSDUOKUGUsOcN1/img.png)
--ORACLE 표준
SELECT E.ENAME, D.DNAME, E.SAL
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL >= 3000;
![](https://blog.kakaocdn.net/dn/b6iRQh/btrmKCjnFPe/X4DN0HLHqjBXzN2Ah7irgk/img.png)
--Q5) 사원테이블과 부서테이블에서 직업이 'SALESMAN'인 사원들의 직업과 사원이름, 속한 부서이름을 출력하자.
--ANSI 표준
SELECT JOB, ENAME, DNAME
FROM EMP JOIN DEPT USING(DEPTNO)
WHERE JOB = 'SALESMAN';
![](https://blog.kakaocdn.net/dn/kCOnQ/btrmKik83RZ/IEil2lLkLCAWH7o2F2TN1k/img.png)
--ORACLE 표준
SELECT E.JOB, E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.JOB = 'SALESMAN';
![](https://blog.kakaocdn.net/dn/AC9vF/btrmKZL9fnf/fCdLAE8peBCt4aRJ71p3j1/img.png)
--Q6) 사원테이블과 급여테이블(SALGRADE)에서 커미션이 책정된 사원들의 사원번호, 이름, 연봉, 연봉+커미션, 급여등급을 출력하자.
--단, 각각의 컬럼명을 '사원번호', '사원이름', '연봉', '실급여', '급여등급'으로 출력하자.
--ANSI 표준
SELECT EMPNO 사원번호, ENAME 사원이름, SAL*12 연봉, SAL*12+NVL(COMM,0) 실급여, GRADE 급여등급
FROM EMP JOIN SALGRADE ON (SAL BETWEEN LOSAL AND HISAL)
WHERE COMM IS NOT NULL;
![](https://blog.kakaocdn.net/dn/brH67D/btrmLAZD14f/qKkrGkyFIFX7aUiIDfpawK/img.png)
--ORACLE 표준
SELECT E.EMPNO, E.ENAME, E.SAL*12, E.SAL*12 + NVL(E.COMM, 0), S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
AND E.COMM IS NOT NULL;
![](https://blog.kakaocdn.net/dn/bd1igk/btrmKA6VmEv/Lpk7HErJ03FppqkSc2Oo0k/img.png)
--Q7) 사원테이블과 부서테이블, 급여테이블에서 부서번호가 10번인 사원들의 부서번호, 부서이름, 사원이름, 월급, 급여등급을 출력하자.
--ANSI 표준
SELECT DEPTNO, DNAME, ENAME, SAL, GRADE
FROM EMP JOIN DEPT USING(DEPTNO)
JOIN SALGRADE ON (SAL BETWEEN LOSAL AND HISAL)
WHERE DEPTNO = 10;
![](https://blog.kakaocdn.net/dn/6YpQ3/btrmFpMjkqh/pLWJNEB1VQBFIh1YXcrHQk/img.png)
--ORACLE 표준
SELECT E.DEPTNO, D.DNAME, E.ENAME, E.SAL, S.GRADE
FROM EMP E, DEPT D, SALGRADE S
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL BETWEEN S.LOSAL AND S.HISAL
AND E.DEPTNO = 10;
![](https://blog.kakaocdn.net/dn/dYpPC3/btrmFo7LDBD/M0qj9Pc8my0tsJW1YItCs0/img.png)
--Q8) 사원테이블과 부서테이블, 급여테이블에서 부서번호가 10번이거나 20번인 사원들의 부서번호, 부서이름, 사원이름, 월급, 급여등급을 출력하자.
--단, 부서번호가 낮은 순으로(오름차순), 월급이 높은 순으로(내림차순) 출력하자.
--ANSI 표준
SELECT DEPTNO, DNAME, ENAME, SAL, GRADE
FROM EMP JOIN DEPT USING(DEPTNO) JOIN SALGRADE ON(SAL BETWEEN LOSAL AND HISAL)
WHERE DEPTNO = 10
OR DEPTNO = 20
ORDER BY DEPTNO ASC, SAL DESC;
![](https://blog.kakaocdn.net/dn/baTC0l/btrmKCwSw7T/ShGWYp1PwAhYYzNwlj3sBk/img.png)
--ORACLE 표준
SELECT E.DEPTNO, D.DNAME, E.ENAME, E.SAL, S.GRADE
FROM EMP E, DEPT D, SALGRADE S
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL BETWEEN S.LOSAL AND S.HISAL
AND (E.DEPTNO = 10 OR E.DEPTNO = 20);
![](https://blog.kakaocdn.net/dn/bczQt8/btrmMfHI5yR/7KjlrgzIvP71kGoSOFLEnk/img.png)
--Q9) 사원테이블과 부서테이블에서 해당 부서의 모든 사원에 대한 부서이름, 위치, 사원 수 및 평균 급여를 출력하자.
--단, 각각의 컬럼명을 DNAME, LOC, NUMBER OF PEOPLE, SALARY 로 출력하자.
--ANSI 표준
SELECT DNAME, LOC, COUNT(*) AS "NUMBER OF PEOPLE", AVG(SAL) AS "SALARY"
FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO
GROUP BY (DNAME, LOC);
![](https://blog.kakaocdn.net/dn/bIJatJ/btrmGhHhtr7/i5MdeI2AwVzdXI0ZNoEqaK/img.png)
--ORACLE 표준
SELECT D.DNAME, D.LOC, COUNT(*) AS "NUMBER OF PEOPLE", AVG(E.SAL) AS "SALARY"
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.DNAME, D.LOC;
![](https://blog.kakaocdn.net/dn/b1MClX/btrmFo0YZbL/LqUrCmo7tkEX205vw1BTaK/img.png)
'RDB > Oracle' 카테고리의 다른 글
[ORACLE] ERD (0) | 2022.01.07 |
---|---|
[ORACLE] 서브쿼리(SUBQUERY) (0) | 2022.01.05 |
[ORACLE] 순위함수(RANK), 계층형함수 (0) | 2022.01.04 |
[ORACLE] Top N Query(ROWID / ROWNUM) (0) | 2022.01.03 |
[ORACLE] 정렬 - ORDER BY (0) | 2022.01.02 |