SELECT 컬럼, Sub Query, 함수(표준, 그룹)
FROM 테이블명, DUAL, Sun Query
WHERE 조건, JOIN, IN, ANY, ALL, NOT, BETWEEN, LIKE, IS NULL, Sub Query ...
GROUP BY 컬럼, 컬럼
HAVING 조건절
ORDER BY 컬럼 ASC, 컬럼 DESC ;
--문제4) EMPLOYEES 테이블에서 이름의 첫 글자가 ‘K’ 보다 크고 ‘Y’보다 적은
--사원의 정보를 사원번호, 이름, 업무, 급여, 부서번호를 출력하라.
--단 이름순으로 정렬하여라.
-> 이름을 글자 하나씩 추출(substr), 콤마(,)가 아닌 AND로 연결
SELECT employee_id, first_name, job_id, salary, department_id
FROM employees
WHERE substr(first_name,1,1)> 'K'
AND SUBSTR(first_name, 1, 1)<'y';
--문제6) EMPLOYEES 테이블에서 이름 중 ‘e’자의 위치를 출력하라.
SELECT first_name,
INSTR(first_name,'e',1,1),
INSTR(first_name,'e',1,2),
INSTR(first_name,'e',1,3),
INSTR(first_name,'e',1,4)
FROM employees
WHERE first_name LIKE '%e%';
--소수점/ 소수점0자리/ 소수점2자리/ 소수점 -2(+00)
SELECT ROUND(4567.678),ROUND(4567.678,0),
ROUND(4567.678,2),ROUND(4567.678,-2)
FROM dual;
--문제8) EMPLOYEES 테이블에서 부서번호가 80인 사람의 급여를 30으로 나눈
--나머지를 구하여 출력하라.
-> mod함수 사용
SELECT mod(salary,30), department_id
FROM employees
WHERE department_id = 80;
--문제9) EMPLOYEES 테이블에서 30번 부서 중 이름과 담당 업무를 연결하여
--출력하여라. 단 담당 업무를 한 줄 아래로 출력하라.
-> 개행하는 \n 을 사용 ->>> CHR(10)
SELECT first_name || CHR(10) || job_id
FROM employees
WHERE department_id = 30;
--문제10) EMPLOYEES 테이블에서 현재까지 근무일 수가 몇주 몇일 인가를 출
--력하여라. 단 근무 일수가 많은 사람 순으로 출력하여라.
->>날짜 빼기 가능, 소수점은 trunc(버림) 나 round로 정리
SELECT first_name, hire_date, TO_DATE('20/06/22') - hire_date as "총 근무 일수",
trunc((TO_DATE('20/06/22') - hire_date) / 7) as "총 근무 주일수",
mod((TO_DATE('20/06/22') - hire_date), 7) as "남은 일수"
FROM employees
ORDER BY hire_date DESC;
--DECODE(A가, B면, C, ...... ) AS명
SELECT
EMPLOYEE_ID,LAST_NAME,JOB_ID,SALARY,DECODE(JOB_ID,'IT_PROC',
SALARY*1.1,
'ST_MAN', SALARY*1.15,'SA_MAN', SALARY*1.2, SALARY) d_sal
FROM EMPLOYEES
ORDER BY SALARY DESC;
--문제2) EMPLOYEES 테이블에 등록되어 있는 인원수, 보너스가 NULL이 아닌
--인원수, 보너스의 평균, 등록되어 있는 부서의 수를 구하여 출력하라.
->> DISTINCT 로 중복제거~
SELECT COUNT(employee_id),
COUNT(*),
trunc(AVG(commission_pct*salary)), COUNT(distinct department_id)
FROM employees;
--문제9) EMPLOYEES 테이블에서 전체 월급이 10000을 초과하는 각 업무에 대
--해서 업무와 월급여 합계를 출력하라. 단 판매원은 제외하고 월 급여 합계로
--정렬(내림차순)하라.(SA_)
SELECT job_id, sum(salary)
FROM employees
WHERE job_id NOT LIKE 'SA_%'
GROUP BY job_id
HAVING SUM(salary) > 10000
ORDER BY SUM(salary) DESC;
--24) emp테이블에서 사원이름 중 A가 포함된 사원이름을 구하고 그 이름 중 앞에서 3자만 추출하여 출력
SELECT ename, Substr(ename,1,3)
FROM emp
WHERE ename LIKE '%A%';
--25) 이름의 세번째 문자가 A인 모든 사원의 이름을 표시하시오.
SELECT ename
FROM emp
WHere substr(ename,3,1)='A';
--30) 오늘부터 이번달의 마지막날까지의 남은 날 수를 구하시오.
SELECT TO_DATE('20/10/27') - sysdate
FROM dual;
SELECT TO_DATE(LAST_DAY(SYSDATE)) - sysdate
FROM dual;
--34)emp테이블에서 이름, 업무, 근무연차를 출력하시오
SELECT ename, job, round(months_between(sysdate, hiredate)/12) as 근무연차
FROM emp;
--35)emp테이블에서 사원이름, 월급, 월급과 커미션을 더한 값을 컬럼명 실급여라고 해서 출력.
--단, NULL값은 나타나지 않게 작성하시오.
->>NVL 사용 : NULL일경우 0으로 환산되어 급여에 더해짐
SELECT ename, sal, sal+ NVL(comm, 0) as 실급여
FROM emp;
--44) emp테이블에서 업무별로 사번이 제일 늦은 사람을 구하고 그 결과 내에서 사번이 79로 시작하는
-- 결과만 보여주시오.
SELECT job, MAX(empno)
FROM emp
GROUP BY job
HAVING MAX(empno) LIKE '79%';