코딩하는 문과생

[SQL] 4. Additional SELECT(2) 본문

프로그래밍/SQL

[SQL] 4. Additional SELECT(2)

코딩하는 문과생 2020. 1. 21. 09:22

# 데이터 타입 변환 함수:

  • 암시적 변환
  • 명시적 변환

SQL 타입 형변환, DATE에서 NUMBER로 가기 위해서는 2번의 과정이 필요

  • TO_CHAR( input_type[, format] )
SELECT	TO_CHAR(1234, '09999')
FROM	DUAL;
//01234

//****************************************

SELECT	TO_CHAR(1234, '99,999')
FROM	DUAL;
//1,234
SELECT	EMP_NAME,
	SALARY
FROM	EMPLOYEE
WHERE	EMP_ID = 100;
//묵시적 형변환은 성능을 떨어뜨린다.
//왜냐하면 묵시적 형변환은 값이 아닌 칼럼을 변환시키기 때문에

//****************************************

SELECT	EMP_NAME,
	SALARY
FROM	EMPLOYEE
WHERE	EMP_ID = TO_CHAR(100);
//명시적으로 해주는 것이 좋다.
  • TO_DATE
SELECT	TO_CHAR( SYSDATE, 'PM HH24:MI:SS' )
FROM	DUAL;
// 오전 09:32:39

//****************************************

SELECT	TO_CHAR( SYSDATE, 'Year, Q' )
FROM	DUAL;
// Twenty Twenty, 1

//****************************************

SELECT	TO_CHAR( SYSDATE, 'MON DAY, YYYY' )
FROM	DUAL;
// 1월  화, 2020
SELECT	EMP_NAME AS 이름,
	TO_CHAR(HIRE_DATE, 'YYYY-MM-DD') AS 입사일
FROM	EMPLOYEE
WHERE	JOB_ID = 'J7';

//****************************************

SELECT	EMP_NAME AS 이름,
	TO_CHAR(HIRE_DATE, 'YYYY"년" MM"월" DD"일"') AS 입사일
FROM	EMPLOYEE
WHERE	JOB_ID = 'J7';

SELECT	EMP_NAME
FROM	EMPLOYEE
WHERE	HIRE_DATE='04/04/30';
// 강중훈
  • 복합
SELECT	TO_DATE('20100101', 'YYYYMMDD')
FROM	DUAL;
// 2010-01-01 00:00:00.0

//****************************************

SELECT	TO_CHAR(TO_DATE('20100101', 'YYYYMMDD'), 'YYYY, MON')
FROM	DUAL;
// 2010, 1월 

//****************************************

SELECT	TO_CHAR(TO_DATE('980630', 'YYMMDD'), 'YYYY.MM.DD')
FROM	DUAL;
// 2098.06.30
// 세기가 부여된다.

//****************************************

SELECT	TO_CHAR(TO_DATE('980630', 'RRMMDD'), 'YYYY.MM.DD')
FROM	DUAL;
//  1998.06.30

//****************************************

SELECT	TO_CHAR(TO_DATE('980630', 'YYMMDD'), 'RRRR.MM.DD')
FROM	DUAL;
// 2098.06.30
// 의미가 없다.
  • TO_NUMBER

오라클에서 문자열과 문자열을 더하는 부분은 '+' 가 아닌 '||'를 사용해야 한다.

SELECT	EMP_NAME, EMP_NO,
		SUBSTR(EMP_NO, 1, 6) AS 앞부분,
		SUBSTR(EMP_NO, 8) AS 뒷부분,
		TO_NUMBER( SUBSTR(EMP_NO, 1, 6) ) + TO_NUMBER( SUBSTR(EMP_NO, 8) ) AS 결과
FROM	EMPLOYEE
WHERE	EMP_ID = '101';
// 강중훈   621136-1006405  621136  1006405  1627541

 

# 기타함수:

  • NVL(expr1, expr2) : NULL을 지정한 값으로 변환하는 함수
SELECT	EMP_NAME,
		(SALARY*12) + 
		( (SALARY*12) + NVL(BONUS_PCT, 0) )
FROM	EMPLOYEE
WHERE	SALARY > 3500000;
// 한선기       216000000.2
// 강중훈       132000000
  • DECODE( expr, search1, result1 [ , searchN, resultN, ... ] [ , default ]): 

SELECT 구문으로 IF-ELSE 논리를 제한적으로 구현한 오라클 DBMS 전용함수

expr과 search를 비교하고 true면 result 부분과, else면 default부분과 매칭된다.

SELECT	EMP_NAME
	, EMP_NO
	, SALARY
	, DECODE(SUBSTR(EMP_NO, 8, 1)
	, '1', '남'
	, '2', '여'
	, '3', '남'
	, '4', '여'
	, '기타') AS 성별
FROM	EMPLOYEE
WHERE	JOB_ID = 'J7';

//성별이 여자인 사람들의 정보를 모두 출력
SELECT	*
FROM	EMPLOYEE
WHERE	SUBSTR(EMP_NO, 8, 1) IN ('2', '4');
//사수가 있으면 직원, 아니면 관리자인 경우
SELECT	EMP_ID
	, EMP_NAME
	, MGR_ID
	, DECODE(MGR_ID, NULL, '관리자', '직원') AS 직원구분
FROM	EMPLOYEE
WHERE	JOB_ID = 'J4' ;


SELECT	EMP_ID
	, EMP_NAME
	, MGR_ID
	, NVL2(MGR_ID, '직원', '관리자') AS 직원구분
FROM	EMPLOYEE
WHERE	JOB_ID = 'J4' ;
//NVL2는 삼항연산자와 비슷하다.

//직급별 인상급여를 확인하고 싶다.
//J7은 20%, J6은 15%, J5는 5% 인상, 나머지 직급은 해당 급여를 받는 직원의
//이름, 직급, 급여, 인상급여를 조회하라.
SELECT	EMP_NAME
	, JOB_ID
	, SALARY
	, DECODE(JOB_ID, 'J7', SALARY * 1.2, 'J6', SALARY * 1.1, 'J5', SALARY * 1.05, SALARY) AS 인상급여
FROM	EMPLOYEE

  • CASE expr WHEN search1 THEN result1 [WHEN..THEN..][ELSE default] END
  • CASE WHEN condition1 THEN result1 [WHEN..THEN..][ELSE default] END
SELECT	EMP_NAME
	, JOB_ID
	, SALARY
	, CASE JOB_ID	WHEN 'J7' THEN SALARY*1.2 
			WHEN 'J6' THEN SALARY*1.15 
			WHEN 'J5' THEN SALARY*1.05 
			ELSE SALARY 
    	END AS 인상급여
FROM	EMPLOYEE
//결과는 위와 동일

//*************************************

SELECT	EMP_NAME
	, JOB_ID
	, SALARY
	, CASE 	WHEN JOB_ID = 'J7' THEN SALARY*1.2 
		WHEN JOB_ID ='J6' THEN SALARY*1.15 
		WHEN JOB_ID ='J5' THEN SALARY*1.05 
		ELSE SALARY 
    	END AS 인상급여
FROM	EMPLOYEE
//결과는 위와 동일
// 직원들의 급여등급을 확인하고 싶다.
// 급여가 300 이하면 초급, 400 이하면 중급, 400 이상이면 고급으로 간주한다.
// 직원들의 이름, 급여, 급여등급을 출력하라...
SELECT	EMP_NAME
	, SALARY
	, CASE 	WHEN SALARY <= 3000000 THEN '초급'
		WHEN SALARY <= 4000000 THEN '중급'
		ELSE '고급'
	END AS 급여등급
FROM	EMPLOYEE

  • 함수의 복합
//사원 테이블에서 사원의 이름, 메일, 메일아이디를 조회하라
SELECT	EMP_NAME
	, EMAIL
	, SUBSTR(EMAIL, 1, INSTR(EMAIL, '@')-1)
FROM	EMPLOYEE

'프로그래밍 > SQL' 카테고리의 다른 글

[SQL] 6. JOIN  (0) 2020.01.21
[SQL] 5. Additional SELECT(3)  (0) 2020.01.21
[SQL] 3. Additional SELECT  (0) 2020.01.20
[SQL] 2. SQL 기초 & SELECT  (0) 2020.01.20
[SQL] 1. 환경 설정  (0) 2020.01.20