TIL/academy

국비 TIL(Today I Learned) 20220704 오라클 ORDER BY, DUAL, 사칙연산, CASE, DECODE

토희 2022. 7. 4. 17:50
728x90

ORDER BY

DUAL

오라클 에러코드!

에러나면은 해당 코드로 구글링 해보고면 됨

 

오라클 정규식!

이런게 있다, 찾아보고 공부하래

 

 

조건1이 TRUE이면 값1을 돌려준다. 조건2가 TRUE으면 값2를 돌려준다
.... 

조건들이 모두 FALSE이면 값N을 돌려준다.

CASE가 미동작시 NULL


CASE WHEN 조건1     
     THEN 값1
     WHEN 조건2
     THEN 값2
     ....
     ELSE 값N
END

 

-- 조건1이 TRUE이면 값1을 돌려준다. 조건2가 TRUE으면 값2를 돌려준다
-- ....
-- 조건들이 모두 FALSE이면 값N을 돌려준다.
CASE가 미동작시 NULL
CASE WHEN 조건1     
     THEN 값1
     WHEN 조건2
     THEN 값2
     ....
     ELSE 값N
END

 

DECODE(값, 값1, 값2, 값3, 값4... , 값N)

값이 값1과 같으면 값2를 돌려준다... 값3과 같으면 값4를 돌려준다... 일치하는것이 없으면 값N을 돌려준다(DEFAULT)

 

 

 

오늘 배운 SQL 전체!

-- ORDER BY 
-- ASC: 오름차순(기본), DESC : 내림차순
SElECT * FROM EMP ORDER BY EMPNO ASC;
SElECT * FROM EMP ORDER BY EMPNO DESC;
-- 정렬을 여러개 지정할 경우 앞에것부터 정렬한다.
-- 각 여러개 정렬의 경우 앞에 정렬이 중복된 경우 추가적인 작업만 함
SElECT * FROM EMP ORDER BY JOB ASC, EMPNO DESC;

-- 오라클에서 FROM까지가 필수항목 BUT 데이터를 가지고 오고 싶진않아
-- DUAL : 임시 VIEW, 데이터는 없음
SELECT 'HI' FROM DUAL;
SELECT 2 + 2 * 2 FROM DUAL;

-- 전체사원의 급여를 10% 인상하시오.
SELECT ENAME, SAL, SAL * 1.1 AS RSAL FROM EMP;

-- SELECT : 걸러낸 데이터 ROW 개수만큼
-- FROM : 1번 실행
-- WHERE : ROW의 개수만큼 실행
-- ORDER BY : 걸러낸 데이터 ROW 개수만큼

-- DB에서 나머지는 MOD(값1, 값2) : 값1을 값2로 나눈 나머지, %는 다른 용도가 있데
SELECT MOD(4,3) FROM DUAL;
-- ABS(값) : 값을 절대값 처리함
SELECT MOD(4,3), ABS(-7) FROM DUAL;
-- ROUND(값): 반올림
-- ROUND(값1, 값2): 값1을 소수점 값2까지 반올림
SELECT MOD(4,3), ABS(-7), ROUND(3.1415,1) FROM DUAL;
-- FLOOR(값): 버림
SELECT MOD(4,3), ABS(-7), ROUND(3.1415,1), FLOOR(3.1415) FROM DUAL;
-- TRUNC(값), TRUNC(값1, 값2) : 버림, 소수점지정 버림
SELECT MOD(4,3), ABS(-7), ROUND(3.1415,1), FLOOR(3.1415), TRUNC(3.1415, 2) FROM DUAL;
-- CEIL(값): 올림
SELECT MOD(4,3), ABS(-7), ROUND(3.1415,1), FLOOR(3.1415),TRUNC(3.1415, 2), CEIL(3.1415) FROM DUAL;

-- DBMS_형태는 오라클에서, 다른 DB는 또 다름
-- DBMS_RANDOM.VALUE(): 0이상 1미만의 무작위 숫자를 생성
-- VALUE(값1, 값2) : 값1이상 값2미만의 무작위 숫자를 생성
-- STRING(옵션, 개수) : 옵션기준으로 개수만큼 무작위 문자열 생성, 임시비번 발급하거나 할때 사용, 랜덤 뽑는건 자바보다 DB가 편함
-- 옵션: U - 대문자, L - 소문자, A - 대소문자, X - 대문자 또는 숫자, P - 출력가능한 문자(공백 포함)
SELECT DBMS_RANDOM.VALUE() FROM DUAL;
SELECT DBMS_RANDOM.VALUE(1,11),  DBMS_RANDOM.STRING('X',8) FROM DUAL;

-- LENGTH : 개수
SELECT LENGTH('HELLO WORLD!!') FROM DUAL;

-- 자바에서는 + 연결시켰는데, 오라클(다른 DB)은 에러!, 
-- SELECT 'HELLO' +  'WORLD!!' FROM DUAL;
-- CONCAT(값1, 값2) : 값1과 값2를 이어준다, 값 2개 밖에 안됨
-- 값1 || 값2 || ... : 값1과 값2를 이어준다. 계속 이어준다, 값 여러개 가능
SELECT CONCAT('HELLO',' WORLD!!'), 'HELLO'  || ' WORLD!!' FROM DUAL;
-- SUBSTR(값, 숫자) : 값에서 숫자번째부터 자른다 
-- SUBSTR(값, 숫자1, 숫자2) : 값에서 숫자1번째부터 숫자2개만큼 자름
SELECT SUBSTR('HELLO WORLD!!',3),SUBSTR('HELLO WORLD!!',3,2)  FROM DUAL;
SELECT SUBSTR('HELLO WORLD!!',8,3) FROM DUAL;
-- REPLACE(값1, 값2, 값3) : 값1에서 값2를 찾아 값2으로 변경
SELECT REPLACE('HELLO WORLD!!','L','K') FROM DUAL;
-- INSTR(값1, 값2) : 값1에서 첫번째 값2의 번호를 찾음
-- INSTR(값1, 값2, 숫자) : 값1에서 숫자번째로부터 값2의 번호를 찾음
-- INSTR(값1, 값2, 숫자1, 숫자2) : 값1에서 숫자1번째로부터 숫자 2번째 값2의 번호를 찾음
-- 찾는 값이 없을 때는 0
SELECT INSTR('HELLO WORLD!!', 'L'),INSTR('HELLO WORLD!!', 'L',4),INSTR('HELLO WORLD!!', 'L',4,2) FROM DUAL;

-- 값 IS NULL : 값이 NULL 인것
-- 값 IS NOT NULL : 값이 NULL 이 아닌것
SELECT * FROM EMP WHERE COMM IS NULL;
SELECT * FROM EMP WHERE COMM IS NOT NULL;

-- 사원들의 총 급여(급여 + 커미션)을 출력하시오.
SELECT ENAME, SAL, COMM, SAL + COMM FROM EMP;
-- NVL(값1, 값2) : 값1이 NULL이면 값2로 대체
SELECT ENAME, SAL, COMM, SAL + NVL(COMM,0) FROM EMP;

-- SYSDATE: 현재 날짜 시간
SELECT SYSDATE FROM DUAL;
-- SYSDATE - 숫자 : 해당 일자 전
SELECT SYSDATE -30 FROM DUAL;
-- TO_CHAR(값, 형식) : 값을 지정된 형식의 문자열로 변경
-- YYYY : 연도(Y개수 만큼 표시)
-- MM : 월
-- DD : 일
-- DAY : 요일
-- D : 요일(1- 일, 2- 월 ~~~~~ )
-- AM 또는 FM : 오전/ 오후
-- HH: 시(12시간 기준), 24시간 사용 시(HH24)
-- MI: 분
-- SS: 초
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD DAY D AM HH:MI:SS')FROM DUAL;
-- W : 달의 몇번째 주 
-- IW : 년의 몇변째 주(요일 계산 달력 기준 한 주)
-- WW : 년의 몇번째 주(1월 1일부터 7일씩 일자 계산)
-- Q : 분기
SELECT TO_CHAR(SYSDATE, 'W IW WW Q')FROM DUAL;

-- 9 : 숫자, 형태 변경, 숫자 사용시 #이 뜬 경우, 처리가능한 자리수를 벗어난 것
SELECT TO_CHAR(1234567, '999,999,999') FROM DUAL;
-- .9 소수점 두자리 숫자에서 반올림 처리되어 한자리까지만 보여줌
SELECT TO_CHAR(1234567.89, '999,999,999.9') FROM DUAL;
-- $ : 달러화 기호 붙이기, 원화는 해당 통화기호로 불가
-- L : 오라클 구동 서버의 지역에 따른 통화기호 제공
SELECT TO_CHAR(1234567.89, '$999,999,999.9') FROM DUAL;
SELECT TO_CHAR(1234567.89, 'L999,999,999.9') FROM DUAL;
-- TO_DATE(값) : 문자열을 날짜로 
-- TO_DATE(값, 형식) : 문자열의 내용을 지정 형식에 맞추어 날짜로 변환
SELECT TO_DATE('2022-07-04'), TO_DATE('2022-07-04', 'YYYY-MM-DD') FROM DUAL;
-- TO_NUMBER(값) : 문자열을 숫자로 변환, 근데 안 씀, 오라클은 (다른 DB도 비슷) 자동 형변환 되기때문
-- 자동 문자열화 또는 숫자화가 진행되기 때문에 크게 사용되지 않음
SELECT TO_NUMBER('1234') FROM DUAL;
-- 6월에 입사한 사원
-- TO_CHAR 문자열 반환한거를 6(숫자), 06(문자) 이랑 비교, 둘다 가능, 자동 형변화해줘서 따라서 TO_NUMBER 잘 안 씀
SELECT * FROM EMP WHERE TO_CHAR(HIREDATE, 'MM') = 6;
SELECT * FROM EMP WHERE TO_CHAR(HIREDATE, 'MM') = '06';

-- 전반기에 입사한 사원들 중 업무가 점원(CLERK)인 사원을 구하시오
SELECT * FROM EMP;
SELECT ENAME, JOB, HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE, 'MM') <= 6 AND JOB = 'CLERK';
--SELECT * FROM EMP WHERE JOB = 'CLERK'
--AND TO_CHAR(HIREDATE, 'MM') IN (1,2,3,4,5,6)
--AND TO_CHAR(HIREDATE, 'MM') BETWEEN 1 AND 6
--AND TO_CHAR(HIREDATE, 'Q') IN (1,2)
--AND TO_CHAR(HIREDATE, 'Q') <= 2
--AND TO_CHAR(HIREDATE, 'Q') BETWEEN 1 AND 2

--CASE WHEN 조건1
--     THEN 값1
--     WHEN 조건2
--     THEN 값2
--     ...
--     ELSE 값N
--END
--조건1이 TRUE이면 값1을 돌려준다
--조건2가 TRUE이면 값2를 돌려준다
--조건들이  모두 FALSE이면 값N을 돌려준다
--CASE가 미동작시 NULL

-- 급여가 1000 미만인 사원의 급여를 10% 인상
SELECT ENAME, SAL,
        CASE WHEN SAL < 1000
            THEN SAL * 1.1
            ELSE SAL
        END AS RSAL 
FROM EMP;

--DECODE(값, 값1, 값2, 값3, 값4, ..., 값N)
--값이 값1과 같으면 값2를 돌려준다.
--일치하는 것이 없으면 값N을 돌려준다(DEFAULT, 선택사항)

-- 업무가 점원(CLERK)인 사원들의 급여를 10% 인상하고,
-- 나머지 직원들의 급여를 10% 감봉하시오
-- SAL * 0.9 부분이 DEFAULT
SELECT ENAME, SAL,
        DECODE(JOB, 'CLERK', SAL * 1.1, SAL * 0.9) AS RSAL
FROM EMP;

-- 짝수월에 입사한 사원의 급여를 10% 인상하고,
-- 홀수월에 입사한 사원의 급여를 10% 감봉하여 출력하시오
SELECT ENAME, HIREDATE, SAL,
        DECODE(MOD(TO_CHAR(HIREDATE, 'MM'), 2) ,'0', SAL * 1.1, SAL * 0.9) AS RSAL
FROM EMP;

SELECT ENAME, HIREDATE, SAL,
     CASE WHEN MOD(TO_CHAR(HIREDATE, 'MM'), 2) = 0
            THEN SAL * 1.1
            ELSE SAL * 0.9
        END AS RSAL
FROM EMP;


SELECT ENAME, HIREDATE, MOD(TO_CHAR(HIREDATE, 'MM'), 2) AS MM, SAL,
        DECODE(MOD(TO_CHAR(HIREDATE, 'MM'), 2), 0, SAL * 1.1, SAL * 0.9) AS RSAL
FROM EMP;

 

728x90