sql

[sql] 4. 함수(FUNCTION)의 개념 및 단일함수

jeri 2024. 5. 6. 22:49
반응형

1. 함수(FUNCTION)

  • 매개변수로 값을 전달받아 가공처리하여 결과값을 반환하는 기능을 제공
  • 매개변수로 값 받기 필수!!
  • vs 자바의 메소드 : 필드가 있어 매개변수로 값 안받아도 됨

1) 단일함수

  • 매개변수로 하나의 값을 전달받아 가공처리하여 결과값을 반환하는 함수

문자함수

  • 매개변수로 문자값을 전달받아 가공처리하여 결과값을 반환하는 함수
  • (String클래스의 메소드와 유사)

숫자함수

  • 매개변수로 숫자값을 전달받아 가공처리하여 결과값을 반환하는 함수
  • 정수, 실수형 개념 없이 그냥 숫자형 하나
  • DUAL테이블 이용 (검색 테이블 없이 SELECT 명령을 작성할 경우 사용하는 가상의 테이블)
  • (Math클래스의 메소드와 유사)

날짜함수

  • 매개변수로 날짜값을 전달받아 가공처리하여 결과값을 반환하는 함수
  • DUAL테이블 이용
  • SYSDATE키워드 이용 (시스템의 현재 날짜와 시간을 제공하기 위한 키워드, 타임스탬프와 유사)
  • SYSDATE 키워드의 검색값은 기본적으로 [RR/MM/DD]형식의 패턴으로 검색되지만 내부적으로 날짜와 시간을 제공함
SELECT SYSDATE FROM DUAL;

변환함수 (강제 형변환 함수)

  • 전달값이 원하는 자료형의 값으로 변환하여 반환하는 함수 (강제 형변환 함수)
  • TO_NUMBER, TO_DATE, TO_CHAR

일반함수

  • 전달값이 특정 조건에 참인 경우에만 가공처리되어 결과값을 반환하는 함수
  • NVL(전달값, 변경값) : if문
  • NVL2(전달값, 변경값1, 변경값2) : if-else문
  • DECODE(전달값, 비교값1,변경값1,비교값2,변경값2 ...[,기본값]) : if-else-if문

2) 그룹함수

  • 매개변수로 다수의 값을 전달받아 가공처리하여 결과값을 반환하는 함수
  • 주의) 한 건의 결과만 반환

 

 

 

 

 

 

2. 문자함수

  • 매개변수로 문자값을 전달받아 가공처리하여 결과값을 반환하는 함수 (String클래스의 메소드와 유사)

1) UPPER(문자값) & LOWER(문자값)

-- UPPER(문자값) : 문자값을 전달받아 대문자로 변환하여 반환하는 함수
-- LOWER(문자값) : 문자값을 전달받아 소문자로 변환하여 반환하는 함수


--1)
SELECT ENAME, UPPER(ENAME), LOWER(ENAME) FROM EMP;


--2)
--EMP 테이블에서 사원이름이 SMITH인 사원의 사원번호, 사원이름, 급여를 검색
SELECT EMPNO, ENAME, SAL FROM EMP WHERE ENAME='SMITH';



--3)
--SQL 명령은 대소문자를 구분하지 않지만 문자값은 대소문자를 구분하여 비교
SELECT EMPNO, ENAME, SAL FROM EMP WHERE ENAME='smith'; --검색실패
--UPPER 함수 또는 LOWER 함수를 사용해 대소문자를 구분하지 않고 비교할 때 사용
SELECT EMPNO, ENAME, SAL FROM EMP WHERE UPPER(ENAME)=UPPER('SMITH');
SELECT EMPNO, ENAME, SAL FROM EMP WHERE UPPER(ENAME)=UPPER('smith');

2) INITCAP(문자값)

-- 문자값을 전달받아 첫문자만 대문자로 변환하고, 나머지는 소문자로 변환하여 반환하는 함수
SELECT ENAME, INITCAP(ENAME) FROM EMP;

3) CONCAT(문자값, 문자값) [ ||연산자 와 동일]

-- 두 개의 문자값을 전달받아 결합하여 반환하는 메소드
-- ||기호를 사용하는 것과 유사한 기능 제공
SELECT ENAME , JOB, CONCAT(ENAME,JOB), ENAME||JOB  FROM EMP;

4) SUBSTR(문자값, 시작위치, 갯수)

-- 문자값을 전달받아 시작위치(INDEX)부터 갯수만큼의 문자들을 분리하여 반환하는 함수
SELECT EMPNO, ENAME, JOB, SUBSTR(JOB,6,3) FROM EMP WHERE EMPNO=7499;

5) LENGTH(문자값)

-- 문자값을 전달받아 문자 갯수를 반환하는 함수
SELECT EMPNO, ENAME, JOB, LENGTH(JOB) FROM EMP WHERE EMPNO=7499;

6) INSTR(문자값, 검색문자값, 시작위치, 검색위치) - 검색

-- 문자값을 전달받아 검색문자값을 시작첨자부터 
-- 검색하여 원하는 위치에서 검색된 문자값의 시작첨자를 반환하는 함수
SELECT EMPNO, ENAME, JOB,  INSTR(JOB,'A',1,2) FROM EMP WHERE EMPNO=7499;
SELECT EMPNO, ENAME, JOB,  INSTR(JOB,'X',1,2) FROM EMP WHERE EMPNO=7499; -- 검색문자값이 없는 경우 0 반환

7) LPAD(문자값, 자릿수, 채울문자) & RPAD(문자값, 자릿수, 채울문자) - 추가

-- LPAD(문자값, 자릿수, 채울문자) : 문자값을 전달받아 자릿수 길이만큼 
--오른쪽부터 채우고 왼쪽 남은 자리에는 채울문자로 검색하는 함수

-- RPAD(문자값, 자릿수, 채울문자) : 문자값을 전달받아 자릿수 길이만큼 
--왼쪽부터 채우고 오른쪽 남은 자리에는 채울문자로 검색하는 함수
SELECT EMPNO, ENAME, SAL, LPAD(SAL,8,'*'), RPAD(SAL,8,'*') FROM EMP;

8) TRIM( {LEADING|TRAILING} 제거문자 FROM 문자값) - 제거

-- 문자값을 전달받아 앞{LEADING} 또는 뒤{TRAILING}에 존재하는 제거문자를 삭제하여 반환하는 함수
SELECT EMPNO, ENAME, JOB, TRIM(LEADING 'S' FROM JOB), TRIM(TRAILING 'N' FROM JOB) FROM EMP WHERE EMPNO=7499;

9) REPLACE(문자값, 검색문자값, 치환문자값) - 치환

-- 문자값을 전달받아 검색문자값을 찾아 치환문자로 변환하여 반환하는 함수
SELECT EMPNO, ENAME, JOB, REPLACE(JOB, 'MAN', 'PERSON') FROM EMP WHERE EMPNO=7499;

 

 

 

 

 

 

3. 숫자함수

  • 매개변수로 숫자값을 전달받아 가공처리하여 결과값을 반환하는 함수 (Math클래스의 메소드와 유사)
  • 정수, 실수형 개념 없이 그냥 숫자형 하나임
  • DUAL테이블 이용 (검색 테이블 없이 SELECT 명령을 작성할 경우 사용하는 가상의 테이블)

1) ROUND(숫자값,소숫점자릿수)

-- 숫자값을 전달받아 소숫점자릿수 위치만큼 검색되도록 반올림 처리하여 반환하는 함수
SELECT ROUND(45.582,2),ROUND(45.582,0),ROUND(45.582,-1) FROM DUAL;

2) TRUNC(숫자값,소숫점자릿수)

-- 숫자값을 전달받아 소숫점자릿수 위치만큼 검색되도록 절삭 처리하여 반환하는 함수
SELECT TRUNC(45.582,2),TRUNC(45.582,0),TRUNC(45.582,-1) FROM DUAL;

3) CEIL(숫자값) - 올림함수

-- 숫자값을 전달받아 소숫점 이하 값이 존재할 경우 증가된 숫자값(정수값)을 반환하는 함수
SELECT CEIL(15.3),CEIL(-15.3) FROM DUAL;

4) FLOOR(숫자값) - 내림함수

-- 숫자값을 전달받아 소숫점 이하 값이 존재할 경우 감소된 숫자값(정수값)을 반환하는 함수
SELECT FLOOR(15.3),FLOOR(-15.3) FROM DUAL;

5) MOD(숫자값1,숫자값2) - 나머지반환함수

-- 두개의 숫자값을 전달받아 숫자값1로 숫자값2를 나눈 나머지를 반환하는 함수
-- + , - , / 만 존재하고 % 연산자는 없음
-- % 연산자의 역할을 함
SELECT 20/8, MOD(20,8) FROM DUAL;

6) POWER(숫자값1,숫자값2) - 제곱근함수

-- 두개의 숫자값을 전달받아 숫자값1에 대한 숫자값2의 제곱근을 반환하는 함수
SELECT 3*3*3*3*3,POWER(3,5) FROM DUAL;

 

 

 

 

 

 

 

4. 날짜함수

  • 매개변수로 날짜값을 전달받아 가공처리하여 결과값을 반환하는 함수

1) SYSDATE 키워드 (중요)

-- 시스템의 현재 날짜와 시간을 제공하기 위한 키워드
-- 타임스탬프와 유사
-- SYSDATE 키워드의 검색값은 기본적으로 [RR/MM/DD]형식의 패턴으로 검색되지만, 
-- 내부적으로 날짜와 시간을 제공함
SELECT SYSDATE FROM DUAL;

2) ADD_MONTHS(날짜값, 숫자값)

-- 날짜값을 전달받아 숫자값만큼의 개월수를 더한 날짜값을 반환하는 함수
SELECT SYSDATE, ADD_MONTHS(SYSDATE,5) FROM DUAL;

3) 날짜값의 연산

-- 1)
-- 💚[일 증가] : 날짜값 + 숫자값 = 날짜값
SELECT SYSDATE,SYSDATE+7 FROM DUAL; --7일 후 (오늘날짜에 7일 더한 날짜가 계산되어 나옴)

-- 2)
-- 💚[일 감소] : 날짜값 - 숫자값 = 날짜값
SELECT SYSDATE,SYSDATE-7 FROM DUAL; --7일 전

-- 3)
-- 💚[시간 증가] : 날짜값 + 숫자값/24 = 날짜값
SELECT SYSDATE,SYSDATE+100/24 FROM DUAL; --100시간 후

-- 4)
-- 💚[시간 감소] : 날짜값 - 숫자값/24 = 날짜값
SELECT SYSDATE,SYSDATE-100/24 FROM DUAL; --100시간 전

-- 5)
-- 💚[일 계산] : 날짜값 - 날짜값 = 숫자값 (실수값)
SELECT EMPNO,ENAME,HIREDATE,CEIL(SYSDATE-HIREDATE)||'일' "근속일수" FROM EMP WHERE EMPNO=7499;
--오늘까지 근무일 15218.XXXX일 근무함 
SELECT EMPNO,ENAME,HIREDATE,SYSDATE-HIREDATE FROM EMP WHERE EMPNO=7499;

-- 6)
-- 💚[ERROR] 날짜값 + 날짜값 = (더할 수 없음)

1) 일 증가
2) 일 감소

 

3) 시간 증가
4) 시간 감소
5) 일 계산
5) 일 계산

 

4) NEXT_DAY(날짜값,요일)

-- 날짜값을 전달받아 미래의 특정 요일의 날짜값을 반환하는 함수
SELECT SYSDATE,NEXT_DAY(SYSDATE,'토') FROM DUAL; --다가오는 미래의 토요일 날짜를 알려주세요!

5) 사용자 환경 (세션 - SESSION) 설정값 바꾸기

-- 오라클에 접속된 현재 사용자 환경(세션 - SESSION)에 따라 사용 언어 및 날짜와 시간 패턴이 다르게 적용되어 사용
-- 세션의 사용 언어 및 날짜와 시간 패턴 변경 가능


-- 1)
--세션의 사용 언어 변경 : AMERICAN
ALTER SESSION SET NLS_LANGUAGE='AMERICAN';

SELECT SYSDATE,NEXT_DAY(SYSDATE,'토') FROM DUAL; --ERROR
SELECT SYSDATE,NEXT_DAY(SYSDATE,'SAT') FROM DUAL; --OK



-- 2)
--세션의 사용 언어 변경 : KOREAN
ALTER SESSION SET NLS_LANGUAGE='KOREAN';

SELECT SYSDATE,NEXT_DAY(SYSDATE,'토') FROM DUAL; --OK
SELECT SYSDATE,NEXT_DAY(SYSDATE,'SAT') FROM DUAL; --ERROR

6) TRUNC(날짜값, 표현단위)

-- 날짜값을 전달받아 원하는 단위만 표현하고 , 
-- 나머지는 절삭하여 초기값( 01년 01월 01일 )으로 검색하여 반환하는 함수
SELECT SYSDATE, TRUNC(SYSDATE,'MONTH'),TRUNC(SYSDATE,'YEAR') FROM DUAL;

 

 

 

 

 

 

 

 

 

 

5. 변환함수

  • 전달값이 원하는 자료형의 값으로 변환하여 반환하는 함수

1) TO_NUMBER(문자값)

  • 문자값을 전달받아 숫자값으로 변환하여 반환하는 함수
  • 주의) 전달된 문자값에 숫자가 아닌 형태의 문자가 존재할 경우 에러 발생
  • 컬럼값이 '숫자'에서 숫자형으로 자동형변환
  • 컬럼값이 숫자+'숫자'에서 숫자형으로 자동형변환
  • 즉, TO_NUMBER(문자값)을 쓰지 않아도 문자값이 숫자값으로 자동형변환 잘 됨!
  • 컬럼의 자료형이 숫자형이면 자동형변환됨
-- 1)
SELECT EMPNO,ENAME,SAL FROM EMP WHERE EMPNO=7839;

--비교 컬럼의 자료형이 '숫자형'인 경우 비교값이 
-- '문자형'이면 TO_NUMBER 함수를 사용하여 숫자형으로 변환하여 비교
SELECT EMPNO,ENAME,SAL FROM EMP WHERE EMPNO=TO_NUMBER('7839'); -- 강제형변환

--비교 컬럼의 자료형이 '숫자형'인 경우 비교값이 '문자형'이면 자동으로 숫자형으로 변환하여 비교
SELECT EMPNO,ENAME,SAL FROM EMP WHERE EMPNO='7839'; --자동형변환
SELECT EMPNO,ENAME,SAL FROM EMP WHERE EMPNO='ABC'; --주의, 숫자가 아니기 때문에 ERROR



-- 2)
--문자값을 연산할 경우 문자값이 자동으로 숫자값으로 변환되어 연산 처리
SELECT 100+200 FROM DUAL;

--주의) [+]연산자가 [문자열결합]연산자로 사용되지 않음! 자바와 다르니 주의하자
-- 자동 형변환
SELECT '100'+'200' FROM DUAL;




-- 3)
--EMP 테이블에서 사원번호가 7839인 사원의 사원번호,사원이름,급여,세후급여(급여*0.9) 검색
SELECT EMPNO,ENAME,SAL,SAL*0.9 FROM EMP WHERE EMPNO=7839;
SELECT EMPNO,ENAME,SAL,SAL*TO_NUMBER('0.9') FROM EMP WHERE EMPNO=7839; --강제형변환해줌
SELECT EMPNO,ENAME,SAL,SAL*'0.9' FROM EMP WHERE EMPNO=7839; --자동형변환 되어 연산됨

1)
2)
3)

2) TO_DATE(문자값[,패턴문자])

  • 문자값을 전달받아 → 날짜값으로 변환하여 반환하는 함수
  • 주의) 전달받은 문자값이 패턴에 맞지 않는 경우 에러 발생
  • 기본패턴 : [RR/MM/DD] (오라클에서 날짜의 기본패턴은 무조건 RR/MM/DD이다)
  • 기본패턴인 경우 자동형변환 되어 검색 가능하지만,
  • 기본패턴이 아닌 경우는 TO_DATE(문자값[,패턴문자])를 사용해 반드시 강제형변환 이용하기!
--비교 컬럼의 자료형이 날짜형인 경우 비교값이 문자형이면 TO_DATE 함수를 사용하여 숫자형으로 변환하여 비교
-- 강제 형변환
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE HIREDATE=TO_DATE('82/01/23'); --강제형변환

--비교 컬럼의 자료형이 날짜형인 경우 비교값이 문자형이면 자동으로 날짜형으로 변환하여 비교
-- 자동 형변환
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE HIREDATE='82/01/23'; --자동형변환
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE HIREDATE='1982/01/23'; --자동형변환

 

주의) 패턴에 맞지 않으면 에러

--패턴에 맞지 않는 문자값을 사용할 경우 에러 발생
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE HIREDATE='01-23-1982'; --ERROR
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE HIREDATE='82/15/23'; --ERROR

 

 

오라클에서는 [YYYY-MM-DD]패턴 OK

--날짜값은 [RR/MM/DD] 패턴 대신 [YYYY-MM-DD] 패턴으로 사용 가능
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE HIREDATE='1982-01-23'; --자동형변환

 

TO_DATE함수 사용 시 원하는 패턴 작성 ex) 'MM-DD-YYYY

--TO_DATE함수 사용 시 패턴문자를 사용하여 원하는 패턴의 문자값을 전달받아 날짜값으로 변환하여 반환 가능
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE HIREDATE=TO_DATE('01-23-1982','MM-DD-YYYY'); --OK

--2000년 1월 1일에 태어난 사람이 오늘까지 살아온 날짜 검색
//'2000-01-01'가 날짜값이 아닌 문자값으로 처리되어 (날짜값 - 문자값)으로 연산 처리되기 때문에 ERROR
SELECT SYSDATE-'2000-01-01' FROM DUAL; --ERROR


SELECT SYSDATE-TO_DATE('2000-01-01') FROM DUAL; --날짜값 - 날짜값 = 숫자값(실수값)반환
SELECT CEIL(SYSDATE-TO_DATE('2000-01-01'))||'일' "현재까지 살아온 날짜"  FROM DUAL;

3) 🔥TO_CHAR({숫자값|날짜값},패턴문자)

  • 숫자값 또는 날짜값을 전달받아 원하는 패턴의 문자값으로 변환하여 반환하는 함수

날짜패턴문자

: (자바의 SimpleDateFormat 클래스와 유사)

-- RR(년) , YYYY(년)
-- MM(월)
-- DD(일)
-- HH24(시간) , HH12(시간)
-- MI(분)
-- SS(초)

SELECT SYSDATE,
TO_CHAR(SYSDATE,'YYYY-MM-DD'),
TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')
FROM DUAL;

-- 🔥정확한 날짜비교를 위해 사용한 TO_CHAR함수
-- 월 만 비교하고 싶다?
-- 시간 만 비교하고 싶다?
-- 년도 만 비교하고 싶다?
-- 원하는 값만 패턴으로 비교해주기


--EMP테이블에서 1981년도에 입사한 사원의 사원번호, 사원이름, 입사일을 검색

--현재 접속된 사용자 환경(세션)의 날짜와 표현패턴이 [RR/MM/DD]인 경우에만 검색 가능
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE HIREDATE LIKE '81%'; --세션환경마다 검색여부가 달라짐



-- 권장!!!!!!
--TO_CHAR함수를 사용하여 세션에 상괎없이 원하는 패턴의 문자값으로 반환
SELECT EMPNO,ENAME,HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE, 'YYYY')='1981'; --세션에 상관없음

 

숫자패턴문자

: (자바의 DecimalDateFormat클래스와 유사)

-- 9(숫자 또는 공백으로 출력해주세요)
-- 0(숫자가 없으면 0으로 출력해주세요)
-- L(화폐단위)
-- $(달러)
SELECT 100000000, TO_CHAR(100000000,'9,999,999,990') FROM DUAL; --세자리마다 콤마찍어주세요 (1억)
SELECT 1000000000, TO_CHAR(1000000000,'9,999,999,990') FROM DUAL; --세자리마다 콤마찍어주세요 (10억)
-- 전달받은 숫자값의 길이가 패턴문자의 길이보다 큰 경우 모든 패턴문자가 #으로 변환하여 반환
SELECT 10000000000, TO_CHAR(10000000000,'9,999,999,990') FROM DUAL;

--EMP테이블에서 사원번호가 7844인 사원의 사원번호, 사원이름, 급여 검색

--step1. 급여 출력
SELECT EMPNO, ENAME, SAL FROM EMP WHERE EMPNO=7844;
--step2. 변환해 급여 출력
SELECT EMPNO, ENAME, TO_CHAR(SAL,'999,990') FROM EMP WHERE EMPNO=7844;
--step3. AS 이용
SELECT EMPNO, ENAME, TO_CHAR(SAL,'999,990') SAL FROM EMP WHERE EMPNO=7844;
--step4. 화폐단위로 출력
SELECT EMPNO, ENAME, TO_CHAR(SAL,'L999,990') SAL FROM EMP WHERE EMPNO=7844;
--step5. 달러단위로 출력
SELECT EMPNO, ENAME, TO_CHAR(SAL,'$99,999.00') SAL FROM EMP WHERE EMPNO=7844;

step1
step2
step3
step4
step5

 

 

 

 

 

 

 

 

 

 

6. 일반함수

  • 전달값이 특정 조건에 참인 경우에만 가공처리되어 결과값을 반환하는 함수

1) 🔥NVL(전달값, 변경값) : if문과 비슷

-- 전달값이 NULL인 경우 → 변경값으로 변환하여 반환하는 함수
-- 변경값은 전달값과 같은 자료형의 값으로만 변경 가능
-- 다른 자료형의 값으로 변경한 경우 에러 발생


--EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 연봉(급여*12)를 검색
SELECT EMPNO, ENAME, SAL*12 ANNUAL FROM EMP;

-- EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 연봉((급여+성과급)*12)를 검색
--성과급이 NULL인 경우 연산이 불가능하므로 NULL이 검색됨
SELECT EMPNO, ENAME, (SAL+COMM)*12 ANNUAL FROM EMP; --검색실패

--NVL함수를 사용하여 성과급이 NULL인 경우 0으로 변환하여 연산 처리
--COMM이 NULL이면 0으로 바꿔서 검색해주세요!
SELECT EMPNO, ENAME, (SAL+NVL(COMM,0))*12 ANNUAL FROM EMP; --검색성공

1)
검색실패
검색성공

2) NVL2(전달값, 변경값1, 변경값2) : if-else문과 비슷

-- 전달값이 NULL이 아닌 경우 → 변경값1로 변경하고,
-- 전달값이 NULL인 경우 → 변경값2로 변환하여 반환하는 함수


-- COMM이 NULL이 아니면 COMM으로 변경하고, NULL이면 0으로 변경해주세요! * 12
SELECT EMPNO, ENAME, (SAL+NVL2(COMM,COMM,0))*12 ANNUAL FROM EMP;

-- 위, 아래의 결과값은 같음

-- COMM이 NULL이 아니면 SAL+COMM으로 변경하고, NULL이면 SAL으로 변경해주세요! * 12
SELECT EMPNO, ENAME, NVL2(COMM,SAL+COMM,SAL)*12 ANNUAL FROM EMP;

3) DECODE(전달값,비교값1,변경값1,비교값2,변경값2 ...[,기본값]) : if-else-if /switch-case문과 비슷

-- 전달값을 비교값과 차례대로 비교하여 같은 경우 변경값으로 변환하여 반환하는 함수
-- 전달값 = 비교값1 -> 변경값1
-- 전달값 = 비교값2 -> 변경값2
-- ...

-- 모든 비교값이 다른 경우 기본값으로 변환하여 반환
-- 기본값 생략 가능 (기본값을 생략하면 NULL 반환)



-- 1. EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 업무, 급여, '업무별 실급여' 검색
--업무별 실급여 : 시원을 업무로 구분하여 급여를 다르게 계산하여 실제로 지불할 급여
SELECT DISTINCT JOB FROM EMP; --업무부서 확인
--업무별 실급여
--ANALYST:급여*1.1, CLERCK :급여*1.2, MANAGER:급여*1.3, PRESIDENT:급여*1.4, SALESMAN:급여*1.5
SELECT EMPNO, ENAME, SAL,
DECODE(JOB, 'ANALYST',SAL*1.1,
'CLERK',SAL*1.2,
'MANAGER',SAL*1.3,
'PRESIDENT',SAL*1.4,
'SALESMAN',SAL*1.5,SAL) "업무별 실급여"
FROM EMP;

-- 2. EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 업무, 급여 검색
SELECT EMPNO,ENAME,JOB,SAL FROM EMP;

-- 3. EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 업무별 급여 검색 단, 해당업무가 아닌 경우에는 NULL 검색
SELECT EMPNO, ENAME,
DECODE(JOB,'ANALYST',SAL) "ANALYST",
DECODE(JOB,'CLERK',SAL) "CLERK",
DECODE(JOB,'MANAGER',SAL) "MANAGER",
DECODE(JOB,'PRESIDENT',SAL) "PRESIDENT",
DECODE(JOB,'SALESMAN',SAL) "SALESMAN"
FROM EMP;

1. EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 업무, 급여, '업무별 실급여' 검색
2. EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 업무, 급여 검색
3. EMP테이블에 저장된 모든 사원의 사원번호, 사원이름, 업무별 급여 검색 단, 해당업무가 아닌 경우에는 NULL 검색

4) 연습문제

SELECT EMPNO, ENAME, HIREDATE FROM EMP;

① 사원테이블에서 입사일이 12월인 사원의 사번, 사원명, 입사일 검색하시오

SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE HIREDATE LIKE '%/12/%';
SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE HIREDATE LIKE '__/12/__';
--권장
SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE,'MM') = '12'; -- 정확한 정답!

② 다음과 같은 결과를 검색할 수 있는 SQL 문장을 작성하시오

SELECT EMPNO, ENAME, LPAD(TO_CHAR(SAL),10,'*') "급여" FROM EMP; --NUMBER가 자동형변환으로 결합되니 쉽게 아래문장으로 바꾸자
SELECT EMPNO, ENAME, LPAD(SAL,10,'*') "급여" FROM EMP;

 

③ 다음과 같은 결과를 검색할 수 있는 SQL 문장을 작성하시오

SELECT EMPNO, ENAME, TO_CHAR(HIREDATE,'YYYY-MM-DD') "입사일" FROM EMP;
반응형