-- 80번 부서에 근무하는 사원 수 조회하기
SELECT COUNT(*)
FROM EMPLOYEES E
WHERE E.DEPARTMENT_ID = 80;
 
-- 커미션을 받는 사원 중에서 급여가 10000달러 이상인 사원 수 조회하기
SELECT COUNT(*)
FROM EMPLOYEES E
WHERE E.COMMISSION_PCT IS NOT NULL
AND E.SALARY >= 10000;
 
-- 사원들 중에서 급여 등급이 B등급인 사원 수 조회하기
SELECT COUNT(*)
FROM EMPLOYEES E, JOB_GRADES JG
WHERE E.SALARY >= JG.LOWEST_SALARY
AND E.SALARY <= JG.HIGHEST_SALARY
AND JG.GRA = 'B';
 
-- 부서별 사원 수 조회하기
SELECT COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
 
-- 오류 DEPARTMENT_ID는 107개, COUNT는 1개 나오므로.
SELECT DEPARTMENT_ID, COUNT(*)
FROM EMPLOYEES;
 
-- 그룹 바이 절에 등장한 컬럼은 가능
SELECT DEPARTMENT_ID, COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
 
-- SELECT 5
-- FROM 1
-- WHERE 2
-- GROUP BY 3
-- HAVING 4 그룹함수가 적용된 행에 제한을 가함. 따라서 그룹 바이가 있어야 함.
-- ORDER BY 6
-- GROUP BY 절에서는 SELECT의 별칭을 사용할 수 없다.
-- GROUP 함수는 한 번만 중첩이 가능하다.
-- SUM(COUNT(*)) 가능
-- AVG(SUM(COUNT(*))) 불가능
 
-- 부서별 사원 수 조회하기
SELECT DEPARTMENT_ID, COUNT(*) AS CNT
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(*>= 30;
 
-- 부서별 평균 급여를 조회하기(10000달러 미만)
SELECT E.DEPARTMENT_ID, TRUNC(AVG(E.SALARY))
FROM EMPLOYEES E
WHERE E.DEPARTMENT_ID IS NOT NULL
GROUP BY E.DEPARTMENT_ID
HAVING TRUNC(AVG(E.SALARY)) < 10000;
 
-- 급여 등급별 사원 수를 조회하기
SELECT JG.GRA, COUNT(*)
FROM EMPLOYEES E, JOB_GRADES JG
WHERE E.SALARY >= JG.LOWEST_SALARY
AND E.SALARY <= JG.HIGHEST_SALARY
GROUP BY JG.GRA
ORDER BY 1;
 
-- 급여별 사원 수를 조회하기
-- 2000    10    2000~2999
-- 3000    14    3000~3999
-- 4000     7    4000~4999
-- 5000    11    5000~5999
SELECT TRUNC(SALARY, -3), COUNT(*)
FROM EMPLOYEES
GROUP BY TRUNC(SALARY, -3)
ORDER BY 1;
 
SELECT SUBSTR(FIRST_NAME, 11), COUNT(*)
FROM EMPLOYEES
GROUP BY SUBSTR(FIRST_NAME, 11)
ORDER BY 1;
 
-- 부서별, 직종별 사원수 계산하기
SELECT DEPARTMENT_ID, JOB_ID, COUNT(*)
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL
GROUP BY DEPARTMENT_ID, JOB_ID
ORDER BY 12;
 
-- 부서 소재지(LOCATION의 CITY)별 사원 수 조회하기
SELECT L.CITY, COUNT(L.CITY)
FROM EMPLOYEES E, DEPARTMENTS D, LOCATIONS L
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
AND D.LOCATION_ID = L.LOCATION_ID
AND E.DEPARTMENT_ID IS NOT NULL
GROUP BY L.CITY
ORDER BY L.CITY;
 
-- 각 부서별 최고/최저/평균 급여를 조회하기
SELECT D.DEPARTMENT_NAME, MAX(E.SALARY), MIN(E.SALARY), TRUNC(AVG(E.SALARY))
FROM EMPLOYEES E, DEPARTMENTS D
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
AND E.DEPARTMENT_ID IS NOT NULL -- 있어도 그만, 없어도 그만
GROUP BY D.DEPARTMENT_NAME
HAVING MAX(E.SALARY) > 10000;
 
-- 서브쿼리
-- 다른 SQL문의 WHERE절에서 사용되는 쿼리
-- SELECT
-- FROM
-- WHERE 컬럼 연산자 (SELECT 컬럼 FROM WHERE)
 
-- 전체 사원의 평균급여보다 급여를 적게 받는 사원의 아이디, 이름, 급여를 조회하기
-- 1. 평균 급여를 계산한다
 
 
-- 2. 평균 급여보다 급여를 적게 받는 사원
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY < (SELECT AVG(SALARY)
                        FROM EMPLOYEES);
                        
-- Neena와 같은 해에 입사한 사원의 아이디, 이름, 입사일 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'YYYY') IN (SELECT TO_CHAR(HIRE_DATE, 'YYYY')
                                                  FROM EMPLOYEES
                                                  WHERE FIRST_NAME = 'Steven');         -- 다중행 서브쿼리일 땐 IN으로 해야 안전, 가능하면 IN으로 할 것.
 
 
-- Sundita 직원과 같은 부서에 일하고, Sundita보다 급여를 많이 받는 사원 조회하기
SELECT FIRST_NAME, SALARY, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                                   FROM EMPLOYEES
                                   WHERE FIRST_NAME = 'Sundita')
AND SALARY > (SELECT SALARY
                     FROM EMPLOYEES
                     WHERE FIRST_NAME = 'Sundita');
 
-- 급여를 가장 적게 받는 사원과 같은 해에 입사한 사원의 이름, 입사일, 급여를 조회하기
 
SELECT FIRST_NAME, HIRE_DATE, SALARY
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'YYYY'= (SELECT TO_CHAR(HIRE_DATE, 'YYYY')
                                                  FROM EMPLOYEES
                                                  WHERE SALARY = (SELECT MIN(SALARY)
                                                                          FROM EMPLOYEES) );
                                                                          
-- 오라클 에러
-- 테이블 이름이 틀린 경우: TABLE OR VIEW DOES NOT EXISTS
-- SELECT *
-- FROM EMPLOYEE;
 
-- 컬럼의 이름이 틀린 경우: INVALID IDENTIFIER. 식별자가 잘못되었다네.
-- SELECT NAMED
-- FROM EMPLOYEES;
 
-- 콤마가 누락된 경우: FROM keyword not found where expected
-- SELECT FIRST_NAME LAST_NAME SALARY -- 두 개만 쓰면 AS 별칭으로 인식해서 실행은 됨
-- FROM EMPLOYEES; 
 
-- 콤마가 너무 많은 경우: missing expression 뒤에 하나 더 와야 하는데 안 왔네요?
-- SELECT FIRST_NAME, LAST_NAME, SALARY,
-- FROM EMPLOYEES;
 
-- FROM 키워드에 오타가 있는 경우: FROM keyword not found where expected
-- SELECT FIRST_NAME, LAST_NAME, SALARY
-- FORM EMPLOYEES;
 
-- SELECT 키워드에 오타가 있는 경우: invalid SQL statement
-- SELET FIRST_NAME, LAST_NAME, SALARY
-- FROM EMPLOYEES;
 
-- WHERE 키워드에 오타가 있는 경우: SQL command not properly ended
-- SELECT FIRST_NAME, LAST_NAME, SALARY
-- FROM EMPLOYEES
-- WHER DEPARTMENT_ID = 10;
 
-- 모든 사원의 급여 최고액/최저액/평균을 조회하기
SELECT MAX(SALARY), MIN(SALARY), AVG(SALARY)
FROM EMPLOYEES;
 
-- 직종별 사원수를 조회하기(직종아이디, 사원수)
SELECT E.JOB_ID, COUNT(*)
FROM EMPLOYEES E
WHERE E.JOB_ID IS NOT NULL
GROUP BY E.JOB_ID
ORDER BY E.JOB_ID;
 
-- 직종별 사원수를 조회했을 때, 사원수가 10명이 넘어가는 직종과 사원수를 조회하기
SELECT JOB_ID, COUNT(*)
FROM EMPLOYEES 
GROUP BY JOB_ID
HAVING COUNT(*> 10;
 
-- 관리자별 사원수를 조회하기(관리자 이름, 사원수)
SELECT manager.FIRST_NAME, COUNT(*)
FROM EMPLOYEES worker, EMPLOYEES manager
WHERE worker.MANAGER_ID = manager.EMPLOYEE_ID
GROUP BY MANAGER.FIRST_name;
 
-- 입사년도별 사원수를 조회하기(연도, 사원수)
SELECT TO_CHAR(HIRE_DATE, 'YYYY'), COUNT(*)
FROM EMPLOYEES
GROUP BY TO_CHAR(HIRE_DATE, 'YYYY')
ORDER BY TO_CHAR(HIRE_DATE, 'YYYY');
 
-- 급여 등급별 사원수를 조회하기(급여등급, 사원수)
SELECT JG.GRA, COUNT(*)
FROM EMPLOYEES E, JOB_GRADES JG
WHERE E.SALARY >= JG.LOWEST_SALARY
AND E.SALARY <= JG.HIGHEST_SALARY
GROUP BY JG.GRA
ORDER BY JG.GRA;
 
-- "Hermann"가 부서담당자로 지정된 부서에 소속된 사원의 아이디와 이름, 입사일을 조회하기
SELECT 직원.EMPLOYEE_ID, 직원.FIRST_NAME, 직원.HIRE_DATE
FROM EMPLOYEES 직원, EMPLOYEES 담당자
WHERE 직원.MANAGER_ID= 담당자.EMPLOYEE_ID
AND 담당자.FIRST_NAME = 'Hermann'-- 틀렸어 ㅜㅜ
 
-- 서브 쿼리로 구하기
-- 1. 사원 번호 구하기
SELECT EMPLOYEE_ID
FROM EMPLOYEES
WHERE FIRST_NAME = 'Hermann';
 
-- 2. 1이 관리자로 있는 부서 찾기
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE MANAGER_ID = 204;
 
-- 3. 2 부서에 근무하는 사원 구하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 70;
 
-- 종합
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                                  FROM DEPARTMENTS
                                  WHERE MANAGER_ID = (SELECT EMPLOYEE_ID
                                                                 FROM EMPLOYEES
                                                                 WHERE FIRST_NAME = 'Hermann'));
 
-- 조인으로 구하기
SELECT WORKER.EMPLOYEE_ID, WORKER.FIRST_NAME, WORKER.HIRE_DATE
FROM EMPLOYEES WORKER, EMPLOYEES MANAGER, DEPARTMENTS DEPT
WHERE MANAGER.EMPLOYEE_ID = DEPT.MANAGER_ID
AND DEPT.DEPARTMENT_ID = WORKER.DEPARTMENT_ID
AND MANAGER.FIRST_NAME = 'Hermann';
 
-- 최고 급여가 $10000를 넘는 부서별 부서의 번호 및 평균 급여를 조회하기
SELECT DEPARTMENT_ID, TRUNC(AVG(SALARY))
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING MAX(SALARY) >= 10000
ORDER BY DEPARTMENT_ID;
 
-- 관리자별 번호 및 해당 관리자에 속한 사원의 최저 급여를 조회하기
SELECT MANAGER.EMPLOYEE_ID, MIN(WORKER.SALARY)
FROM EMPLOYEES WORKER, EMPLOYEES MANAGER
WHERE WORKER.MANAGER_ID = MANAGER.EMPLOYEE_ID
GROUP BY MANAGER.EMPLOYEE_ID
ORDER BY MANAGER.EMPLOYEE_ID;
 
-- 'Hermann'와 같은 급여등급에 속하는 사원들의 이름과 급여를 조회하기
 
SELECT A.FIRST_NAME, A.SALARY, B.GRA
FROM EMPLOYEES A, JOB_GRADES B
WHERE A.SALARY >= B.LOWEST_SALARY AND A.SALARY <= B.HIGHEST_SALARY
AND B.GRA = (SELECT Y.GRA
                  FROM EMPLOYEES X, JOB_GRADES Y
                  WHERE X.SALARY >= Y.LOWEST_SALARY AND X.SALARY <= Y.HIGHEST_SALARY
                  AND X.FIRST_NAME = 'Hermann');
-- 메인 쿼리와 서브 쿼리 별칭을 다르게 하라.
 
 
-- 엄청 어려운 문제. 인터넷에서 검색해보고 풀 것. 입사연도별 사원수 조회하기
-- 조회 예)
-- 2001 2002 2003 2004 2005 2006 2007 2008
-- 1     7      6      10    29    24    19   11
SELECT 
         SUM(DECODE(TO_CHAR(HIRE_DATE, 'YYYY'), '2001'10)) "2001년"
         SUM(DECODE(TO_CHAR(HIRE_DATE, 'YYYY'), '2002'10)) "2002년"
         SUM(DECODE(TO_CHAR(HIRE_DATE, 'YYYY'), '2003'10)) "2003년",
         SUM(DECODE(TO_CHAR(HIRE_DATE, 'YYYY'), '2004'10)) "2004년",
         SUM(DECODE(TO_CHAR(HIRE_DATE, 'YYYY'), '2005'10)) "2005년",
         SUM(DECODE(TO_CHAR(HIRE_DATE, 'YYYY'), '2006'10)) "2006년",
         SUM(DECODE(TO_CHAR(HIRE_DATE, 'YYYY'), '2007'10)) "2007년",
         SUM(DECODE(TO_CHAR(HIRE_DATE, 'YYYY'), '2008'10)) "2008년"
 
FROM EMPLOYEES;
cs

'Oracle Database SQL' 카테고리의 다른 글

190409  (0) 2019.06.07
190408  (0) 2019.06.07
190404  (0) 2019.06.07
190403  (0) 2019.06.07
190402  (0) 2019.06.07

+ Recent posts