-- 오라클의 논리 연산자
-- AND
-- OR
-- NOT
 
-- 80번 부서에 소속된 사원 중에서 급여를 5000달러 이상 받는 사원의 이름과 급여, 직종, 부서 아이디를 조회하기
SELECT FIRST_NAME, SALARY, JOB_ID, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
AND SALARY >= 5000;
 
-- 90번 부서에 소속된 사원 중에서 관리자 아이디가 100인 사원의 이름, 급여, 직종을 조회하기
SELECT FIRST_NAME, SALARY, JOB_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90
AND MANAGER_ID = 100;
 
-- 커미션을 받는 사원 중에서 소속 부서가 지정되지 않는 사원의 이름, 급여, 커미션을 조회하기
SELECT FIRST_NAME, SALARY, COMMISSION_PCT
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL 
AND DEPARTMENT_ID IS NULL;
 
-- 커미션이 0.3 이상이고, 직종이 SA_MAN이며, 이름이 'A'로 시작하는 사원의 이름, 커미션, 직종을 조회
SELECT FIRST_NAME, COMMISSION_PCT, JOB_ID
FROM EMPLOYEES
WHERE COMMISSION_PCT >= 0.3
AND JOB_ID = 'SA_MAN'
AND FIRST_NAME LIKE 'A%';
 
-- 소속 부서가 80번 부서이고 급여를 5000달러 초과 10000 미만 받는 사원의 이름, 급여 조회하기
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
AND SALARY BETWEEN 5000 AND 10000;
 
-- 소속 부서가 60이거나 90인 사원의 이름, 소속 부서를 조회하기
SELECT FIRST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (6090);
 
-- 급여를 3000달러 이하로 받는 사원과 급여를 15000달러 이상으로 받는 사원의 이름, 급여 조회하기
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
where SALARY <=3000
OR SALARY >= 15000;
 
-- 소속 부서가 50번 부서에 소속된 사원 중에서
-- 급여를 3000달러 이하로 받거나 급여를 15000달러 이상으로 받는 사원의 이름, 급여, 부서 아이디를 조회
SELECT FIRST_NAME, SALARY, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 50 
AND (SALARY <= 3000 OR SALARY >= 15000);
 
-- 소속 부서가 50번이거나 80번인 사원의 이름, 소속 부서를 조회하기
SELECT FIRST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (5080);
 
-- 소속 부서가 50번, 80번 외의 부서에서 근무하는 사원의 이름, 소속 부서를 조회하기
SELECT FIRST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID NOT IN (5080);
 
-- 조회된 데이터의 정렬
-- ORDER BY 절을 사용하면 조회된 데이터를 정렬할 수 있다.
-- ORDER BY 절은 SELECT문의 가장 끝에 위치한다.
-- SELECT
-- FROM 
-- [WHERE]
-- [ORDER BY 기준 컬럼명 [ASC <--기본값 | DESC]];
 
-- 사원 테이블에서 아이디, 이름, 급여를 조회하고, 급여를 기준으로 내림차순 정렬하기
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY 
FROM EMPLOYEES
ORDER BY SALARY DESC;
 
-- 80번 부서에 소속된 사원들의 이름, 입사일을 조회하고, 입사일을 기준으로 오름차순 정렬하기
SELECT FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
ORDER BY HIRE_DATE ASC;
 
-- 오름차순: 날짜는 옛날 날짜부터, 문자는 알파벳, 가나다 순으로 표시, NULL값은 맨 마지막에 표시
 
-- 80번 부서에 소속된 사원 중에서 이름에 'e'를 포함하고 있고, 급여를 5000달러 미만으로 받는 사원들의
-- 아이디, 이름, 급여를 조회하고, 급여 순으로 내림차순 정렬하기
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80 AND (FIRST_NAME LIKE '%e%' OR FIRST_NAME LIKE '%E%') AND SALARY < 10000
ORDER BY SALARY DESC;
 
-- 커미션을 받는 사원의 아이디, 이름, 급여, 커미션, 보너스(급여*커미션)을 조회하고
-- 보너스 순으로 오름차순 정렬하기
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, COMMISSION_PCT, SALARY*COMMISSION_PCT AS BONUS
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL
ORDER BY 5 ASC;
 
-- 내부 연산 순서: FROM WHERE SELECT ORDER BY 순으로 하므로, WHERE은 별칭 불가, ORDER BY는 가능.
-- 두 가지 이상의 정렬 기준 적용 가능
 
-- 80번 부서 사원의 급여, 이름을 조회하기
-- 급여와 이름 순으로 오름차순 정렬하기(급여가 동일할 때는 이름 순으로 정렬하기)
SELECT SALARY, FIRST_NAME
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
ORDER BY SALARY, FIRST_NAME;
 
-- SELECT
-- FROM
-- WHERE
-- GROUP BY ~
-- HAVING ~
-- ORDER BY ~ (순서 꼭 지켜야!)
 
-- 오라클의 내장함수: 값을 입력받아서 적절한 작업을 수행하고 결과값을 반환하는 것.
--                 ㄴ구분: 단일행 함수: 단일 행에 대해서만 연산을 수행하고, 행 당 하나의 결과를 반환한다. 단일행 함수는 여러 번 중첩해서 사용할 수 있다. SELECT, WHERE, ORDER BY 절에서 사용할 수 있다.
--                                      ㄴ종류: 문자/숫자/날짜/변환 함수 - 날짜 <->문자, 숫자<->문자로 변환/기타 함수.
--                           다중행 함수(그룹 함수): 여러 행(행 그룹)을 조작해서 행 그룹 당 하나의 결과를 반환한다. 한 번만 중첩 가능. 통계치(합계, 평균, 분산, 표준편차, 최댓값, 최솟값, 개수)를 계산한다.
 
-- 문자 함수
-- 대소문자 변환 함수
-- UPPER(컬럼), LOWER(컬럼)
SELECT FIRST_NAME, UPPER(FIRST_NAME), LOWER(LAST_NAME)
FROM EMPLOYEES;
 
-- 문자열 추출
-- SUBSTR(컬럼, m [, n]): m번 째부터 n번 째까지 문자를 반환한다.
SELECT FIRST_NAME, SUBSTR(FIRST_NAME, 2)
FROM EMPLOYEES;
 
-- 지정된 문자열의 등장 위치 찾기
-- INSTR(컬럼, '문자'): 지정된 문자의 위치를 반환
SELECT INSTR('801010-1121211''-')
FROM DUAL; -- 오라클의 빌트인 테이블, 1행 1열짜리 테이블. 특별한 테이블을 대상으로 수행하는 조회 작업이 아닐 때 사용된다.
 
-- 문자 채우기
-- LPAD(컬럼, 길이, '문자'), RPAD(컬럼, 길이, '문자')
-- 컬럼의 값이 지정된 길이보다 짧으면 부족한 길이만큼 문자를 채운다.
SELECT LPAD('ABC'10'*'), RPAD('ABC'10'*')
FROM DUAL;
 
-- 문자의 길이
-- LENGTH(컬럼)
SELECT FIRST_NAME, LENGTH(FIRST_NAME)
FROM EMPLOYEES;
 
-- 이름 4글자 이하인 사원의 이름과 글자수를 조회하기
SELECT FIRST_NAME, LENGTH(FIRST_NAME)
FROM EMPLOYEES
WHERE LENGTH(FIRST_NAME) <= 4;
 
-- 이름에 'C'나 'c'가 들어 있는 사원의 이름을 조회하기
SELECT FIRST_NAME
FROM EMPLOYEES
WHERE LOWER(FIRST_NAME) LIKE '%c%';
 
-- 불필요한 공백 없애기
-- TRIM(컬럼): 불필요한 좌우 공백을 제거한다.
SELECT '            C B C              ', TRIM('             ABC        ') AS X
FROM DUAL;
 
-- 문자 바꾸기
-- REPLACE(문자, '찾을 문자', '변경할 문자')
SELECT REPLACE('자바 입문자를 위한 자바의 정석''자바''파이썬')
FROM DUAL;
 
-- 숫자 함수
-- 반올림한다
-- ROUND(숫자, 소수 자릿수) : 지정된 자리로 값을 반올림한다.
-- 버린다.
-- TRUNC(숫자, 소수 자릿수): 지정된 자리까지 남기고 값을 버린다.
-- 나머지를 반환한다.
-- MOD(숫자1, 숫자2): 숫자1을 숫자2로 나눈 나머지를 반환한다.
 
SELECT ROUND(3,2), ROUND(3,6)
FROM DUAL;
 
SELECT ROUND(3.15231), ROUND(3.15232)
FROM DUAL;
 
SELECT ROUND(10/32FROM DUAL;
 
SELECT ROUND(12340), ROUND(1234-1), ROUND(1234-2), ROUND(1234,-3FROM DUAL;
 
SELECT TRUNC(123.581), ROUND(123.581FROM DUAL;
 
SELECT FIRST_NAME, SALARY, TRUNC(SALARY, -3)
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80;
 
-- 급여 금액별 사원 수 계산하기
SELECT TRUNC(SALARY, -3), COUNT(*)
FROM EMPLOYEES
GROUP BY TRUNC(SALARY, -3)
ORDER BY 1;
 
-- 날짜 관련 함수
-- SYSDATE: 현재 날짜와 시간 정보를 반환한다. 반환값은 DATE타입의 값이다(중요!)
SELECT SYSDATE
FROM DUAL;
 
-- MONTHS_BETWEEN(날짜, 날짜): 두 날짜 사이의 개월 수 반환
-- ADD_MONTHS(날짜, 개월 수): 날짜에 개월 수를 더한 날짜를 반환
 
-- 사원 아이디, 이름, 입사일, 근무 개월 수 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE, TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)) AS MONTHS
FROM EMPLOYEES;
 
-- 200개월 이상 근무한 사원의 사원 아이디, 이름, 입사일, 근무 개월 수 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE, TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)) AS MONTHS
FROM EMPLOYEES
WHERE TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)) >= 200;
 
SELECT ADD_MONTHS(SYSDATE, 6)
FROM DUAL;
 
-- 날짜 연산
-- 날짜 + 일수: 지정된 날짜에서 더해진 숫자만큼 이후의 날짜를 반환한다.
-- 날짜 - 숫자: 지정된 날짜에서 빼진 숫자만큼 이전의 날짜를 반환한다.
-- 날짜 - 날짜: 두 날짜 사이의 일수를 반환한다.
-- 날짜 + 숫자/24: 지정된 날짜에 시간이 더해진 날짜를 반환한다.
-- !날짜 + 날짜는 없음
 
-- 최근 3일 전에 입사한 사원 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE HIRE_DATE > (SYSDATE -3);
 
-- 3일 후, 3일 전
SELECT SYSDATE + 3, SYSDATE -3
FROM DUAL;
 
-- 사원들의 이름, 입사일, 근무일수 구하기
SELECT FIRST_NAME, HIRE_DATE, TRUNC(SYSDATE - HIRE_DATE) DAYS
FROM EMPLOYEES;
 
SELECT SYSDATE, SYSDATE + 2/24
FROM DUAL;
 
-- 변환함수
SELECT TO_CHAR(SYSDATE, 'YYYY') 년, TO_CHAR(SYSDATE, 'MM') 월, TO_CHAR(SYSDATE, 'DD') 일,
          TO_CHAR(SYSDATE, 'HH24') 시, TO_CHAR(SYSDATE, 'MI') 분, TO_CHAR(SYSDATE, 'SS') 초,
          TO_CHAR(SYSDATE, 'AM') 오전오후, TO_CHAR(SYSDATE, 'DAY') 요일
FROM DUAL;
 
-- 입사연도 조회하기
SELECT FIRST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'YYYY') 입사연도
FROM EMPLOYEES;
 
-- 입사일이 오늘과 동일한 날짜에 입사한 사람의 이름, 입사일 조회하기
SELECT FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE (TO_CHAR(HIRE_DATE, 'MM-DD'= TO_CHAR(SYSDATE, 'MM-DD'));
 
-- 2008년에 입사한 사원의 아이디, 이름, 입사일 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'YYYY'= '2008';
 
-- 80번 부서에 소속된 사원들의 아이디, 이름, 입사일, 근무 개월 수, 근무 연수를 조회하기(소숫점 한 자리까지 표시하고 버린다).
SELECT EMPLOYEE_ID
        , FIRST_NAME
        , HIRE_DATE
        , TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)) AS 근무개월수
        , TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12) AS 근무연수
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80;
 
-- 급여가 12000달러를 초과하는 사원의 아이디, 이름, 급여를 조회하고, 이름순으로 오름차순 정렬하기
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > 12000
ORDER BY FIRST_NAME ASC;
 
-- 100번 사원이 관리자로 지정된 사원 중에서 급여를 15000달러 이상 지급받는 사원의 아이디, 이름, 
-- 소속 부서 아이디, 급여를 조회하고, 급여순으로 내림차순 정렬하기
SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_ID, SALARY
FROM EMPLOYEES
WHERE MANAGER_ID = 100 AND SALARY >= 15000
ORDER BY SALARY DESC;
 
-- 20번 부서와 50번 부서에 소속된 사원 중에서 급여를 5000달러 이상 지급받는 사원의 아이디, 이름,
-- 소속 부서 아이디, 급여를 조회하고, 이름순으로 오름차순 정렬하기
SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_ID, SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (2050) AND SALARY >= 5000
ORDER BY FIRST_NAME ASC;
 
-- 급여가 5000 ~ 12000 사이이고, 부서번호가 20번 또는 50인 사원의 이름과 급여를 조회하기
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > 5000 AND SALARY < 12000 AND DEPARTMENT_ID IN (2050); -- BETWEEN은 포함됨(이상 이하 개념)
 
-- 2008년 상반기에 입사한 사원의 아이디, 이름, 입사일을 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'YYYYMM') BETWEEN 200801 AND 200806;
 
-- 커미션을 받는 사원들의 사원 아이디, 이름, 급여, 커미션, 보너스를 조회하기
-- 보너스는 소숫점 한짜리까지 반올림해서 표현하고, 보너스를 기준으로 내림차순 정렬하기
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, COMMISSION_PCT AS 커미션, ROUND(COMMISSION_PCT*SALARY, 1) AS 보너스
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL
ORDER BY 보너스 DESC;
 
-- 80번부서에 근무하는 사원의 아이디, 이름, 급여, 15%인상된 급여를 조회하기
-- 인상된 급여는 소숫점 이하는 버린다.
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, TRUNC(SALARY*1.150) AS "인상 급여"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80;
 
-- 1월달, 2월달, 3월달에 입사한 사원의 아이디, 이름, 입사일을 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'MM') IN (123);
 
-- 이름이 'A', 'M', 'J'로 시작하는 사원의 이름을 알파벳순으로 정렬해서 조회하기(문자함수 사용)
SELECT FIRST_NAME
FROM EMPLOYEES
WHERE UPPER(FIRST_NAME) LIKE 'A%' 
OR UPPER(FIRST_NAME) LIKE 'M%'
OR UPPER(FIRST_NAME) LIKE 'J%'
ORDER BY FIRST_NAME ASC;
 
SELECT FIRST_NAME
FROM EMPLOYEES
WHERE SUBSTR(FIRST_NAME, 11) IN ('A''M''J');
 
-- 사원의 이름과 급여를 '*'로 나타내는 SQL을 작성하시오, '*'하나는 1000달러를 나타낸다.
-- 결과 
-- King 24000 ********************
-- Abel 6000  ******
-- 응수 45000 **********************************************************
SELECT FIRST_NAME, SALARY, RPAD('*', SALARY/1000 ,'*') AS 별
FROM EMPLOYEES;
 
SELECT FIRST_NAME, SALARY, RPAD(SALARY/1000+LENGTH(SALARY) , LENGTH(SALARY/1000+LENGTH(SALARY)) ,'*')
FROM EMPLOYEES;
 
-- 이름에 'A'나'a'와 'C'나'c'를 모두 포함하고 있는 사원의 이름을 알파벳순으로 정렬해서 조회하기 
SELECT FIRST_NAME
FROM EMPLOYEES
WHERE INSTR(LOWER(FIRST_NAME), 'a'> 0
AND INSTR(LOWER(FIRST_NAME), 'C'> 0;
 
--WHERE UPPER(FIRST_NAME) LIKE '%A%' 
-- OR UPPER(FIRST_NAME) LIKE '%C%'
-- ORDER BY FIRST_NAME ASC;
 
-- !문자도 크기 비교 가능
 
cs

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

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

+ Recent posts