Oracle_DML_FUNCTION

2024. 10. 20. 15:33oracle

함수 < FUNCTION >
    
자바로 따지면 메소드로 전달된 값들을 가지고 계산된 결과를 반환함

  • 단일행 함수: N개의 값을 읽어서 N개의 결과를 리턴 (매 행마다 함수 실행 후 결과 반환)
  • 그룹 함수: N개의 값을 읽어서 1개의 결과를 리턴 (하나의 그룹별로 함수 실행 후 결과를 반환) 

→  단일행 함수와 그룹함수는 함께 사용할 수 없음 :결과 행의 개수가 다르기 때문
---------------------------------------------------------------------------------------------------------------------------------------------------

 

[단일행함수]
    < 문자열과 관련된 함수 > 

  • LENGTH(STR): 전달된 문자열의 글자 수 반환
  • LENGTHB(STR) : 전달된 문자열의 바이트 수 반환

    STR: '문자열' / 문자열이 들어있는 컬럼


    →  결과는 NUMBER 타입으로 반환

  • 한글: 'ㄱ', 'ㅏ', '강' → 한 글자당 3Byte
  • 숫자, 영어, 특수문자 → 한글자당 1Byte

SELECT
       LENGTH('오라클!'),                 4
       LENGTHB('오라클!')               10
  FROM
       DUAL;                                 -- 가상테이블(DUMMY TABLE)

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


   [ INSTR ]
    : INSTR(STR): 문자열로부터 특정 문자의 위치값 반환


    [ 표현법 ]
    INSTR(STR, '특정 문자', 찾을 위치의 시작값, 순번)
 
    →  결과값은 NUMBER타입으로 반환
    →  찾을 위치의 시작값과 순번은 생략
    
   [ 찾을 위치의 시작값 ]

  • 1 : 앞에서부터 찾겠다. (기본값)
  • -1 : 뒤에서부터 찾겠다.


SELECT INSTR('AABAACAABBAA', 'B') 
  FROM DUAL;                 -- 찾을 위치, 순번 생략 시 기본적으로 앞에서부터 첫 번째 글자의 위치 검색               (3)
  
SELECT INSTR('AABAACAABBAA', 'B', -1)
  FROM DUAL;                 -- 해당 문자열의 뒤에서부터 첫번째 'B'가 앞에서부터 몇 번째에 존재하는지 반환       (10)

SELECT INSTR('AABAACAABBAA', 'B', 1, 3)
  FROM DUAL;                -- 해당 문자열의 앞에서부터 세번째 'B'가 앞에서부터 몇 번째에 존재하는지 반환         (10)


-- EMAIL컬럼의 값 들 중 @의 위치 찾기!
SELECT 
       INSTR(EMAIL, '@') "@의 위치"
  FROM
       EMPLOYEE;
---------------------------------------------------------------------------------------------------------------------------------------------------

  [ SUBSTR ]
     [표현법]     문자       숫자          숫자
    - SUBSTR(STR, POSITION, LENGTH): 문자열로부터 특정 문자열을 추출해서 반환
    

  • STR: '문자열' 또는 문자타입 컬럼 값
  • POSITION: 문자열 추출 시작위치값(음수도 제시가능) -> POSITION번째 문자부터 추출
  • LENGTH: 추출할 문자 개수 (생략 시 끝까지라는 의미)


SELECT
       SUBSTR('KH정보교육원', 3)                                                                                          -- 정보교육원
  FROM
       DUAL;

SELECT
       SUBSTR('KH정보교육원', 3, 2)                                                                                         -- 정보
  FROM 
       DUAL;

SELECT
       SUBSTR('KH정보교육원', -3, 2)                                                                                          -- 교육
  FROM
       DUAL;                                  -- 시작 위치가 음수일 경우 뒤에서부터 N번째 위치로부터 문자를 추출하겠다라는 의미


-- EMPLOYEE테이블로부터 사원명과 이메일 컬럼과 EMAIL컬럼의 아이디 값만 조회
SELECT
       EMP_NAME,
       EMAIL,
       SUBSTR(EMAIL, 1, INSTR(EMAIL, '@') -1) AS "ID"
  FROM
       EMPLOYEE;


-- 사원 성별 조회
SELECT EMP_NAME, SUBSTR(EMP_NO, 8, 1) FROM EMPLOYEE;

-- 여성사원들만 조회
SELECT
       EMP_NAME 
  FROM
       EMPLOYEE
 WHERE
    -- SUBSTR(EMP_NO, 8, 1) = '2' OR SUBSTR(EMP_NO, 8, 1) = '4';
       SUBSTR(EMP_NO, 8, 1) IN ('2', '4');
     


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


  [ LAPD / RPAD ]
  : 제시한 문자열에 임의의 문자를 왼쪽 또는 오른쪽에 덧붙여서 최종 N길이 만큼의 문자열을 반환

 

  [표현법]
  LPAD / RPAD(STR,   최종적으로 반환할 문자의 길이(바이트),   패딩할 문자)
   
   →  결과값은 CHARACTER타입으로 반환
   →  덧붙이고자 하는 문자는 생략 가능

SELECT
       LPAD(EMAIL, 25)
  FROM
       EMPLOYEE;                                                                            -- 덧붙이고자 하는 문자 생략 시 기본값은 공백

 

 

SELECT
       RPAD(EMAIL, 24, '#')
  FROM
       EMPLOYEE;



-- 주민번호 총 14자리, 마스킹처리 하는법
SELECT RPAD('777010-1', 14, '*')
  FROM DUAL;
  
-- 모든 직원의 사원명과 주민등록번호 뒤 6자리를 마스킹처리해서 조회하기


SELECT
       EMP_NAME,
       RPAD(SUBSTR(EMP_NO, 1, 8), 14, '*') "주민번호"
  FROM
       EMPLOYEE;


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

   [ LTRIM / RTRIM ]
    
    - LTRIM / RTRIM(STR, 제거하고자 하는 문자)
    : 문자열의 왼쪽 또는 오른쪽에서 제거하고자 하는 문자들을 찾아서 제거한 나머지 문자열을 반환

   → 결과값은 CHARACTER 타입으로 반환
   → 제거하고자하는 두번째 인자값은 생략 가능


SELECT
       LTRIM('       K   H')
  FROM
       DUAL;


SELECT
       RTRIM('123123KH123', '123')
  FROM
       DUAL;

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

   [ TRIM ]
     : 문자열의 양쪽 / 앞 / 뒤 있는 특정 문자를 제거한 나머지 문자열을 반환


   [ 표현법 ]    

  TRIM(BOTH / LEADING / TRAILING '제거시키고자 하는 문자' FROM STR)
   
    
     결과값은 CHARACTER타입으로 반환
     BOTH / LEADING / TRAILING은 생략 가능 참고로 생략 시 기본값은 BOTH


SELECT TRIM(LEADING 'Z' FROM 'ZZZKHZZZ')
  FROM DUAL; -- LEADING: 앞쪽

SELECT TRIM(TRAILING 'Z' FROM 'ZZZKEZZZ')
  FROM DUAL; -- TRAILING: 뒤쪽


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


   [ LOWER / UPPER / INITCAP ]
    

    [ 표현법 ]    

  • LOWER (STR) : 다 소문자로 변경
  • UPPER(STR)  : 다 대문자로 변경
  • INITCAP(STR)  : 각 단어마다 앞글자만 대문자로 변경


    →  결과값은 모두 CHARACTER타입으로 반환

SELECT
       LOWER('HELLO WORLD')
  FROM
       DUAL;

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

  [ CONCAT ]
   : 전달된 두개의 인자를 하나로 합친 결과를 반환

 

  [표현법]
    CONCAT(STR1, STR2)
  
  →  결과값은 CHARACTER타입으로 반환


SELECT CONCAT('안녕하세요', '반가워요')
  FROM DUAL;
  
---------------------------------------------------------------------------------------------------------------------------------------------------

   [ REPLACE ]

    : STR로부터 찾을 문자를 찾아서 바꿀 문자로 바꾼 문자열을 반환
  

   [표현법]
    REPLACE(STR, 찾을문자, 바꿀문자)
    
→  결과값은 CHARACTER타입으로 반환
  
SELECT
       REPLACE('오늘의 메뉴는 삼계탕 입니다.', '삼계탕', '돼지국밥')
 FROM
       DUAL;
      
  
---------------------------------------------------------------------------------------------------------------------------------------------------
 
    [ 숫자와 관련된 함수 ]
    
  [ ABS(NUMBER) ] : 절대값을 구해주는 함수
 
SELECT
       ABS(-10)
  FROM
       DUAL;
 
---------------------------------------------------------------------------------------------------------------------------------------------------
 [ MOD ]
    
  : MOD(NUMBER1, NUMVER2): 두 수를 나눈 나머지값을 반환

SELECT
       MOD(10, 3)
  FROM
       DUAL;
       
SELECT       
       MOD(-10, 3)
  FROM    
       DUAL;
       
SELECT       
       MOD(10.8, 3)
  FROM     
       DUAL;

---------------------------------------------------------------------------------------------------------------------------------------------------
   [ ROUND ]

     ROUND(NUMBER, 위치): 반올림 처리해주는 함수
    
    위치: 소수점 아래 N번째 위치를 지정할 수 있음
    위치는 생략 가능, 생략 시 기본값은 0

SELECT
       ROUND(123.456)
  FROM
       DUAL;
       
SELECT
       ROUND(123.456, 1)
  FROM
       DUAL;

SELECT
       ROUND(123.456, 2)
  FROM
       DUAL;
       
SELECT
       ROUND(123.456, -1)
  FROM
       DUAL;     
       
SELECT
       ROUND(123.456, -2)
  FROM
       DUAL;     
       

---------------------------------------------------------------------------------------------------------------------------------------------------
   [ CEIL ]
    
    CEIL(NUMBER) 소수점 아래의 수를 무조건 올림 처리해주는 함수

SELECT
       CEIL(123.456)
  FROM
       DUAL;
      

 

---------------------------------------------------------------------------------------------------------------------------------------------------
  [ FLOOR ]
    
   FLOOR(NUMBER)  소수점 아래의 수를 무조건 버림처리해주는 함수

SELECT
       FLOOR(123.456)
  FROM
       DUAL;

-- 각 직원별로 고용일로부터 오늘까지의 근무 일수 조회 + 사원명
SELECT
       EMP_NAME,
       CONCAT(FLOOR(SYSDATE - HIRE_DATE), '일') "근무일자"
  FROM
       EMPLOYEE;


--10년 이상 근무한 사람 조회
SELECT
       EMP_NAME,
       CONCAT(FLOOR(SYSDATE - HIRE_DATE), '일') "근무일자"
  FROM
       EMPLOYEE
 WHERE
       FLOOR(SYSDATE - HIRE_DATE) > 365 * 10;
 
---------------------------------------------------------------------------------------------------------------------------------------------------
 
    [ TRUNC ]
     - TRUNC(NUMBER, 위치): 위치 지정가능한 절삭 처리 함수
     
     위치는 생략 가능, 단 생략 시 기본값은 0
 
 
 SELECT
        TRUNC(123.456, 2)
  FROM
        DUAL;
---------------------------------------------------------------------------------------------------------------------------------------------------
 
    < 날짜 관련 함수 > 
 
    DATE타입: 년, 월, 일, 시, 분, 초를 모두 포함한 자료형
 
 
 --SYSDATE: 현재 시스템 날짜 반환

SELECT
       SYSDATE
  FROM
       DUAL;
       
 
-- MONTHS_BETWEEN(DATE1, DATE2): 두 날짜사이의 개월 수 반환(NUMBER타입으로 반환, DATE2가 더 미래일경우 음수가 나올 수 있음)
-- EMPLOYEE테이블로부터 각 사원의 사원명, 고용일로부터 근무일수와 근무개월수조회
SELECT
       EMP_NAME,
       FLOOR(SYSDATE - HIRE_DATE) || '일' AS "근무일수",
       FLOOR(MONTHS_BETWEEN(SYSDATE, HIRE_DATE)) || '개월' AS "개월수"
  FROM
       EMPLOYEE;
 
-- ADD_MONTHS(DATE,NUMBER): 특정 날짜에 해당 숫자만큼 개월 수를 더한 날짜를 반환(DATE타입으로 반환)
-- 오늘 날짜로부터 5개월 후

SELECT
       ADD_MONTHS(SYSDATE, 5)
  FROM
       DUAL;
 
-- 직원명, 입사일, 입사일로부터 3개월이 흘렀을 때 날짜 조회

SELECT
       EMP_NAME,
       HIRE_DATE,
       ADD_MONTHS(HIRE_DATE, 3)
  FROM 
       EMPLOYEE;
  
 -- NEXT_DAY(DATE, 요일): 특정 날짜에서 가장 가까운 요일을 찾아 그 날짜를 반환
SELECT
       NEXT_DAY(SYSDATE, '금요일')
  FROM
       DUAL;        
 
SELECT
       NEXT_DAY(SYSDATE, '금')
  FROM
       DUAL;         

SELECT
       NEXT_DAY(SYSDATE, 6)
  FROM
       DUAL;              

-- 1: 일요일, 2: 월요일, 3:화요일 ... 7: 토요일

/*
SELECT
       NEXT_DAY(SYSDATE, 'FRIDAY') ->불가 (한글이라서)
  FROM
       DUAL;      
*/

-- 언어변경
ALTER SESSION SET NLS_LANGUAGE = AMERICAN;
ALTER SESSION SET NLS_LANGUAGE = KOREAN;



-- LAST_DAY(DATE): 날짜를 전달받아서 해당 날짜가 있는 달의 마지막 날짜를 구해서 반환(DATE타입)
SELECT
       LAST_DAY(SYSDATE)
  FROM
       DUAL;
       
---------------------------------------------------------------------------------------------------------------------------------------------------


    [ EXTRACT ]

  년도 또는 월 또는 일 정보를 추출해서 반환 (NUMBER타입)
    
    - EXTRACT(YEAR FROM DATE): 특정 날짜로부터 년도만 추출
    - EXTRACT(MONTH FROM DATE): 특정 날짜로부터 월만 추출 
    - EXTRACT(DAY FROM DATE): 특정 날짜로부터 일만 추출



-- EMPLOYEE에서 사원명, 입사년도, 입사월, 입사일 조회
SELECT 
       EMP_NAME,
       EXTRACT(YEAR FROM HIRE_DATE) AS "입사년도",
       EXTRACT(MONTH FROM HIRE_DATE) AS "입사월",
       EXTRACT(DAY FROM HIRE_DATE) AS "입사일"
  FROM
       EMPLOYEE
 ORDER
    BY
       "입사년도", "입사월", "입사일";

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


    [ 형변환 함수 ]
    
    NUMBER / DATE → CHARACTER
    
    TO_CHAR(NUMBER/DATE, 포맷): 숫자형 또는 날짜형 데이터를 문자형 데이터타입으로 반환


SELECT
       TO_CHAR(1234, '000000')
  FROM
       DUAL; -- 1234 -> '001234': 자리수보다 큰 공간을 0으로 채움

SELECT
       TO_CHAR(1234, '99999')
  FROM
       DUAL; -- 1234 -> ' 1234': 자리수보다 큰 공간을 공백문자로 채움

SELECT
       TO_CHAR(1234, 'L0000')
  FROM
       DUAL; -- 1234: '₩1234' 현재 설정된 나라(LOCAL)의 화폐 단위

SELECT
       TO_CHAR(1234, '$99999')
  FROM
       DUAL; -- 1234: '&1234' 본인이 설정한 화폐 단위       
       
       
SELECT
       TO_CHAR(1234124124, 'l999,999,999,999')
  FROM
       DUAL;

SELECT
       EMP_NAME,
       TO_CHAR(SALARY, '999,999,999') || '원'
  FROM
       EMPLOYEE;  
       
---------------------------------------------------------------------------------------------------------------------------------------------------

-- DATE(년월일시분초) -> CHAR

SELECT 
       SYSDATE
  FROM
       DUAL;

SELECT 
       TO_CHAR(SYSDATE)
  FROM
       DUAL;     

SELECT 
       TO_CHAR(SYSDATE, 'YYYY-MM-DD')
  FROM
       DUAL;       
       
SELECT 
       TO_CHAR(SYSDATE, 'PM HH:MI:SS')
  FROM
       DUAL; -- 오후 04:26:53 : PM 오전/오후 출력하는거임
       
SELECT 
       TO_CHAR(SYSDATE, 'HH24:MI:SS')   
  FROM
       DUAL; -- 16:28:01 -> HH24는 24시간 형식
       
SELECT 
       TO_CHAR(SYSDATE, 'MON DY, YYYY')   
  FROM
       DUAL; -- 10월 DY:화, 2024    
       
       
---------------------------------------------------------------------------------------------------------------------------------------------------

-- 년도로 쓸 수 있는 포맷
SELECT
       TO_CHAR(SYSDATE, 'YYYY'),
       TO_CHAR(SYSDATE, 'RRRR'),
       TO_CHAR(SYSDATE, 'YY'),
       TO_CHAR(SYSDATE, 'RR'),
       TO_CHAR(SYSDATE, 'YEAR')
       
  FROM
       DUAL; -- YEAR는 영어로 년도 수 출력     
       
       
-- 월로 쓸 수 있는 포맷
SELECT
       TO_CHAR(SYSDATE, 'MM'),
       TO_CHAR(SYSDATE, 'MON'),
       TO_CHAR(SYSDATE, 'MONTH'),
       TO_CHAR(SYSDATE, 'RM')
       
  FROM
       DUAL; -- RM은 로마 숫자 표현 10 -> X
       
       
-- 일로 쓸 수 있는 포맷 
SELECT
       TO_CHAR(SYSDATE, 'DD'),
       TO_CHAR(SYSDATE, 'D'),     -- 일요일기준으로 몇일째인가 3 (화)
       TO_CHAR(SYSDATE, 'DDD')       
  FROM
       DUAL;
-- DD는 한달 기준으로 며칠째 (1일부터)
-- D는 일주일 기준으로 며칠때 (일요일시작)
-- DDD는 일년 기준으로 며칠째 (1월 1일부터)

-- 요일에 사용할 수 있는 포맷
SELECT
       TO_CHAR(SYSDATE, 'DAY'),
       TO_CHAR(SYSDATE, 'DY')
  FROM
       DUAL; -- DAY는 화요일 / DY는 화 '요일'뺀거  
       
       
-- EMPLOYEE 테이블에서 사원명, 입사일      
SELECT
       EMP_NAME,
       TO_CHAR(HIRE_DATE, 'YYYY"년" MM"월" DD"일" (DY)')
  FROM
       EMPLOYEE; -- 한글 데이터의 경우 쌍따옴표로 묶어주어야만 사용이 가능
       
---------------------------------------------------------------------------------------------------------------------------------------------------

    NUMBER / CHARACTER -> DATE
    
    TO_DATE(NUMBER / CHARACTER, 포맷): 숫자형 또는 문자형 데이터를 전달하면 날짜형으로 변환 (DATE타입반환)



SELECT
       TO_DATE(20241015)
  FROM
       DUAL; -- 기본 포맷인 YY/MM/DD로 변환이 된다.

SELECT
       TO_DATE('20241015')
  FROM
       DUAL; -- 기본 포맷인 YY/MM/DD로 변환이 된다.
       
SELECT
       TO_DATE(000112)
  FROM
       DUAL;  

SELECT
       TO_DATE('000112')
  FROM
       DUAL; -- 반드시 '000112' 처럼 작은 따옴표로 묶어주어야함!      
       
SELECT
       TO_DATE('240607')
  FROM
       DUAL;          
       
SELECT
       TO_DATE('980607', 'RRMMDD')
  FROM
       DUAL;          
-- 두자리년도에 대해서 RR포맷을 적용할 경우 -> 50이상이면 이전세기, 50미만이면 현재 세기 

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

    CHARACTER -> NUMBER
    
    TO_NUMBER(CHARACTER, 포맷): 문자형 데이터를 숫자형으로 변환(NUMBER타입으로 반환)


SELECT
      TO_NUMBER('01234')
  FROM
      DUAL;


SELECT
      '123' + '234'
  FROM
      DUAL; -- 자동으로 NUMBER타입으로 변환해서 산술연산까지 진행


SELECT
      '44,000' + '52,000'
  FROM
      DUAL; -- 문자(,)가 포함되어있기 때문에 자동형변환이 불가능



SELECT
      TO_NUMBER('44,000', '99,999') + TO_NUMBER('52,000', '99,999')
  FROM
      DUAL;      
      
---------------------------------------------------------------------------------------------------------------------------------------------------   

    [ NULL 처리 함수 ]
    
    NYL(컬럼명, 해당 컬럼값이 NULL일 경우 반환할 결과값)
    해당 컬럼에 값이 존재할 경우 컬럼값 그대로 반환, 해당 컬럼의 값이 NULL일 경우 두번째 인자로 전달한 값이 결과값으로 반환됨


-- EMPLOYEE 테이블로부터 사원명, 보너스

SELECT
       EMP_NAME,
       BONUS,
       NVL(BONUS, 0)
  FROM
       EMPLOYEE;

-- 보너스 포함 연봉 조회
SELECT
       EMP_NAME,
       (SALARY + SALARY * NVL(BONUS, 0)) * 12
  FROM
       EMPLOYEE;
       
--  사원명, 부서코드 조회
SELECT
       EMP_NAME,
       NVL(DEPT_CODE, '부서 없음')
  FROM
       EMPLOYEE;
       
-- NVL2(컬럼명, 결과값1, 결과값2)       -- 향상된 널처리함수!
-- 해당 컬럼에 값이 존재할 경우 결과값 1을 반환
-- 해당 컬럼에 값이 NULL일 경우 결과값 2를 반환

-- 사원명, 부서코드, 부서코드가 존재하는 경우 '부서배치완료' NULL일 경우 '부서없음'으로 조회
SELECT
       EMP_NAME,
       DEPT_CODE,
       NVL2(DEPT_CODE, '부서배치완료', '부서 없음')
  FROM
       EMPLOYEE;
       
-- NULLIF(비교대상 1, 비교대상 2)
-- 두 개의 값이 동일할 경우 NULL을 반환
-- 두 개의 값이 동일하지 않을 경우 비교대상1을 반환

SELECT
       NULLIF('1', '1')
  FROM
       DUAL;
       

SELECT
       NULLIF('1', '2')
  FROM
       DUAL;       

--------------------------------------------------------------------------------
/*
    < 선택함수 >
    
    DECODE(비교대상(컬럼명/산술연산/함수식), 조건값1, 결과값1, 조건값2, 결과값2, 조건값3, 결과값3, ...., 결과값   );
    
    - 자바에서의 Switch문과 유사
    switch(비교대상) {
    case 조건값1: 결과값1;
    case 조건값2: 결과값2;
    ...
    default: 결과값;
    }
*/

-- 사원명, 성별(남/여)
SELECT
       EMP_NAME,
       DECODE(SUBSTR(EMP_NO, 8, 1), 
       1, '남', 
       2, '여', 
       '성별 선택 안함' ) AS "성별"
       
  FROM
       EMPLOYEE;

-- 직원들의 급여를 인상시켜서 조회
-- 직급코드가 'J7'인 사원들의 급여를 10% 인상해서 조회
-- 직급코드가 'J6'인 사원들의 급여를 15% 인상해서 조회
-- 직급코드가 'J5'인 사원들의 급여를 20% 인상해서 조회
-- 그 외의 직급코드인 사원들의 급여는 5% 인상해서 조회

SELECT 
       EMP_NAME,
       SALARY,
       JOB_CODE,
       DECODE(JOB_CODE,
            'J7', (SALARY + SALARY * 0.1),
            'J6', (SALARY + SALARY * 0.15),
            'J5', (SALARY + SALARY * 0.2),
            (SALARY + SALARY * 0.05)) "인상 후 급여"
  FROM 
       EMPLOYEE;
  
--------------------------------------------------------------------------------
/*
    CASE WHEN THEN 구문
    
    - DECODE 선택함수와 비교했을 때 DECODE는 해당 조건검사 시 동등비교만을 수행
    CASE WHEN THEN구문으로 특정 조건 제시 시 내맘대로 조건식 기술 가능
    
    -> 자바에서의 IF-ELSE IF문 같은 느낌
    
    [ 표현법 ] 
    CASE
        WHEN 조건식1 THEN 1
        WHEN 조건식2 THEN 2
        ...
        ELSE 결과값
    END

*/
/* 
참고 -- DECODE
SELECT
       EMP_NAME,
       DECODE(SUBSTR(EMP_NO, 8, 1), 
       1, '남', 
       2, '여', 
       '성별 선택 안함' ) AS "성별"
       
  FROM
       EMPLOYEE;
*/

SELECT
       EMP_NAME,
       CASE
        WHEN SUBSTR(EMP_NO, 8, 1) = '1' THEN '남'
        WHEN SUBSTR(EMP_NO, 8, 1) = '2' THEN '여'
        ELSE '성별선택안함'
       END
       
  FROM
       EMPLOYEE;


--------------------------------------------------------------------------------
--------------------------------- < 그룹 함수 > ---------------------------------

-- 1. SUM(숫자타입): 해당 컬럼값들의 총 합계를 반환해주는 함수
-- 전체 사원들의 총 급여 합계
SELECT
       SALARY
  FROM
       EMPLOYEE;

SELECT
       SUM (SALARY)
  FROM
       EMPLOYEE;       
       
-- 부서코드가 'D5'인 사원들의 총 급여 합계는?

SELECT
       SUM (SALARY)
  FROM
       EMPLOYEE;
 WHERE
       DEPT_CODE = 'D5';
       
--------------------------------------------------------------------------------

-- 2. AVG(숫자타입): 해당 컬럼값들의 평균값을 구해서 반환
-- 전체 사원들의 급여
SELECT
       ROUND(AVG(SALARY))
  FROM
       EMPLOYEE;

-- 3.MIN(ANY 타입): 해당 컬럼값들 중 가장 작은 값 반환
SELECT
       MIN(SALARY) "가장 작은 급여값",
       MIN(EMP_NAME) "가장 이름이 빠른사람",
       MIN(HIRE_DATE) "가장 빠른 입사일"
  FROM
       EMPLOYEE;

-- 4. MAX(ANY 타입): 해당 컬럼값들 중 가장 큰 값 반환
SELECT
       MAX(SALARY) "가장 높은 급여",
       MAX(EMP_NAME) "가장 느린 이름",
       MIN(HIRE_DATE) "가장 늦은 입사일"
  FROM
       EMPLOYEE;
       
-- 5. COUNT(*/컬럼명/DUSTUNCT 컬럼명): 행 개수를 세서 반환
-- COUNT(*): 조회 결과에 해당하는 모든 행 개수를 다 세서 반환
-- COUNT(컬럼명): 제시한 해당 컬럼값이 NULL이 아닌 행만 개수를 세서 반환
-- COUNT(DISTINCT 컬럼명): 제시한 해당 컬럼값에 중복값이 존재할 경우 하나로만 세서 반환

-- 전체 사원수가 몇 명인지 조회
SELECT
       COUNT(*)
  FROM
       EMPLOYEE;

SELECT * FROM EMPLOYEE;

-- 사수가 존재하는 사원의 수 (NULL이 아닌 행만 세서 알려줌)
SELECT
       COUNT(MANAGER_ID)
  FROM
       EMPLOYEE;

SELECT
       COUNT(*)
  FROM
       EMPLOYEE
 WHERE
       MANAGER_ID IS NOT NULL;
       
-- 현재 사원들이 속해있는 부서 개수

SELECT COUNT(DISTINCT DEPT_CODE)
  FROM EMPLOYEE;

 




'oracle' 카테고리의 다른 글

Oracle_DDL_CREATE / ALTER / DROP  (1) 2024.10.27
Orcale_DML_INSERT / UPDATE / DELETE  (0) 2024.10.27
Orcale_DDL_CREATE / ALTER/ DROP  (5) 2024.10.23
Oracle_DML_SUB QUERY 서브쿼리  (3) 2024.10.21
Oracle_DML_SELECT문  (0) 2024.10.20