본문 바로가기

디버깅/Oracle

160329

반응형


SELECT 구문



SELECT *

FROM EMPLOYEES


// SELECT *  [테이블의 모든 컬럼을 표시] FROM [테이블 명]




SELECT employee_id, first_name, last_name, hire_date

FROM employees



// employees의 employee_id, first_name, last_name, hire_date 컬럼으로 출력



WHERE 구문


--부서번호 (department_id)가 10인 사원들의 사번, 성명, 급여를 출력하시오



SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 성명, SALARY 급여

FROM EMPLOYEES

WHERE DEPARTMENT_ID = 10


//  WHERE DEPARTMENT_ID = 10을 이용해 부서번호가 10인 사원을 걸러냈다.


NULL



--부서배치를 받지 못한 사원의 사번, 이름, 급여, 부서번호를 출력하시오


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 성명, SALARY 급여, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE DEPARTMENT_ID IS NULL



// DEPARTMENT_ID가 NULL인 값을 출력한다. 즉 부서 번호가 없는 사원은

부서배치를 받지 못한 사원이다.




--수당(COMMISSION_PCT)을 받는 사원의 사번, 이름, 급여, 수당을 출력하시오.


예시)

SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, SALARY 급여, COMMISSION_PCT 수당

FROM EMPLOYEES

WHERE  COMMISSION_PCT IS NOT NULL


// is not null (수당에 null값이 아닌 사람들.. 즉 수당을 받는 사람들을 찾는 조건문)




논리연산자 (AND, OR, NOT)

논리연산자 우선순위

-> AND OR 순서로 시작한다.

AND 연산자


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, SALARY 급여

FROM EMPLOYEES

WHERE  SALARY >= 10000 AND SALARY <= 20000


// 급여가 10000이상 조건과 20000이하 조건 두가지를 동시에 만족하므로 and로 연결 시킨다.

Between 연산자(AND를 대체)

범위를 사용할 때 AND를 사용하지 않고 BETWEEN 연산을 이용해 간결하게 처리할 수 있다.



=> (위 예시를 BETWEEN 연산자로 변환)

SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, SALARY 급여

FROM EMPLOYEES

WHERE  SALARY BETWEEN 10000 AND 20000


// ~이상 ~이하 조건을 Between 연산자로 대체할 수 있다.




OR연산자


--부서번호가 10, 60, 90인 사원의 사번, 이름, 부서번호를 출력하시오.


예시)

SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE DEPARTMENT_ID = 10 OR DEPARTMENT_ID = 60 OR DEPARTMENT_ID = 90


// 부서번호가 10, 60, 90 중 하나라도 만족하면 되므로, or을 이용해 묶는다.

IN연산자


OR연산자를 대신하여 간결하게 처리할수 있다.


(위 예시를 IN연산자로 변환)


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE DEPARTMENT_ID IN (10,60,90)



--부서번호가 10, 60, 90부서를 제외해서 사원의 사번, 이름, 부서번호를 출력하시오.


예시)

SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE NOT (DEPARTMENT_ID = 10 OR DEPARTMENT_ID = 60 OR DEPARTMENT_ID = 90)



=> IN연산자로 변환

SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE NOT DEPARTMENT_ID IN (10,60,90)



SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE DEPARTMENT_ID <> 10 OR DEPARTMENT_ID <> 60 OR DEPARTMENT_ID <> 90



NOT 구문

여러개의 연산자를 NOT처리 할때 NOT으로 처리 되길 원하는 구문을 () 처리한다.



예시)

SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE NOT (DEPARTMENT_ID = 10 OR DEPARTMENT_ID = 60 OR DEPARTMENT_ID = 90)

--수당을 받지 않는 사원중 급여(SALARY)가 10,000이상인 사원의 사번, 이름, 급여, 수당을 출력하시오.


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, SALARY 급여, COMMISSION_PCT 수당

FROM EMPLOYEES

WHERE  COMMISSION_PCT IS NULL AND SALARY >= 10000


// 수당을 받지 않고, 급여가 10,000인 조건 두가지를 만족해야 하므로 and를 사용한다.


Like 연산자 p116

검색하려는 값을 정확히 알지 못할때 사용 한다.


SELECT * FROM JOBS



--업무명(job_title)이 'Manager'로 끝나는 업무의 job_id, job_title를 출력하시오.


예시)

SELECT job_id, job_title

FROM jobs

WHERE job_title like '%Manager'



정렬을 위한 order by절 P126,130



ORDER BY절은 WHERE절 다음에 위치하며.

데이터를 원하는 정렬로 나열시킨다.

오름차순은 ASC (ASCENDING)

내림차순은 DESC(DESCENDING)으로 정의하며..

ORDER BY 뒤에 차순을 생략하면 기본값으로 오름차순 정렬을 한다.

(즉 ASC는 생략이 가능하다)



--업무명(job_title)이 'Manager'로 끝나는 업무의 job_id, job_title를 출력하시오.

단, 업무명을 오름차순 정렬하시오.



SELECT job_id, job_title

FROM jobs

WHERE job_title like '%Manager'

ORDER BY job_title asc


// 우선 조건문을 완성시킨 뒤, ORDER BY 를 이용해  job_title 을 오름차순(asc) 한다.



Dual 테이블(오라클 전용)


dual은 펑션이나 계산식을 테이블 생성없이 수행해 보기 위한 용도로 사용하는 일종의 'dummy' 테이블이다. 어떤 값이 들어있는 것이 아니라  임시의 공간이라고 생각하자.

주로 MQL문이 어떤 쓰임을 하는지를 알아 볼때 사용하면 된다.







함수


  1. 숫자함수

MOD

입력받은 두값을 나눈 나머지 값을 반환합니다 (나머지값을 구하는 함수)




--사번이 홀수인 사원의 사번, 이름을 출력하시오


SELECT EMPLOYEE_ID, FIRST_NAME

FROM EMPLOYEES

WHERE MOD(EMPLOYEE_ID, 2) = 1



// 홀수라는 것은 정수를 2로 나누었을때 나머지가 1인 숫자를 말한다.


ABS

절대값을 반환하는 합수




NVL 함수

null을 다른값으로 변환하는 함수(해당 하는 컬럼에 null값이 있다면, 그값을 0으로 바꿔준다)

-> NVL(컬럼명, 변환할 값)



--90번 부서(DEPARTMENT_ID)의 사원중 실제급여를 계산하여 사번, 이름, 실급여를 출력하시오.

--실제급여 : 급여+급여*수당



SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID,

salary+salary*NVL(commission_pct, 0) 실급여

FROM EMPLOYEES

WHERE DEPARTMENT_ID = 90


// 실 급여를 계산할 때, 수당에 null 값을 포함할 경우.. 계산이 불가능하기 때문에. null값을 0으로 변환해주는 NVL을 사용한다

-> NULL값은 어떠한 데이터와 연산하여도 NULL이 된다.


FLOOR <-> CEIL

실수 데이터를 정수데이터로 변환한다.

FLOOR는 버림 하고

CEIL은 올림한다


ex)

CEIL(37.612)

-> 38

FLOOR(37.612)

-> 37




ROUND

입력받은 값을 반올림합니다.


SELECT 34.5678, ROUND(34.5678)

FROM DUAL;


-> 35



SELECT 34.5678, ROUND(34.5678, 2)

FROM DUAL;


-> 34.57


// 두번째 자리까지 표시하므로 3번째 자리에서 반올림한다.



SELECT 34.5678, ROUND(34.5678, -1)

FROM DUAL;


-> 30


// 1의 자리에서 반올림한다.





TRUNC


버림 함수


SELECT  TRUNC(34.5678, 2), TRUNC(34.5678, -1)

TRUNC(34.5678)

FROM DUAL;


-> 34.56, 30, 34



--실급여는 천단위이하 버림처리한다.

SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID,

(salary+salary*NVL(commission_pct, 0))/1000 실급여

FROM EMPLOYEES


// 천단위를 버림하는 것이 정수의 올림,버림값을 말하는것이 아니다!

(사고의 전환!)




2. 문자 처리 함수


UPPER

  • 대문자로 변환하는 함수이다.

SQL> SELECT 'Welcome to Oracle' "적용전", UPPER('Welcome to Oracle') "UPPER적용후" FROM DUAL;



LOWER

  • 소문자로 변환하는 함수이다.

  • SQL> SELECT 'Welcome to Oracle' "적용전", LOWER('Welcome to Oracle') "LOWER적용후" FROM DUAL;



INITCAP

  • 이니셜만 대문자로 변환하는 함수이다.

  • SQL> SELECT 'WELCOME TO ORACLE' "적용전", INITCAP('WELCOME TO ORACLE') "INITCAP적용후" FROM DUAL;



LENGTH

  • 문자 길이를 구하는 함수이다.

  • SQL> SELECT LENGTH('Oracle'), LENGTH('오라클') FROM DUAL;



LENGTHB

  • 바이트 수를 알려주는 함수이다.

  • SQL> SELECT LENGTHB('Oracle'), LENGTHB('오라클') FROM DUAL;

INSTR

  • 특정 문자의 위치를 구하는 함수이다.

  • 예) 'Welcome To Oracle'에서 'O'가 저장된 위치 값을 구하는 쿼리문

  • SQL> SELECT INSTR('Welcome To Oracle', 'O') FROM DUAL;

SUBSTR/SUBSTRB

  • SUBSTR : 대상 문자열이나 컬럼의 자료에서 시작 위치부터 선택 개수만큼의 문자를 추출한다.

  • 인덱스 4부터 시작해서 문자 3개를 추출하는 쿼리문(오라클에서 인덱스는 0이아닌 1부터 시작한다.)

  • SQL> SELECT SUBSTR ('Welcome to Oracle', 4, 3) FROM DUAL;


SQL> SELECT SUBSTR ('Welcome to Oracle', 4, 3) FROM DUAL;

// com을 출력한다 (4번째부터, 3개의 데이터를 출력)






3. 날짜 함수


select sysdate

from dual




--날짜 + 숫자 ==> 날짜 (1을 입력할 경우 1일이 추가됨)


select sysdate + 1, sysdate - 50

from dual


// sysdate (현재시간)에 하루를 더한값, 50일을 뺀값이 리턴된다.



--날짜 - 문자 ==> 불가


select sysdate + '16/01/01'

from dual

// 날짜 데이터는 숫자형도 문자형도 아니다. 즉 변환없이 숫자형과 문자형으로는 날짜형과 연산이 불가능하다.


--날짜 - 날짜 ==> 일수

select sysdate - hire_date

from dual


// 물론 날짜 데이터 간에는 연산이 가능하다.


months_between 연산자


--개월수

select employee_id, round(sysdate - hire_date) 근무일수,

round(months_between(sysdate, hire_date)) 근무개월수

from employees



// 일수 계산뿐 아니라, 개월수 계산 또한 가능하다.

months_between 연산자를 이용해, 특정 날짜간에 개월수를 계산이 한다. 해당값은 개월수로 리턴한다.

(sysdate의 경우 시간값을 포함하므로 trunc를 활용하여 실수에서 버림하여 정수데이터로 변환하여 사용한다)



add_months 연산자

select sysdate, add_months(sysdate, 1), add_months(sysdate, -1)

from dual


// add_months 연산자는 날짜형 데이터에 개월수를 변동시킬수 있다.


또한 예시는 윤달과 다음 달을 고려하여, 만약 1개월을 더했을 경우 해당 달이 존재하지 않는다면

마지막 일로 나타낸다. (즉 1월30일에 (add_months, 1)를 한다면, 2월28일이 출력 된다)



next_day 연산자

-- 다음 일요일이 며칠인지 출력하시오.

select next_day(sysdate, '일')

from dual


// 지정하는 날짜를 기준으로 돌아오는 가장빠른 지정한 요일의 날짜를 리턴해준다.


last_day 연산자

지정한 날짜의 달에 마지막날을 리턴한다.


--전달의 마지막일자를 출력하시오.

select last_day(add_months(sysdate,-1))

from dual



형변환 함수


to_char(p168)

-> 날짜형 데이터를 문자형 데이터로 변환하는 함수이다.

-> To_char(날짜 데이터, ‘출력 형식’



select to_char(sysdate, 'yyyy') from dual

-- 오늘 날짜의 년도(4) - 월(2) - 일(2) 요일 시(24시):분:초 형식으로 출력


select to_char(sysdate, 'yyyy-mm-dd day, hh24:mi:ss')

from dual



P170 숫자 출력형식표


to_date(p172)

-> 문자형 데이터를 날짜형 데이터로 변환한다 (숫자형에서는 불가능하다)


P167 그림 첨부



-- '2016/12/25'의 요일을 출력하시오.

select to_char(to_date('2016/12/25','yyyy-mm-dd'), 'day')

from dual


//  '2016/12/25'는 실제로는 문자 데이터이다. 그러므로 이 데이터를

날짜형 데이터로 변환한 뒤, 요일을 리턴시킨다.

--형변환 함수

to_char : 숫자 -> 문자형으로 변환 / 날짜 -> 문자형으로 변환

select employee_id,

      to_char(round(sysdate - hire_date), '99,999') 근무일수,

      to_char( months_between(sysdate, hire_date), '999,00') 근무개월수

from employees


// 근무일수를 계산하는 과정에서 데이터가 숫자형으로 리턴되고 이를 5자리까지 표시하고자 한다.





--'2016/03/28'~'2016/08/19' 일자 사이의 일수를 출력하시오 [145일]

select to_date('2016/08/19','yyyy-mm-dd') - to_date('2016/03/28', 'yyyy-mm-dd') +1

from dual


select  abs( to_date('2016/03/28', 'yyyy-mm-dd')- to_date('2016/08/19','yyyy-mm-dd') ) +1

from dual





DECODE 함수

Swich, Case함수와 같은 역할로, 표현식과 각 조건에 대한 실행값을 지정하여 사용한다.




--

SELECT salary from employees order by salary


-- 사원의 사번, 급여,

  급여가 5000미만인 경우 A

  급여가 10000미만인 경우 B

  급여가 10000이상인 경우 C

출력하시오.

단 급여가 많은 사원부터 출력하고 급여가 같은경우 이름순으로 출력한다.



select EMPLOYEE_ID, first_name, salary,

case when salary < 5000 THEN 'A'

    when salary < 10000 then 'B'

    else 'C'

end 등급

from employees order by salary desc, first_name







그룹 함수(P184)


  • SUM, AVG, COUNT, MAX, MIN, STDDECV, VARIANCE














책정리

p103,110,123,126,134,137,142,150,154,157,162,167,172,174,175,177,180

184~190







예제



select employee_id, first_name, last_name, hire_date

from employees






-부서번호 (department_id)가 10인 사원들의 사번, 성명, 급여를 출력하시오



SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 성명, SALARY 급여

FROM EMPLOYEES

WHERE DEPARTMENT_ID = 10






--NULL


--부서배치를 받지 못한 사원의 사번, 이름, 급여, 부서번호를 출력하시오



SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 성명, SALARY 급여, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE DEPARTMENT_ID IS NULL





--수당(COMMISSION_PCT)을 받는 사원의 사번, 이름, 급여, 수당을 출력하시오.



SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, SALARY 급여, COMMISSION_PCT 수당

FROM EMPLOYEES

WHERE  COMMISSION_PCT IS NOT NULL





--논리연산자 : AND / OR / NOT

--수당을 받지 않는 사원중 급여(SALARY)가 10,000이상인 사원의 사번, 이름, 급여, 수당을 출력하시오.


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, SALARY 급여, COMMISSION_PCT 수당

FROM EMPLOYEES

WHERE  COMMISSION_PCT IS NULL AND SALARY >= 10000




--급여가 10,000이상 20,000이하인 사원의 사번, 이름, 급여를 출력


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, SALARY 급여

FROM EMPLOYEES

WHERE  SALARY >= 10000 AND SALARY <= 20000


=> BETWEEN 연산자로 변환

SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, SALARY 급여

FROM EMPLOYEES

WHERE  SALARY BETWEEN 10000 AND 20000




--부서번호가 10, 60, 90인 사원의 사번, 이름, 부서번호를 출력하시오.


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE DEPARTMENT_ID = 10 OR DEPARTMENT_ID = 60 OR DEPARTMENT_ID = 90


==> IN연산자로 변환


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE DEPARTMENT_ID IN (10,60,90)




--부서번호가 10, 60, 90부서를 제외해서 사원의 사번, 이름, 부서번호를 출력하시오.


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE NOT (DEPARTMENT_ID = 10 OR DEPARTMENT_ID = 60 OR DEPARTMENT_ID = 90)



=> IN연산자로 변환

SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE NOT DEPARTMENT_ID IN (10,60,90)



SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호

FROM EMPLOYEES

WHERE DEPARTMENT_ID <> 10 OR DEPARTMENT_ID <> 60 OR DEPARTMENT_ID <> 90







--입사일자가 1995년 1월 1일 이후부터 2000년 12월 31일 까지인 사원의 사번, 입사일자를 출력하시오.


SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, HIRE_DATE 입사일자

FROM EMPLOYEES

WHERE HIRE_DATE BETWEEN '95/01/01' AND '00/12/31'





-급여가 10000이상 20000이하이며

부서가 10, 60, 90인 사원의 사번, 이름, 부서번호, 급여를 출력하시오.




SELECT EMPLOYEE_ID 사번, FIRST_NAME || ' ' || LAST_NAME 이름, DEPARTMENT_ID 부서번호, SALARY 급여

FROM EMPLOYEES

WHERE SALARY BETWEEN '10000' AND '20000' AND (DEPARTMENT_ID IN (10,60,90))








-----------------------------------------------------------------



SELECT * FROM JOBS



Like연산자


--업무명(job_title)이 'Manager'로 끝나는 업무의 job_id, job_title를 출력하시오.



SELECT job_id, job_title

FROM jobs

WHERE job_title like '%Manager'



--업무명(job_title)이 'Manager'로 끝나는 업무의 job_id, job_title를 출력하시오.

단, 업무명을 오름차순 정렬하시오.



SELECT job_id, job_title

FROM jobs

WHERE job_title like '%Manager'

ORDER BY job_title asc




=====================오후===================


--사번이 홀수인 사원의 사번, 이름을 출력하시오


SELECT EMPLOYEE_ID, FIRST_NAME

FROM EMPLOYEES

WHERE MOD(EMPLOYEE_ID, 2) = 1



--90번 부서(DEPARTMENT_ID)의 사원중 실제급여를 계산하여 사번, 이름, 실급여를 출력하시오.

--실제급여 : 급여+급여*수당



SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID,

salary+salary*NVL(commission_pct, 0) 실급여

FROM EMPLOYEES

WHERE DEPARTMENT_ID = 90



--실급여는 천단위이하 버림처리한다.

SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID,

(salary+salary*NVL(commission_pct, 0))/1000 실급여

FROM EMPLOYEES




--함수

1) 숫자함수

2) 문자함수

3) 날짜함수

select sysdate

from dual


--날짜 + 숫자 ==> 날짜 (1을 입력할 경우 1일이 추가됨)


select sysdate + 1, sysdate - 50

from dual



--날짜 - 문자 ==> 불가


select sysdate + '16/01/01'

from dual


--날짜 - 날짜 ==> 일수

select sysdate - hire_date

from dual


--개월수

select employee_id, round(sysdate - hire_date) 근무일수,

round(months_between(sysdate, hire_date)) 근무개월수

from employees


select sysdate, add_months(sysdate, 1), add_months(sysdate, -1)

from dual


// 윤달과 다음달을 고려하여, 만약 1개월을 더했을경우 해당 달이 존재하지 않는다면

마지막일로 나타낸다. (즉 1월30일에 (add_months, 1)를 한다면, 2월28일이 출력된다)



-- 다음 일요일이 며칠인지 출력하시오.

select next_day(sysdate, '일')

from dual


--전달의 마지막일자를 출력하시오.

select last_day(add_months(sysdate,-1))

from dual



--형변환 함수

to_char : 숫자 -> 문자형으로 변환 / 날짜 -> 문자형으로 변환

select employee_id,

      to_char(round(sysdate - hire_date), '99,999') 근무일수,

      to_char( months_between(sysdate, hire_date), '999,00') 근무개월수

from employees




select to_char(sysdate, 'yyyy') from dual

-- 오늘 날짜의 년도(4) - 월(2) - 일(2) 요일 시(24시):분:초 형식으로 출력


select to_char(sysdate, 'yyyy-mm-dd day, hh24:mi:ss')

from dual



-- '2016/12/25'의 요일을 출력하시오.

select to_char(to_date('2016/12/25','yyyy-mm-dd'), 'day')

from dual



--'2016/03/28'~'2016/08/19' 일자 사이의 일수를 출력하시오 [145일]

select to_date('2016/08/19','yyyy-mm-dd') - to_date('2016/03/28', 'yyyy-mm-dd') +1

from dual


select  abs( to_date('2016/03/28', 'yyyy-mm-dd')- to_date('2016/08/19','yyyy-mm-dd') ) +1

from dual



--

SELECT salary from employees order by salary


-- 사원의 사번, 급여,

  급여가 5000미만인 경우 A

  급여가 10000미만인 경우 B

  급여가 10000이상인 경우 C

출력하시오.

단 급여가 많은 사원부터 출력하고 급여가 같은경우 이름순으로 출력한다.



select EMPLOYEE_ID, first_name, salary,

case when salary < 5000 THEN 'A'

    when salary < 10000 then 'B'

    else 'C'

end 등급

from employees order by salary desc, first_name



퀴즈


1. 급여가 10000이거나  14000인 사원들의 사번, 이름(first_name), 급여를 검색하시오.


select  employee_id 사번, first_name 이름, salary 급여

from employees

where salary in (10000,140000)




2. 급여가  10000이상이고 14000이하인 모든 사원정보를 급여가 많은 사원부터 출력하되, 급여가 같은 경우 입사일자가 빠른 사원부터 출력하시오.


select  employee_id 사번, first_name 이름, salary 급여, hire_date 입사일자

from employees

where salary between 10000 and 140000

order by salary desc, hire_date




3. first_name에 'e'를 포함하는 모든 사원을 검색하시오.


select first_name 이름

from employees

where first_name like '%e%'



4. first_name에 대소문자구별없이('e', 'E')를 포함하는 모든 사원을 검색하시오


select first_name 이름

from employees

where upper(first_name) like '%E%'




5. first_name컬럼값이 'J_ _n~~~'인 사원의 사번, 이름을 검색하시오.

예)

사번     이름

---------------------

110 John

139 John

145 John

181 Jean

189 Jennifer

200 Jennifer

---------------------



select  employee_id 사번, first_name 이름

from employees

where first_name like 'J___n%



6.수당을 받는 사원의 사번, 이름, 급여, 수당을 출력하시오


SELECT EMPLOYEE_ID 사번, FIRST_NAME 이름, SALARY 급여, COMMISSION_PCT 수당

FROM EMPLOYEES

WHERE  COMMISSION_PCT IS NOT NULL






7.급여가 10000이상인 사원의 사번, 부서번호, 이름, 급여, 수당을 출력하시오.

단, 부서번호가 30번부서이거나 90번인 사원만 검색한다.


SELECT EMPLOYEE_ID 사번,DEPARTMENT_ID 부서번호, FIRST_NAME 이름, SALARY 급여, COMMISSION_PCT 수당

FROM EMPLOYEES

WHERE  salary >=10000 and DEPARTMENT_ID in (30,90)



8.급여가 10000이상인 사원의 사번, 부서번호, 이름, 급여, 수당을 출력하시오.단, 부서번호가 30번,60번, 90번인 부서는 제외하고 사원을 검색한다.


SELECT EMPLOYEE_ID 사번,DEPARTMENT_ID 부서번호, FIRST_NAME 이름, SALARY 급여, COMMISSION_PCT 수당

FROM EMPLOYEES

WHERE  salary >=10000 and  not DEPARTMENT_ID in (30,60,90)


9.사원의 first_name의 3번째문자가 'an'인 사원들을 출력하시오.


(LIKE연산자를 이용)


select  employee_id 사번, first_name 이름

from employees

where first_name like '__an%'



(LIKE연산자를 이용안함:INSTR함수를 이용)


select  employee_id 사번, first_name 이름

from employees

where instr(first_name, 'a')= 3 and instr(first_name,'n') =4



select  employee_id 사번, first_name 이름

from employees

where instr(first_name, 'an')= 3



(SUBSTR함수이용)


select  employee_id 사번, first_name 이름

from employees

where substr(first_name, 3,2) = 'an'





10. 각 사원의 사번과 근무년수를 출력하시오. 단, 근무년수는 소숫점이하자리는 버리고

장기 근속자부터 출력하시오.


select  employee_id 사번, trunc(months_between(sysdate, hire_date)/12)

from employees

order by hire_date


select  employee_id 사번, trunc(months_between(sysdate, hire_date)/12) 근무 년수

from employees

order by 근무 년수



select  employee_id 사번, trunc(months_between(sysdate, hire_date)/12) 근무 년수

from employees

order by 2 (컬럼의 위치)







반응형

'디버깅 > Oracle' 카테고리의 다른 글

060404  (0) 2016.04.09
160401  (0) 2016.04.09
160331  (0) 2016.04.09
160330  (0) 2016.04.09
160328 데이터 베이스의 개념  (0) 2016.03.28