#1
1.
50, 80, 100 번 부서에 속해있는 직원들을 대상으로 1995년 이전에 입사했으며, 급여가 5000 이상인 직원들의 이름, 부서id, 입사일, 급여를 조회하시오.
단, 출력결과는 입사일이 빠른 직원이 먼저 출력되어야 한다.
SQL> SELECT FIRST_NAME, DEPARTMENT_ID, TO_CHAR(HIRE_DATE, 'YYYY-MM-DD') "HIRE_DATE", SALARY
2 FROM EMPLOYEES
3 WHERE DEPARTMENT_ID IN(50, 80, 100) AND SALARY >= 5000 AND EXTRACT(YEAR FROM HIRE_DATE) <= 1995;
SELECT FIRST_NAME, DEPARTMENT_ID, TO_CHAR(HIRE_DATE, 'YYYY-MM-DD'), HIRE_DATE, SALARY
FROM EMPLOYEES
WHERE SUBSTR(TO_CHAR(HIRE_DATE, 'YYYY-MM-DD'), 1, 4) <= 1995 AND SALARY > 5000 AND DEPARTMENT_ID IN(50, 80, 100)
ORDER BY 1;
2.
입사 년도 별로 입사자수를 조회하되, 입사자 수가 가장 많은 년도부터 출력되록 하시오.
COUNT(*) + GROUP BY
SQL> SELECT TO_CHAR(HIRE_DATE, 'YY')"입사년도", COUNT(JOB_ID)"직원수"
2 FROM EMPLOYEES
3 GROUP BY TO_CHAR(HIRE_DATE, 'YY')
4 ORDER BY COUNT(JOB_ID) DESC;
3. 부서이름 별 직원수를 조회하되
부서배치가 되지 않은 직원이 있다면 부서명이 미배치 직원에 포함되어 출력되도록 하시오.
SELECT NVL(D.DEPARTMENT_NAME, '<미배치 직원>'> 부서명,
COUNT(*) 직원수
FROM DEPARTMENTS D, EMPLOYEES E
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID(+)
GROUP BY D.DEPARTMENT_NAME;
4.
자신이 속한 부서의 평균급여보다 급여를 많이 받는 직원의 이름과 급여, 부서id 를 조회하시오.
SELECT FIRST_NAME "이름", SALARY "급여", DEPARTMENT_ID "부서ID"
FROM EMPLOYEES E
WHERE SALARY > (SELECT AVG(SALARY) FROM EMPLOYEES WHERE E.DEPARTMENT_ID = H.DEPARTMENT_ID);
#2
Join 함수
INNER JOIN (FALSE, NULL은 가져오지 않음)
- 각 테이블의 조인 컬럼(공통 컬럼)을 비교하여 조인조건만 만족하는 레코드만 선택하는 조인
- 테이블 X, S에서 M1 = S1 조건을 만족하는 레코드만 가져오는 JOIN문을 작성해보자.
-- Ansi JIN
SELECT * FROM M INNER JOIN S ON M1 = S1
칼럼이 다를 경우 ON
칼럼이 같을 경우 USING
-- SQL SERVER JOIN -
SELECT * FROM M, S WHERE M1 = S1
#3
Q1. INNER JOIN을 이용해서 사원의 이름과 그 사원이 속해있는 부서이름을 출력해보자.
<ANSI JOIN>
SQL> SELECT ENAME, DNAME
2 FROM EMP JOIN DEPT USING(DEPTNO);
<ORACLE JOIN>
SQL> SELECT ENAME, DNAME
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO;
SQL> SELECT ENAME, DNAME
2 FROM EMP E, DEPT D
3 WHERE E.DEPTNO = D.DEPTNO;
Q2. 사원의 이름과 그 사원이 속해있는 부서이름과 부서번호를 출력하라.
<ANSI JOIN>
SQL> SELECT ENAME, DNAME, DEPTNO
2 FROM EMP JOIN DEPT USING(DEPTNO);
<ORACLE JOIN>
SQL> SELECT ENAME, DNAME, DEPT.DEPTNO
2 FROM EMP, DEPT
3 WHERE EMP.DEPTNO = DEPT.DEPTNO;
#4
CROSS JOIN
각 테이블의 모든 로우에 대해서 가능한 모든 조합을 가지는 쿼리 결과를 만들어내는 조인
-- ANSI JOIN --
SELECT *
FROM M CROSS JOIN S
SQL SERVER JOIN -
SELECT *
FROM M, S
ⓐ LEFT OUTER JOIN
M 테이블을 주 테이블로 놓고, S테이블을 종 테이블로 하여 조인을 걸어서 M1 = S1 조건을 만족하는 레코드를 가져오는 LEFT OUTER JOIN을 작성
SELECT *
FROM M LEFT OUTER JOIN S
ON M1 = S1
--SQL SERVER JOIN
SELECT *
FROM M, S
WHERE M1 = S1(+);
ⓑ RIGHT OUTER JOIN
종 테이블 에 맞지 않는 건 NULL로 RETURN
ⓒ FULL OUTER JOIN
-- ANSI JOIN
SELECT *
FROM M FULL OUTER JOIN S
ON M1 = S1;
한번은 M1을 주를 주고 한 번은 S1을 주를 줌.
ⓒ 세 개 이상의 테이블에서 조인 걸기
-- ANSI JOIN
SELECT *
FROM M INNER JOIN S
ON M1 = S1
INNER JOIN X
ON S1 = X1;
-- SQL SERVER JOIN
SELECT *
FROM M, S, X
WHERE M1 = S1 AND S1 = X1;
ⓓ SELF JOIN
하나의 테이블 내에서 서로 다른 컬럼 간에 참조 관계가 있을 때 걸리는 JOIN
SELECT 사원.EMPNO, 사원.ENAME, 관리자.EMPNO, 관리자.ENAME
FROM EMP 사원, EMP 관리자
WHERE 사원.MGR = 관리자.EMPNO(+);
Q1. 각 사원의 이름과 월급, 그리고 그 사원의 급여 등급을 출력하자
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
Q2. 각 사원의 이름, 월급, 급여등급, 그가 속한 부서 이름을 출력하라.
SELECT E.ENAME, E.SAL, 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
'국비교육 > JAVA' 카테고리의 다른 글
1월 15일 국비교육 33일차 (0) | 2019.01.15 |
---|---|
1월 14일 국비교육 32일차 (0) | 2019.01.14 |
1월 10일 국비교육 30일차 (0) | 2019.01.10 |
1월 9일 국비교육 29일차 (0) | 2019.01.09 |
1월 8일 국비교육 28일차 (0) | 2019.01.08 |
댓글