[문제] employees 테이블에서 employee_id, last_name과 first_name은 연결해서 표시하고
(공백으로 구분) 열 별칭은 화면예 처럼 보고서 작성해 주세요.
<화면결과>
Emp# Employee Name
---------- ------------------------------
100 King Steven
101 Kochhar Neena
102 De Haan Lex
103 Hunold Alexander
104 Ernst Bruce
...
SELECT employee_id "Emp#", last_name || ' ' || first_name "Employee Name"
FROM hr.employees;
[문제] employees 테이블에서 컬럼중에 last_name, job_id를 연결해서 표시하고
(쉼표와 공백으로 구분) 열 별칭은 화면예 처럼 보고서 작성하세요.
<화면결과>
Employee and Title
-------------------------
Abel, SA_REP
Ande, SA_REP
...
SELECT last_name || ', ' || job_id "Employee and Title"
FROM hr.employees;
[문제] departments 테이블에 있는 데이터에서 department_name , manager_id 칼럼을 가지고
화면 결과처럼 출력하는 쿼리 문장을 만드세요.
<화면결과>
Department and Manager
--------------------------------------------------
Administration Department's Manager Id: 200
Marketing Department's Manager Id: 201
...
SELECT department_name || ' Department''s Manager ID: '|| manager_id
as "Department and Manager"
FROM hr.departments;
or
SELECT department_name || q'[ Department's Manager ID: ]'|| manager_id
as "Department and Manager"
FROM hr.departments;
q 연산자 q'[ ]'
[문제] 2006년도 입사한 사원의 employee_id, last_name, hire_date를 출력해주세요
단 last_name을 기준으로 오름차순정렬 해주세요.
SELECT employee_id, last_name, hire_date
FROM hr.employees
WHERE hire_date BETWEEN '2006/01/01' AND '2006/12/31'
ORDER BY last_name;
[문제] 80번 department_id 사원중에 commission_pct 값이 0.2 이고
job_id는 SA_MAN인 사원의 employee_id, last_name, salary를 출력해주세요.
단 last_name을 기준으로 오름차순정렬해 주세요.
SELECT employee_id, last_name, salary
FROM hr.employees
where department_id = 80
AND commission_pct = 0.2
AND job_id = 'SA_MAN'
ORDER BY last_name; -- ORDER BY 2;
[문제] salary가 5000 ~ 12000의 범위에 속하지 않는 모든 사원의 last_name 및 salary를
출력해주세요. 단 salary을 기준으로 내림차순 정렬하세요.
SELECT last_name, salary
FROM hr.employees
WHERE salary NOT BETWEEN 5000 AND 12000
ORDER BY salary desc;
[문제] employees 테이블에 last_name 컬럼의 값 중에 "J" 또는 "A" 또는 "M"으로 시작하는
사원들의 last_name, last_name의 길이를 표시하는 query(select문) 를 작성합니다.
사원들의 last_name 기준으로 내림차순 정렬해 주세요.
SELECT last_name, length(last_name)
FROM hr.employees
WHERE last_name LIKE 'J%'
OR last_name LIKE 'A%'
OR last_name LIKE 'M%'
ORDER BY last_name desc;
---------------------------------------
WHERE last_name LIKE 'J%'
= substr(last_name, 1, 1) = 'J'
= instr(last_name,'J',1,1) = 1
[문제] employees테이블에서 department_id(부서코드)가 50번 사원들 중에
last_name에 두번째 위치에 "a"글자가 있는 사원들을 조회하세요.
SELECT *
FROM hr.employees
WHERE department_id = 50
AND last_name LIKE '_a%'; -- AND substr(last_name,2,1) = 'a'
-- AND instr(last_name,'a',2,1) = 2
[문제] 주민번호 뒷6자리부분을 아래화면과 같이 출력해주세요.
주민번호_1 주민번호_2
------------------ ------------------
210101-1234567 210101-1******
SELECT '210101-1234567' 주민번호_1,
rpad(substr('210101-1234567', 1, 8), 14, '*') 주민번호_2
FROM dual;
또는
rpad(substr('210101-1234567',1,instr('210101-1234567', '-', 1, 1) +1) ), 14, '*')
RPAD : 왼쪽부터 자리수 고정 14자리, 공란 * 채우기
SUBSTR : 기준문자에서 1번째자리에서 8개 추출
INSTR : 기준문자에서 - 단어를 1번째자리에서 1번째로 위치한 자리값 찾기 = 7 + 1
■ 숫자함수 (PLSQL로 개발된 함수)
- round : 지정된 소숫점 자릿수 값을 반올림하는 함수
1 : 소수1자리 표시, 소수2자리에서 반올림
0 : 기본값, 소수1자리에서 반올림, 소수점없애기
-1 : 10단위 표시, 1단위에서 반올림
round(숫자형, 소수점자리수)
- trunc : 지정된 소숫점 자릿수값을 버리는 함수
1 : 소수1자리 표시
0 : 기본값, 소수1자리에서 버림, 소수점없애기
-1 : 10단위 표시, 1단위에서 버림
trunc(숫자형, 소수점자리수)
- ceil : 숫자값을 가장 큰 정수로 반환하는 함수
즉, 소수점이 있는 경우 무조건 올려서 다음 정수값을 반환한다.
ceil(숫자형)
- floor : 숫자값을 가장 작은 정수로 반환하는 함수
즉, 소수점이 있는 경우 무조건 값을 내려서 정수값을 반환한다.
floor(숫자형)
- mod : 어떤 값을 나눈 나머지를 반환하는 함수
mod(숫자형, 숫자형) = mod(12, 5) = 12 / 5 = 2
- power : 거듭제곱
power(숫자형, 제곱숫자) = power(2, 3) = 2 * 2 * 2 = 8
- sqrt : 루트
sqrt(숫자형) = sqrt(9) = 3
■ 날짜함수
- sysdate : 현재 서버의 날짜를 리턴하는 함수
- systimestamp : 현재 서버의 날짜, 시간, 타임존을 리턴하는 함수
- current_date : 현재 클라이언트의 날짜를 리턴하는 함수
- current_timestamp : 현재 클라이언트의 날짜, 시간, 타임존을 리턴하는 함수
- localtimestamp : 현재 클라이언트의 날짜, 시간을 리턴하는 함수
SELECT
sysdate, -- 23/10/10
systimestamp, -- 23/10/10 12:13:17.751000000 +09:00
current_date, -- 23/10/10
current_timestamp, -- 23/10/10 12:13:17.000000000 ASIA/SEOUL
localtimestamp -- 23/10/10 12:13:17.000000000
-- 클라이언트 접속지역에 따라 다름, 가변
FROM dual;
ALTER SESSION SET TIME_ZONE = '-08:00'; -- 타임존 변경
SELECT
sysdate, -- 23/10/10
systimestamp, -- 23/10/10 13:47:15.923000000 +09:00
current_date, -- 23/10/09
current_timestamp, -- 23/10/09 20:47:15.000000000 -08:00
localtimestamp -- 23/10/09 20:47:15.000000000
FROM dual;
ALTER SESSION SET TIME_ZONE = '+09:00'; -- 한국시간으로 복구
- 날짜계산
날짜 + 숫자(일수) | = 날짜 |
날짜 - 숫자(일수) | = 날짜 |
날짜 - 날짜 | = 숫자(일수) |
날짜 + 날짜 | = 오류 |
날짜 + 시간 | = 날짜 시간 |
날짜 - 시간 | = 날짜 시간 |
- 시/24 | |
- 분/(24*60) , 분/1440 | |
- 초/(24*60*60), 초/86400 |
SELECT
systimestamp,
systimestamp + 10/24,
to_char(systimestamp + 10/24, 'yyyy-mm-dd hh24:mi:ss'),
to_char(systimestamp + 10/(24*60), 'yyyy-mm-dd hh24:mi:ss'),
to_char(systimestamp + 10/(24*60*60), 'yyyy-mm-dd hh24:mi:ss')
FROM dual;
- months_between : 두 날짜간의 개월수를 리턴하는 함수
months_between(최근날짜,과거날짜) = 양수
months_between (과거날짜,최근날짜) = 음수
SELECT employee_id,
hire_date "입사일",
trunc(sysdate - hire_date) "근무일수",
trunc(months_between(sysdate,hire_date)) "근무달수_1",
trunc(months_between(hire_date,sysdate)) "근무달수_2",
round(months_between(sysdate,hire_date)/12) "근무년수"
FROM hr.employees;
- add_months : 개월수를 더하거나 빼는 함수
add_months(날짜,개월수)
SELECT
sysdate,
add_months(sysdate,6), -- 6개월 후
add_months(sysdate,-1) -- 1개월 전
FROM dual;
- next_day : 입력한 날짜를 기준으로 찾고자하는 요일의 첫번째 날짜를 반환하는 함수
next_day(날짜, 요일) -- 요일 : 클라이언트 지역언어 기준으로 작성
SELECT sysdate, next_day(sysdate, '토요일')
FROM dual;
- last_day : 기준날짜달의 마지막 날짜를 리턴하는 함수
last_day(날짜)
SELECT sysdate,
last_day(sysdate),
last_day(add_months(sysdate,2))
FROM dual;
[문제] 20년 이상 근무한 사원들의 사원번호(employee_id), 입사날짜(hire_date), 근무개월수를 출력.
SELECT employee_id, hire_date,
trunc(months_between(sysdate,hire_date)) "근무개월수"
FROM hr.employees
WHERE trunc(months_between(sysdate,hire_date)/12) >= 20;
[문제] 사원의 last_name, hire_date 및 근무 6개월 후 월요일에 해당하는 날짜를 출력.
SELECT last_name, hire_date,
next_day(add_months(hire_date,6),'월요일') "근무 6개월 후 월요일"
FROM hr.employees;
■ 형변환 함수
- to_char : date(날짜형)을 char(문자형)으로 변환하는 함수
to_char(날짜,'날짜모델요소')
SELECT
sysdate, -- 23/10/10 , 서버기준
- 연도
to_char(sysdate, 'yyyy yy rr rrrr year'), -- 2023 23 23 2023 twenty twenty-three
to_char(sysdate, 'yyyy') || '년', -- 2023년
to_char(sysdate, 'yyyy"년"'), -- 2023년
- ' 날짜형식 "문자" '
- 월
to_char(sysdate, 'month mon mm fmmm'), -- 10월 10월 10 10
to_char(add_months(sysdate,-1), 'month mon mm fmmm'), -- 9월 9월 09 9
- fm : 선행되는 제로를 제거하는 옵션
- 일
to_char(sysdate,'ddd dd d'), -- 283 10 3
- ddd : 1/1부터 일수
- d : 일요일 1 ~ 토요일 7
to_char(sysdate, 'day dy'), -- 화요일 화
to_char(sysdate, 'dd ddth ddsp ddthsp'), -- 10 10th ten tenth
- 주
to_char(sysdate, 'ww w'), -- 41 2
- ww : 해당 연도의 주번호
- w : 해당 월의 주번호
- 분기
to_char(sysdate, 'q"분기"'), -- 4분기
to_char(sysdate, 'am pm hh hh12 hh24') -- 오후 오후 05 05 17
- am, pm 하나만 사용
to_char(sysdate, 'yyyymmdd hh24:mi.ss.sssss'), -- 20231010 17:38.01.63481
- ss.sssss : 2자리.5자리까지
FROM dual;
[문제] 사원들의 employee_id, hire_date, 입사요일을 출력. 단, 요일을 기준으로 오름차순 정렬.
SELECT employee_id, hire_date, to_char(hire_date,'day')
FROM hr.employees
ORDER BY to_char(hire_date,'d'); -- 기본값: 1일 2월 3화 4수 5목 6금 7토
SELECT employee_id, hire_date, to_char(hire_date,'day')
FROM hr.employees
ORDER BY to_char(hire_date-1,'d'); -- 월요일부터 시작
[문제] 오늘 날짜를 '2023년 10월 10일 화요일' 출력.
SELECT to_char(sysdate,'yyyy"년" month dd"일" day')
FROM dual;
- to_char : number(숫자형)을 char(문자형)으로 변환하는 함수
to_char(숫자, '숫자모델형식')
SELECT
salary, -- 24000
to_char(salary,'$999,999'), -- $24,000
to_char(salary,'$000,999'), -- $024,000
to_char(salary,'$000,999.00'), -- $024,000.00
to_char(salary,'L000,999.00'), -- ₩024,000.00
to_char(salary,'L999g999d00') -- ₩24,000.00
FROM hr.employees;
to_char(salary,'L999g999d00') L : 언어 지역의 통화부호를 출력
g : 언어 지역의 금액 단위를 출력
d : 언어 지역의 소수점을 출력
SELECT
to_char(-1000,'999'), -- #### 오류 : 자리수 잘못지정
to_char(-1000,'9999'), -- -1000 음수 표현
to_char(-1000,'9999pr'), -- <1000> 음수일경우 <> 로 묶는다
to_char(-1000,'9999mi'), -- 1000- 음수 부호를 뒤에 표현
to_char(1000,'s9999') -- +1000 s 요소를 이용하여 부호 표현
FROM dual;
- to_number : (숫자로된)문자형을 숫자형으로 변환하는 함수
to_number(숫자로된문자, '숫자모델요소(생략가능)')
SELECT
1 + '2', -- 암시적으로 형변환이 되어 계산은 됨
1 + to_number('2')
FROM dual;
- to_date : (날짜로된)문자형을 날짜형으로 변환하는 함수
to_date(날짜로된문자, '날짜모델요소')
ALTER SESSION SET NLS_LANGUAGE = american; -- 미국형식으로 변환
ALTER SESSION SET NLS_TERRITORY = america;
SELECT * FROM nls_session_parameters;
NLS_LANGUAGE : AMERICAN
NLS_TERRITORY : AMERICA
NLS_DATE_FORMAT : DD-MON-RR
SELECT hire_date
FROM hr.employees
WHERE hire_date BETWEEN '06/01/01' AND '06/12/31'; -- 형식오류
↓
SELECT hire_date
FROM hr.employees
WHERE hire_date BETWEEN to_date('2006/01/01','yyyy/mm/dd') -- to_date 형변환 사용
AND to_date('2006/12/31','yyyy/mm/dd');
> 어디서나 사용가능하게 to_date 형변환 항상 사용하기
ALTER SESSION SET NLS_LANGUAGE = korean; -- 언어 지역(날짜형식) 수정
ALTER SESSION SET NLS_TERRITORY = korea; -- 통화 지역 수정
SELECT * FROM NLS_SESSION_PARAMETERS; -- 클라이언트 정보
NLS_LANGUAGE : KOREAN
NLS_TERRITORY : KOREA
NLS_DATE_FORMAT : RR/MM/DD
'Oracle SQL' 카테고리의 다른 글
06 SUBQUERY (0) | 2023.10.13 |
---|---|
05 JOIN (0) | 2023.10.12 |
04 Null, Case, Decode, 그룹함수, GROUP BY, HAVING (0) | 2023.10.11 |
02 DISTINCT, WHERE, BETWEEN, IN, LIKE, SORT, FUNCTION (0) | 2023.10.06 |
01 OracleXE, Select (0) | 2023.10.06 |