-- 문자를 날짜로 변경하기
SELECT TO_DATE('2019/01/31''YYYY/MM/DD'),
          TO_DATE('2019-01-31''YYYY-MM-DD'),
          TO_DATE ('01/31/2019''MM/DD/YYYY')
FROM DUAL;
 
SELECT TRUNC(TO_DATE('2019/08/19''YYYY/MM/DD'- SYSDATE)
FROM DUAL;
 
-- 2008년 3월 1일 - 2008년 3월 15일 사이에 입사한 사원의 아이디, 이름, 입사일 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE HIRE_DATE >= TO_DATE('2008/03/01''YYYY/MM/DD')
AND HIRE_DATE <= TO_DATE('2008/03/15 23:59:59''YYYY/MM/DD HH24:MI:SS'); -- 23:59:59 안 쓰면 0:00:00시 까지라 3/15 아침 10시 입사자 데이터가 안 나옴
-- WHERE HIRE_DATE >= '2008/03/01'
-- AND HIRE_DATE < '2008/03/16';
 
-- 숫자 <-> 문자
-- 9: 소수점 이상 -> 숫자가 있으면 표현, 없으면 무시
--    소수점 이하 -> 숫자가 있으면 표현, 없으면 0을 표현
-- 0: 소수점 이상 -> 숫자가 있으면 표현, 없으면 0을 표현
--    소수점 이하 -> 숫자가 있으면 표현, 없으면 0을 표현
SELECT EMPLOYEE_ID, FIRST_NAME, TO_CHAR(SALARY, '99,999'-- 엑셀의 #과 같은 개념. 9 또는 0을 씀
        , TO_CHAR(COMMISSION_PCT, '9.99')
        , TO_CHAR(COMMISSION_PCT, '0.00')
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL;
 
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > '15000'-- 숫자로 묵시적 변환해줌 WHERE SALARY > TO_NUMBER('15,000, 99,999');
 
-- 기타 함수
-- NVL(컬럼, 값)
-- 지정된 컬럼의 값이 만약 NULL이라면 지정된 값으로 변환해서 제공
-- 지정된 컬럼의 값이 NULL이 아니면 원래 값을 제공
SELECT NVL(300), NVL(NULL,0-- 널에 대한 값 제공
FORM DUAL;
 
-- 사원의 이름, 급여, 커미션을 조회하기, 커미션이 없는 사원들은 0으로 표시하기
SELECT FIRST_NAME, SALARY, NVL(COMMISSION_PCT, 0)
FROM EMPLOYEES;
 
-- 사원의 이름, 급여, 커미션, 총급여(보너스가 포함된 급여)를 조회하기
SELECT FIRST_NAME, SALARY, COMMISSION_PCT, SALARY * (1+NVL(COMMISSION_PCT, 0)) AS 총급여
FROM EMPLOYEES;
 
-- NVL2(컬럼, 값1, 값2) 값1, 2는 같은 타입이어야 한다.
--       지정된 컬럼의 값이 만약 NULL이라면 값2 대체해서 제공한다.
--       지정된 컬럼의 값이 NULL이 아니면 값1로 대체해서 제공한다.
 
-- 사원의 이름, 급여, 커미션을 받는지 여부를 "유", "무"로 조회하기
SELECT FIRST_NAME, SALARY, NVL2(COMMISSION_PCT, '유''무') AS 유무
FROM EMPLOYEES;
 
-- CASE ~ WHEN ~ END문
-- IF ELSE IF ELSE문의 역할을 수행한다.
-- CASE
--         WHEN 비교식 THEN 값1
--         WHEN 비교식 THEN 값2
--         WHEN 비교식 THEN 값3
--         ELSE 값4
-- END      
      
-- 부서번호가 50번인 부서는 'A팀', 60, 70번인 부서는 'B팀', 80번인 부서는 'C팀'으로 조회하기
SELECT FIRST_NAME, DEPARTMENT_ID,
         CASE
            WHEN DEPARTMENT_ID = 50 THEN 'A팀'
            WHEN DEPARTMENT_ID IN (6070) THEN 'B팀'
            WHEN DEPARTMENT_ID = 80 THEN 'C팀'
            END AS TEAM
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (50607080)
ORDER BY TEAM;
 
-- 사원들의 급여 수준을 상중하로 조회하기
-- 사원 이름, 급여, 급여 수준을 조회하고, 급여 수준 순으로 정렬하기
-- 급여 수준 상:12000달러 이상, 중: 5000달러 이상, 하:5000달러 미만 
SELECT FIRST_NAME, SALARY, 
          CASE WHEN SALARY >= 12000 THEN '상'
                 WHEN SALARY >= 5000 THEN '중'
                 ELSE '하'
          END AS 급여수준
FROM EMPLOYEES;
 
-- 사원 이름, 급여, 급여 인상분을 조회하고, 급여 인상분 순으로 정렬하기
-- 인상 비율:12000달러 이상 5%, 중:5000달러 이상 10%, 하:5000달러 미만 15%
SELECT FIRST_NAME, SALARY
        , CASE WHEN SALARY >= 12000 THEN 1.05*SALARY
                 WHEN SALARY >= 5000 THEN 1.1*SALARY
                 ELSE 1.15*SALARY
        END AS 급여인상분
FROM EMPLOYEES
ORDER BY 급여인상분 DESC;
 
-- DECODE 함수
-- IF ~ ELSE IF ~ ELSE를 간편하게 구현할 수 있는 함수
-- DECODE(컬럼 혹은 표현식, 비교값1, 결과값1
--                                  비교값2, 결과값2
--                                             결과값3) <-- ELSE와 같음
SELECT FIRST_NAME, DEPARTMENT_ID,
         DECODE(DEPARTMENT_ID, 50'A팀',
                                          60'B팀',
                                          70'B팀',
                                          80'C팀') AS TEAM
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (50607080)
ORDER BY TEAM;
 
-- 테이블의 조인
-- 조회할 데이터가 2개 이상의 테이블을 사용해야지만 획득되는 경우
-- 조인 방법: FROM 절에 데이터 획득에 필요한 테이블을 나열하기만 하면 된다. 조인 조건을 제공해야 된다(N개의 테이블을 조인하면 N-1개의 조인 조건이 있어야 한다). 조인 조건은 조인된 행들 중에서 의미있게 연결된 행만 선택하게 한다.
 
-- 사원의 아이디, 사원의 이름, 부서 아이디, 부서 이름으로 조회하기
-- 단, 직종 최저 급여가 3000달러 미만인 정보만 조회하기
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_NAME
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID;
 
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.JOB_ID, A.SALARY, B.JOB_TITLE, B.MIN_SALARY, B.MAX_SALARY
FROM EMPLOYEES A, JOBS B  -- 조인
WHERE A.JOB_ID = B.JOB_ID AND B.MIN_SALARY < 3000;  -- 조인 조건
 
-- 사원의 아이디, 사원 이름, 부서 이름을 조회하기
-- 단, 100번 사원이 부서 담당자로 지정된 부서에 소속된 사원만 조회하기
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, B.DEPARTMENT_NAME
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID AND B.MANAGER_ID = 100;
 
-- 부서 아이디, 부서명, 그 부서가 위치한 지역의 도시명을 조회하기
SELECT D.DEPARTMENT_ID, D.DEPARTMENT_NAME, L.CITY
FROM DEPARTMENTS D, LOCATIONS L
WHERE D.LOCATION_ID = L.LOCATION_ID;
 
-- 부서 아이디, 부서명, 부서 담당자 아이디, 부서 담당자(사원)의 이름, 부서 담당자(사원)의 연락처를 조회하기
SELECT D.DEPARTMENT_ID, D.DEPARTMENT_NAME, D.MANAGER_ID, E.FIRST_NAME, E.PHONE_NUMBER
FROM DEPARTMENTS D, EMPLOYEES E
WHERE D.MANAGER_ID = E.EMPLOYEE_ID;
 
-- 급여를 15000달러 이상 받는 사원들의 아이디, 사원 이름, 급여, 소속 부서 아이디, 소속 부서명을 조회하기
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, E.SALARY, E.DEPARTMENT_ID, D.DEPARTMENT_NAME
FROM EMPLOYEES E, DEPARTMENTS D
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID AND E.SALARY >= 15000;
 
SELECT FIRST_NAME
FROM EMPLOYEES
WHERE SALARY >= 15000;
 
-- 직종 최저 급여가 10000달러 이상인 직종에 근무 중인 사원의 아이디, 사원의 이름, 직종 아이디, 직종 제목 조회하기
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, E.JOB_ID, J.JOB_TITLE
FROM JOBS J, EMPLOYEES E
WHERE J.JOB_ID = E.JOB_ID AND J.MIN_SALARY >= 10000;
 
-- 사원의 아이디, 사원 이름, 직종 아이디, 직종 제목, 소속 부서 아이디, 소속 부서명 조회하기
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, E.JOB_ID, J.JOB_TITLE, E.DEPARTMENT_ID, D.DEPARTMENT_NAME
FROM EMPLOYEES E, JOBS J, DEPARTMENTS D
WHERE E.JOB_ID=J.JOB_ID AND E.DEPARTMENT_ID = D.DEPARTMENT_ID;
 
-- 등가, 비등가, 셀프, 아우터 조인
 
-- 모든 사원의 이름, 부서 번호, 부서 이름을 조회하기
SELECT EMPLOYEE_ID, E.DEPARTMENT_ID, D.DEPARTMENT_NAME 
FROM EMPLOYEES E, DEPARTMENTS D
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID;
 
-- 소속 부서가 80번인 사원의 아이디, 직종 아이디, 직종 제목, 최소 급여, 최대 급여를 조회하기
SELECT E.EMPLOYEE_ID, E.JOB_ID, J.JOB_TITLE, J.MIN_SALARY, J.MAX_SALARY
FROM EMPLOYEES E, JOBS J
WHERE E.JOB_ID = J.JOB_ID AND E.DEPARTMENT_ID = 80;
 
-- 커미션을 받는 사원의 이름, 부서 이름, 도시명을 조회하기
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME, 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.COMMISSION_PCT IS NOT NULL;
 
-- Toronto에서 근무하는 사원의 이름, 부서명을 조회하기
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E, DEPARTMENTS D, LOCATIONS L
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID AND D.LOCATION_ID = L.LOCATION_ID AND L.CITY LIKE 'Toronto';
 
-- 145번 사원이 담당자로 지정된 부서에서 근무하는 
-- 사원의 이름, 부서명, 직종 제목, 최소급여, 최대급여를 조회하기
SELECT E.FIRST_NAME, DEPARTMENT_NAME, J.JOB_TITLE, J.MIN_SALARY, J.MAX_SALARY
FROM EMPLOYEES E, DEPARTMENTS D, JOBS J
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID AND J.JOB_ID = E.JOB_ID AND D.MANAGER_ID = 145;
 
-- 101번 사원의 이름, 근무했던 직종 아이디, 근무했던 부서 아이디, 근무했던 부서명을 조회하기
SELECT E.FIRST_NAME, J.JOB_ID, J.DEPARTMENT_ID, D.DEPARTMENT_NAME
FROM EMPLOYEES E, DEPARTMENTS D, JOB_HISTORY J
WHERE J.DEPARTMENT_ID = D.DEPARTMENT_ID AND E.EMPLOYEE_ID = J.EMPLOYEE_ID AND E.EMPLOYEE_ID = 101;
 
-- 부서들 중에서 소재지가 Canada인 부서의 아이디, 부서명, 도시명을 조회하기
SELECT D.DEPARTMENT_ID, D.DEPARTMENT_NAME, L.CITY
FROM DEPARTMENTS D, LOCATIONS L, COUNTRIES C
WHERE D.LOCATION_ID = L.LOCATION_ID AND L.COUNTRY_ID = C.COUNTRY_ID AND C.COUNTRY_NAME LIKE 'Canada';
 
-- 2007년에 'SA_MAN'으로 근무했던 사원의 아이디, 이름, 현재 근무 중인 직종 아이디, 급여를 조회하기
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, E.JOB_ID, E.SALARY
FROM EMPLOYEES E, JOB_HISTORY J
WHERE E.EMPLOYEE_ID = J.EMPLOYEE_ID 
AND TO_CHAR(J.START_DATE, 'YYYY'<= 2007 
AND TO_CHAR(J.END_DATE, 'YYYY'>= 2007
AND J.JOB_ID = 'SA_MAN';
 
-- 110번 부서에서 근무했던 경력이 있는 사원의 아이디, 이름, 부서명을 조회하기
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E, DEPARTMENTS D, JOB_HISTORY J
WHERE J.DEPARTMENT_ID = D.DEPARTMENT_ID AND E.EMPLOYEE_ID = J.EMPLOYEE_ID AND J.DEPARTMENT_ID = 110;
cs

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

190408  (0) 2019.06.07
190405  (0) 2019.06.07
190404  (0) 2019.06.07
190402  (0) 2019.06.07
090401  (0) 2019.06.07

+ Recent posts