1. SELECT의 가장 기본적인 문법
SELECT 그룹함수(컬럼명)[,검색대상,...]
FROM 테이블명
[WHERE 조건식]
[GROUP BY {컬럼명|연산식|함수},{컬럼명|연산식|함수},... ]
[HAVING 그룹조건식]
[ORDER BY {컬럼명|연산식|별칭|COLUMN_INDEX} {ASC|DESC},...]
2. JOIN문의 개요
- 두 개 이상의 테이블에서 행을 결합하여 원하는 컬럼값을 검색하기 위한 기능
[step1] EMP테이블과 DEPT테이블에 저장된 컬럼값 검색 - 테이블을 각각 검색
--EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, EMPNO FROM EMP;
SELECT DISTINCT * FROM EMP;
--DEPT테이블에 저장된 모든 부서의 부서번호, 부서이름, 부서위치 검색
SELECT DEPTNO,DNAME,LOC FROM DEPT;
SELECT DISTINCT * FROM DEPT;
-- 🧸테이블을 각각 검색하는 것은 매우 불편, 행을 결합하여 한 테이블에 컬럼값이 나올 수 있도록 하자!
[step2] 교차 조인(CROSS JOIN) - 비권장
- 카타시안 프로덕트(CATASIAN PRODUCT) : 두개 이상의 테이블을 결합조건 없이 검색한 경우 발생되는 결과
--EMP테이블과 DEPT테이블에서 모든 사원의 사원번호, 사원이름, 급여, 부서이름, 부서위치 검색
SELECT EMPNO,DNAME,SAL,DNAME,LOC FROM EMP,DEPT;
--4(DEPT테이블) * 14(EMP테이블) = 총 56개의 행 발생
[step3] 조인(JOIN) - 권장
- 두개 이상의 테이블에서 컬럼값을 검색하기 위해서는 반드시 행을 결합하기 위한 조건을 제공해 검색하기!!!!
- JOIN을 이용해 결합조건식을 잘 표현하는 것이 매우 중요하다!!
📌JOIN(결합)하는 방법
- 결합조건은 WHERE의 조건식을 사용하여 표현
- 두개이상의 테이블에 같은 이름의 컬럼이 있는 경우 반드시 [테이블명.컬럼명] 형식으로 구분 표현
- 결합 테이블에서 같은 이름의 컬럼을 동시에 검색할 경우, 컬럼 별칭을 사용하여 검색하는 것을 권장
3. 조인(JOIN)의 종류
1) 동등결합(EQUI JOIN)
- 두개이상의 테이블에서 결합조건에 = 연산자를 사용하여 참인 행을 결합하여 검색
- 같을 때만 결합시켜주세요~ 만약 같지 않으면 결합이 안된답니다~
동등결합(EQUI JOIN) 예시 1
--EMP테이블과 DEPT테이블에서 모든 사원의 사원번호, 사원이름, 급여, [부서이름], 부서위치 검색
--결합 조건 :
--EMP 테이블의 부서번호(DEPTNO)와 DEPT 테이블의 부서번호(DEPTNO)가 같은 행을 결합하여 검색
--결합조건식) WHERE DEPTNO=DEPTNO --ERROR
SELECT EMPNO,ENAME,SAL,LOC FROM EMP,DEPT WHERE DEPTNO=DEPTNO; --ERROR
--결합조건식) WHERE EMP.DEPTNO=DEPT.DEPTNO --OK
SELECT EMPNO,ENAME,SAL,LOC FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO; --OK
동등결합(EQUI JOIN) 예시 2
--EMP 테이블의 모든 사원의 사원번호, 사원이름, 급여, [부서번호]와,
--DEPT 테이블의 모든 사원의 [부서번호], 부서이름, 부서위치 검색
--결합조건 :
--EMP 테이블의 부서번호(DETPNO)와 DEPT 테이블의 부서번호(DETPNO)가 같은 행을 결합하여 검색
-- 방법1. 각각 검색하기
-- EMP.DEPTNO이든 DEPT.DEPTNO이든 이름은 DEPTNO로 검색됨
-- 결합조건식) WHERE EMP.DEPTNO = DEPT.DEPTNO
SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAME, LOC FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
-- 결합조건식) WHERE EMP.DEPTNO = DEPT.DEPTNO
SELECT EMPNO, ENAME, SAL, DEPT.DEPTNO, DNAME, LOC FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
-- 방법2. 함께 검색하기
-- 결합 테이블에서 같은 이름의 컬럼을 동시에 검색할 경우
-- 첫번째로 검색되는 컬럼을 제외한 나머지 컬럼의 이름은 자동으로 변경되어 검색됨ㅠ 개선하자!
SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DEPT.DEPTNO, DNAME, LOC FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
-- 방법3. 함께 검색하기 개선시킴
-- 결합 테이블에서 같은 이름의 컬럼을 동시에 검색할 경우 "컬럼 별칭"을 사용하여 검색하는 것을 권장
SELECT EMPNO, ENAME, SAL, EMP.DEPTNO "EMP_DEPTNO", DEPT.DEPTNO "DEPT_DEPTNO", DNAME, LOCFROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
TABLE ALIAS(테이블 별칭)
테이블에 새로운 이름을 일시적으로 부여하는 기능
테이블 결합시,
테이블의 이름을 간단하게 표현하기 위해 사용하거나 하나의 테이블을 다수의 테이블로 표현하기 위해 사용
-- 형식
SELECT 검색대상,... FROM 테이블명 별칭, 테이블명 별칭, ...
-- 예시
SELECT EMPNO,ENAME,SAL,E.DEPTNO,DNAME,LOC FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
SELECT EMPNO,ENAME,SAL,D.DEPTNO,DNAME,LOC FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
-- 테이블 별칭 설정 후 주의!!
-- 테이블 별칭을 설정한 후 기존 테이블명을 사용하면 에러 발생
SELECT EMPNO,ENAME,SAL,E.DEPTNO,DNAME,LOC FROM EMP E, DEPT D WHERE EMP.DEPTNO = D.DEPTNO; --ERROR
2) 비동등결합(NON-EQUI JOIN)
- 두개이상의 테이블에서 결합조건에 = 연산자가 아닌 연산자를 사용하여 참인 행을 결합하여 검색
- EX) BETWEEN A AND B
--1)
SELECT * FROM EMP;
--EMP 테이블에 저장된 모든 사원의 사원번호, 사원이름, 급여 검색
SELECT EMPNO, ENAME, SAL FROM EMP;
--2)
SELECT * FROM SALGRADE;
--SALGRADE 테이블에 저장된 모든 급여등급의 등급번호, 최소급여, 최대급여 검색
SELECT GRADE, LOSAL, HISAL FROM SALGRADE;
--3)
--EMP테이블과 SALGRADE테이블에서 모든 사원의 사원번호, 사원이름, 급여, 급여등급번호를 검색
--결합조건
--사원의 급여(SAL)가 SALGRADE 테이블의 최소급여(LOSAL)부터 최대급여(HISAL) 범위에 포함될 경우
--행 결합하여 검색
--결합조건식 : WHERE SAL BETWEEN LOSAL AND HISAL
SELECT DEPTNO, ENAME, GRADE FROM EMP, SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL;
3) 외부결합(OUTER JOIN)
- 결합조건이 참인 행만 결합하는 것이 아니라 결합조건이 맞지 않는 행도 NULL과 결합하여 검색
- 결합조건식의 결합 테이블에 (+)를 사용하면 결합조건에 맞지 않는 행을 NULL과 결합하여 검색
--1)
--EMP테이블에 저장된 '모든 사원의 부서번호'를 중복되지 않는 유일한 컬럼값만 검색
SELECT DISTINCT DEPTNO FROM EMP; --검색결과 : 10, 20, 30
--2)
--DEPT테이블에 저장된 '모든 부서의 부서번호' 검색
SELECT DEPTNO FROM DEPT; --검색결과 : 10, 20, 30, 40
--즉, 40번 부서는 존재하지만, 실제 40번 부서에는 사원이 없음!
-- EMP 테이블과 DEPT 테이블에 저장된 모든 사원의 사원번호,사원이름,급여,부서이름,부서위치 검색
--1)
-- 결합조건 - 동등결합
-- EMP 테이블의 [부서번호(DETPNO)]와 DEPT 테이블의 [부서번호(DETPNO)]]가 같은 행을 결합하여 검색
-- 동등결합의 단점: 40번 부서에 근무하는 사원이 없으므로 [40번 부서에 대한 부서이름과 부서위치 미검색]
SELECT EMPNO,ENAME,SAL,DNAME,LOC FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO;
--2)
-- 해결방법
-- 결합조건 - 외부결합
-- [사원이 없는 부서정보도 검색하기 위해] 검색조건식에서 EMP 테이블의 결합조건에 (+)를 붙여
-- [EMP 테이블에 결합되는 행이 없는 경우 컬럼값 대신 NULL이 결합되어 검색]
-- 해석) DEPT.DEPTNO은 무조건 다 검색해주세요(+)
-- 만약 없는 컬럼값이 있다면 NULL을 추가해서라도 다 검색해주세요.
SELECT EMPNO,ENAME,SAL,DNAME,LOC FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;
SELECT EMPNO,ENAME,SAL,DNAME,LOC FROM EMP,DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO(+);
--3)
--주의) (+)위치에 따라 결과값이 다름
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP, DEPT WHERE DEPT.DEPTNO(+)= EMP.DEPTNO;
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO(+);
4) 자기결합(SELF JOIN)
- 하나의 테이블에서 서로 다른 별칭을 부여하여 다른 테이블로 설정해 결합하여 검색
- 검색대상에 반드시 테이블 별칭으로 테이블을 구분하여 컬럼값 검색
--EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 관리자번호(사원번호) 검색
SELECT EMPNO, ENAME, MGR FROM EMP;
-- EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 관리자번호(사원번호), 관리자이름(사원이름) 검색
--방법1.
--결합조건 - 자기결합 & 동등결합
--EMP테이블(별칭: WORKER)의 관리자번호(MGR)와
--EMP테이블(별칭: MANAGER)의 사원번호(EMPNO)가 같은 행을 결합하여 검색
--동등결합이므로
--EMP테이블의 관리자번호(MGR)에 NULL이 저장된 사원은 결합조건이 맞지 않으므로 행이 검색되지 않아 미검색
SELECT WORKER.EMPNO, WORKER.ENAME, WORKER.MGR ,MANAGER.ENAME
FROM EMP WORKER, EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO;
--관리자가 NULL인 사원은 검색되지 않음 : KING
--방법2. '모든사원'이므로 권장!
--결합조건 - 자기결합 & 외부결합
--[EMP테이블(별칭: WORKER)의 관리자번호(MGR)]와
--[EMP테이블(별칭:MANAGER)의 사원번호(EMPNO)]가 같은 행을 결합하여 검색
--외부결합이므로
--EMP테이블의 관리자번호(MGR)에 NULL이 저장된 사원도 검색됨
SELECT WORKER.EMPNO, WORKER.ENAME "WORKER_ENAME", WORKER.MGR ,MANAGER.ENAME "MANAGER_ENAME"
FROM EMP WORKER, EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO(+);
5) WHERE절 내 결합조건과 행조건이 함께 있다면? 표준SQL(SQL3)의 등장
💧문제점
- WHERE절 내에 결합조건과 행조건이 함께 사용되면 조건이 많아질수록 구분하기 어려울 수 있음
- 유지보수가 어려워짐
--EMP테이블과 DEPT테이블에서 SALES부서에 근무하는 사원의 사원번호, 사원이름, 급여, 부서이름, 부서위치 검색
--테이블 결합조건 - EMP.DEPTNO=DEPT.DEPTNO
--[EMP 테이블의 부서번호(DETPNO)]와
--[DEPT 테이블의 부서번호(DETPNO)]가 같은 행을 결합하여 검색
--행 검색조건 - DNAME='SALES'
SELECT EMPNO, ENAME, SAL, DNAME, LOC
FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO AND DNAME='SALES';
💧해결방법
- 표준SQL(SQL3)을 사용하자
표준SQL(SQL3)
- 기존의 테이블 결합은 테이블의 결합조건과 행의 검색조건을 WHERE에서 같이 사용하므로 유지보수의 불편함 존재
- 1999년에 채택된 표준SQL(SQL3)에서는 테이블의 결합조건과 행의 검색조건을 구분하여 사용되므로 다양한 테이블 결합방법을 제공함
6) [SQL3] CROSS JOIN
-- 모든 행 교차 (like카타시안 프로덕트)
-- 결합테이블의 모든 행을 교차 결합하여 검색
-- 결합조건을 생략함
-- 별로 중요한 개념은 아님..
테이블명1 CROSS JOIN 테이블명2
형식
SELECT 검색대상,... FORM 테이블명1 CROSS JOIN 테이블명2
--EMP테이블과 DEPT테이블에서 모든 사원의 사원번호, 사원이름, 급여, 부서이름, 부서위치 검색
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP CROSS JOIN DEPT;
7) [SQL3] NATURAL JOIN - 동일컬럼명 "1개"
-- 결합 테이블에 **같은 이름의 컬럼이 딱 하나만** 있는 경우
-- 같은 이름의 컬럼에 저장된 컬럼값이 같은 행을 서로 결합하여 검색
-- **결합조건을 명시하지 않아도** 같은 이름의 컬럼값을 이용하여 테이블의 행이 결합해 검색
-- (결합조건을 생략함)
-- **테이블명을 명시하지 않아도** 두 테이블에 존재하는 동일한 컬럼명을 검색대상으로 검색가능
테이블명1 NATURAL JOIN 테이블명2
형식
SELECT 검색대상,... FORM 테이블명1 NATURAL JOIN 테이블명2
결합조건 생략가능
--EMP테이블과 DEPT테이블에서 SALES부서에 근무하는 사원의
--사원번호, 사원이름, 급여, 부서이름, 부서위치 검색
--결합조건
--EMP 테이블의 부서번호(DETPNO)와 DEPT 테이블의 부서번호(DETPNO)가 같은 행을 결합하여 검색
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP NATURAL JOIN DEPT;
테이블명 생략가능
- NATURAL JOIN을 사용할 경우 검색대상에 두 테이블에 존재하는 동일한 컬럼명을 검색할 때 테이블명을 명시하지 않아도 검색 가능
--EMP테이블과 DEPT테이블에서 SALES부서에 근무하는 사원의 사원번호, 사원이름, 급여, 부서이름, 부서위치 검색
SELECT EMPNO, ENAME, SAL, DEPTNO, DNAME, LOC FROM EMP NATURAL JOIN DEPT;
8) [SQL3] JOIN USING - 동일컬럼명 "여러개"
-- 결합 테이블에 **같은 이름의 컬럼이 여러개** 있는 경우
-- 특정 컬럼에 저장된 컬럼값이 같은 행을 서로 결합하여 검색
-- 비권장 (애초에 테이블 설계 시 컬럼명을 다르게 하는 것이 좋음!)
-- EX) 한 테이블의 컬럼명이 `NAME`이고, 다른 테이블의 컬럼명도 `NAME`으로 짓기 보다는,
-- 한 테이블의 컬럼명은 `NAME_PRODUCT`,
-- 다른 테이블의 컬럼명은 `NAME_PERSON` 이렇게 구체적으로 짓는 것이 좋음!!
테이블명1 JOIN 테이블명2 USING(컬럼명)
형식
SELECT 검색대상,... FORM 테이블명1 JOIN 테이블명2 USING(컬럼명)
--결합조건
--EMP 테이블의 부서번호(DETPNO)와 DEPT 테이블의 부서번호(DETPNO)가 같은 행을 결합하여 검색
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP JOIN DEPT USING (DEPTNO);
9) [SQL3] INNER JOIN
-- 결합 테이블의 **결합조건이 맞는 행만을 결합**하여 검색
테이블명1 [INNER] JOIN 테이블명2 ON 결합조건
형식
SELECT 검색대상,... FORM 테이블명1 [INNER] JOIN 테이블명2 ON 결합조건
INNER키워드 생략가능
--EMP테이블과 DEPT테이블에서 SALES부서에 근무하는 사원의 사원번호, 사원이름, 급여, 부서이름, 부서위치 검색
--결합조건
--EMP 테이블의 부서번호(DETPNO)와 DEPT 테이블의 부서번호(DETPNO)가 같은 행을 결합하여 검색
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
--INNER키워드 생략가능
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
동일한 컬럼명을 검색대상으로 사용할 경우 반드시 "테이블명 명시
--EMP테이블과 DEPT테이블에서 SALES부서에 근무하는 사원의
--사원번호, 사원이름, 급여, [부서번호], 부서이름, 부서위치 검색
--INNER JOIN을 사용할 경우 검색대상으로 결합 테이블에 존재하는 동일한 컬럼명을 검색할 때 반드시 테이블명을 명시하여 검색
SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAME, LOC
FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
SELECT EMPNO, ENAME, SAL, DEPT.DEPTNO, DNAME, LOC
FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
예시
--1)
--EMP테이블과 SALGRADE테이블에서 모든 사원의
--사원번호, 사원이름, 급여, 급여등록번호 검색
--결합조건)
--EMP테이블의 급여(SAL)가 SALGRADE테이블의 최소급여(LOSAL)와 최대급여(HISAL)에 포함될 경우
--행을 결합
SELECT EMPNO, ENAME, SAL, GRADE
FROM EMP JOIN SALGRADE ON SAL BETWEEN LOSAL AND HISAL;
--2)
--EMP테이블과 DEPT테이블, SALGRADE테이블에서 모든 사원의
--사원번호, 사원이름, 급여, 부서이름, 부서위치, 급여등급번호 검색
--결합조건1)
--EMP 테이블의 부서번호(DETPNO)와 DEPT 테이블의 부서번호(DETPNO)가 같은
--행을 결합하여 검색
--결합조건2)
--EMP테이블의 급여(SAL)가 SALGRADE테이블의 최소급여(LOSAL)와 최대급여(HISAL)에 포함되는
--행을 결합하여 검색
SELECT EMPNO,ENAME,SAL,DNAME,LOC,GRADE FROM EMP
JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO //결합조건1
JOIN SALGRADE ON SAL BETWEEN LOSAL AND HISAL; //결합조건2
--3)
--EMP테이블과 DEPT테이블에서 SALES부서에 근무하는 사원의 사원번호, 사원이름, 급여, 부서이름, 부서위치 검색
--결합조건)
--EMP 테이블의 부서번호(DETPNO)와 DEPT 테이블의 부서번호(DETPNO)가 같은 행을 결합하여 검색
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP
JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO //결합조건
WHERE DNAME='SALES'; //검색 행 조건
10) [SQL3] OUTER JOIN
-- 결합조건을 명시하여 결합테이블에서 결합조건이 맞는 행만 결합하여 검색하는 것이 아니라
-- 결합조건이 맞지 않는 경우 NULL과 결합하여 검색
테이블명1 (LEFT|RIGHT|FULL) [OUTER] JOIN 테이블명2 ON 결합조건
형식
- LEFT OUTER JOIN
- 왼쪽 테이블은 모든 행을 다 검색하고, 오른쪽 테이블은 결합조건이 맞는 행이 없는 경우 NULL과 결합하여 검색
- RIGHT OUTER JOIN
- 오른쪽 테이블은 모든 행을 다 검색하고, 왼쪽 테이블은 결합조건이 맞는 행이 없는 경우 NULL과 결합하여 검색
- FULL OUTER JOIN
- 모든 테이블의 행을 결합하여 검색하고, 결합조건이 맞는 행이 없는 경우 NULL과 결합하여 검색
SELECT 검색대상,... FORM 테이블명1 (LEFT|RIGHT|FULL) [OUTER] JOIN 테이블명2 ON 결합조건
OUTER키워드 생략가능
--EMP테이블과 DEPT테이블에서 모든 사원의 사원번호, 사원이름, 급여, 부서이름, 부서위치 검색
--결합조건
--EMP 테이블의 부서번호(DETPNO)와 DEPT 테이블의 부서번호(DETPNO)가 같은 행을 결합하여 검색하되
--결합조건이 맞지 않는 행은 NULL과 결합하여 검색
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP LEFT OUTER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP RIGHT OUTER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP FULL OUTER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
--OUTER 키워드 생략 가능
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP LEFT JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP RIGHT JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
SELECT EMPNO, ENAME, SAL, DNAME, LOC FROM EMP FULL JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
NULL값도 검색하기 위해 OUTER조인 이용
--EMP 테이블에 저장된 모든 사원의 사원번호, 사원이름, 관리자번호(사원번호), 관리자이름(사원이름) 검색
--결합조건
--EMP테이블(별칭: WORKER)의 관리자번호(MGR)와 EMP테이블(별칭:MANAGER)의 사원번호(EMPNO)가 같은 행을 결합하여 검색
--방법1.
--INNER JOIN + SELF JOIN
--INNER JOIN을 사용하면 결합조건이 맞은 행만 검색하므로
--EMP테이블(별칭:WORKER)의 관리자번호(MGR)에 NULL이 저장된 사원 미검색
SELECT WORKER.EMPNO ,WORKER.ENAME, WORKER.MGR, MANAGER.ENAME
FROM EMP WORKER INNER JOIN EMP MANAGER ON WORKER.MGR = MANAGER.EMPNO;
--방법2.
--LEFT OUTER JOIN + SELF JOIN
--LEFT OUTER JOIN을 사용하여 결합조건이 맞은 행만 검색하는 것이 아니라
--EMP 테이블(별칭:WORKER)의 관리자번호(MGR)에 NULL이 저장된 사원의 관리자이름을 NULL로 결합하여 검색
SELECT WORKER.EMPNO, ORKER.ENAME "WORKER_ENAME", WORKER.MGR, MANAGER.ENAME "MANAGER_ENAME"
FROM EMP WORKER LEFT OUTER JOIN EMP MANAGER ON WORKER.MGR = MANAGER.EMPNO;
4. 연습문제
- 각 테이블의 컬러명 확인하기
SELECT * FROM EMP;
SELECT * FROM DEPT;
SELECT * FROM SALGRADE;
문제1. 부서테이블과 사원테이블에서 사번, 사원명, 부서코드, 부서명을 검색하시오.
(단, 사원명 오름차순 정렬할 것)
SELECT EMPNO, ENAME, EMP.DEPTNO, DNAME FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO --결합조건
ORDER BY ENAME;
문제2. 부서테이블과 사원테이블에서 사번, 사원명, 급여, 부서명을 검색하시오.
(단, 급여가 2000 이상인 사원에 대하여 급여기준으로 내림차순 정렬할 것)
SELECT EMPNO, ENAME, SAL, DNAME FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO --결합조건
WHERE SAL >= 2000 ORDER BY SAL DESC; --검색조건
문제3. 부서테이블과 사원테이블에서 사번, 사원명, 업무, 급여, 부서명을 검색하시오.
(단, 엄무가 Manager이며 급여가 2500 이상인 사원에 대하여 사번을 기준으로 오름차순 정렬할 것.)
SELECT EMPNO, ENAME, JOB, SAL, DNAME FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO --결합조건
WHERE JOB='MANAGER' AND SAL>= 2500 ORDER BY EMPNO; --검색조건
문제4. 사원테이블과 급여등급테이블에서 사번, 사원명, 급여, 등급을 검색하시오.
(단, 등급은 급여가 하한값과 상한값 범위에 포함되고 등급이 4이며 급여를기준으로 내림차순 정렬할 것.)
SELECT EMPNO, ENAME, SAL, GRADE FROM EMP INNER JOIN SALGRADE ON SAL BETWEEN LOSAL AND HISAL --결합조건
WHERE GRADE=4 ORDER BY SAL; --검색조건
문제5. 부서테이블, 사원테이블, 급여등급테이블에서 사번, 사원명, 부서명, 급여, 등급을 검색하시오.
(단, 등급은 급여가 하한값과 상한값 범위에 포함되며 등급을 기준으로 내림차순 정렬할 것.)
SELECT EMP.EMPNO, ENAME, DNAME, SAL, GRADE FROM EMP
INNER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO --결합조건1
INNER JOIN SALGRADE ON SAL BETWEEN LOSAL AND HISAL --결합조건2
ORDER BY GRADE DESC;
문제6. 사원테이블에서 사원명과 해당사원의 관리자명을 검색하시오. (이너조인 사용)
SELECT WORKER.ENAME "사원명", MANAGER.ENAME "관리자명"
FROM EMP WORKER INNER JOIN EMP MANAGER ON WORKER.MGR = MANAGER.EMPNO; --결합조건
문제7. 사원테이블에서 사원명, 해당사원의 관리자명, 해당사원의 관리자의 관리자명을 검색하시오. (이너조인 사용)
SELECT WORKER.ENAME "사원명", MANAGER.ENAME "관리자명", KINGMANAGER.ENAME "해당사원의관리자명"
FROM EMP WORKER INNER JOIN EMP MANAGER ON WORKER.MGR = MANAGER.EMPNO --결합조건1
INNER JOIN EMP KINGMANAGER ON MANAGER.MGR=KINGMANAGER.EMPNO; --결합조건2
문제8. 7번 결과에서 상위 관리자가 없는 모든 사원의 이름도 사원명에 출력되도록 수정하시오. (아우터조인 사용)
- 한번 LEFT OUTER JOIN썼으면 그 뒤에도 모두 다 LEFT OUTER JOIN 사용해줘야함!!
SELECT WORKER.ENAME "사원명", MANAGER.ENAME "관리자명", KINGMANAGER.ENAME "해당사원의관리자명"
FROM EMP WORKER LEFT OUTER JOIN EMP MANAGER ON WORKER.MGR = MANAGER.EMPNO --결합조건1
LEFT OUTER JOIN EMP KINGMANAGER ON MANAGER.MGR=KINGMANAGER.EMPNO; --결합조건2
'sql' 카테고리의 다른 글
[sql] 8. 집합연산자 | DESC명령어 (3) | 2024.05.08 |
---|---|
[sql] 7. 서브쿼리(SUBQUERY) (0) | 2024.05.08 |
[sql] 5. 그룹함수 | GROUP BY절 | HAVING절 (0) | 2024.05.07 |
[sql] 4. 함수(FUNCTION)의 개념 및 단일함수 (0) | 2024.05.06 |
[sql] 3. DQL (SELECT) (1) | 2024.05.06 |