SELECT 1+2*3
FROM DUAL;
--출력 : 7
--각 직원들의 실 지급액을 출력하시오.
--실 지급액 : 급여+커미션
--출력 : 이름, 급여, 커미션, 실 지급액
--NULL+A는 NULL
SELECT ENAME, SAL,COMM,SAL+COMM
FROM EMP;
--NVL(값1,값2) : 값1이 NULL이면 값2로 교체 <오라클>
--IFNULL(값1,값2) <MYSQL>
--ISNULL(값1,값2) <MSSQL>
--AS+명칭 : SELECT에서만 사용가능
SELECT ENAME, SAL, COMM, SAL + NVL(COMM,0) AS REAL
FROM EMP
--결과 REAL컬럼에서 COMM이 NULL 이면 0처리라서 그대로 SAL 값이 고대로 나온다.
--REAL SAL로 작성하면 띄어쓰기 때문에 다른 문법으로 인식 -> " "로 묶는다.
--' '는 문자열 " "는 문법
SELECT ENAME, SAL,COMM,SAL+NVL(COMM,0) AS "REAL SAL"
FROM EMP;
개수기반 1부터 시작한다. 자바랑 다르게
--문자열 더하기
SELECT 'HELLO' || 'WORLD!!' || '!!'
FROM DUAL
;
--출력 : HELLOWORLD!!
--CONCAT 문자열 더하기 필요는 없음
SELECT CONCAT ('HELLO', 'WORLD!!')
FROM DUAL
;
--출력 : HELLOWORLD!!
--자르기
SELECT SUBSTR('HELLO WORLD!!', 4)
FROM DUAL
;
--출력 : LO WORLD!!
SELECT SUBSTR('HELLO WORLD!!', 8, 5)
FROM DUAL
;
--출력 : ORLD!
--길이
SELECT LENGTH('KAY')
FROM DUAL
;
--출력 : 3
--변경
SELECT REPLACE ('HELLO WORLD!!', 'L', 'K')
FROM DUAL
;
--출력: HEKKO WORKD!!
SELECT REPLACE('KKKKI', 'K', 'J')
FROM DUAL;
--출력: JJJJI
SELECT INSTR('KWON', 'N')
FROM DUAL;
-- 출력 : 4
--나올 수 없는 숫자는 0
SELECT INSTR('HELLO WORLD!!', 'K')
FROM DUAL;
--해당글자 없으면 0으로 출력
-- 몇번 째 글자인지찾기
SELECT INSTR ('HELLO WORLD!!', 'L',4)
FROM DUAL
;
--출력 : 4, 숫자번째부터 찾는다.
SELECT INSTR ('HELLO WORLD!!', 'L',4, 2)
FROM DUAL
;
--출력 : 10,4번 글자 부터 확인하고, 똑같은 글자가 있다면 2번째 나오는 것 을 출력
-- 2번째 나오는 게 없으면 그대로 0 출력
--숫자로 변환
SELECT TO_NUMBER('123') +4
FROM DUAL
;
--출력 : 127
SELECT '123' + 4
FROM DUAL
;
--출력 : 127
--대소문자
SELECT LOWER ('HELLO'), UPPER('world')
FROM DUAL
;
--출력: hello WORLD
--문자열을 날짜로 변환
SELECT TO_DATE('2021-04-09')
FROM DUAL
;
--출력 : 값으로 보면 달력 날짜로 표시
SELECT '2021-04-09'
FROM DUAL
;
--출력 : 그냥 값으로 표시
--현재시간
SELECT SYSDATE
FROM DUAL
;
--문자열 형태변화 TO_CHAR(값, 형태)
--Y , YY, YYYY: 연도
--MM : 월
--MON : 월
--DD : 일
--DAY : 요일
--D : 몇번 째 날
--유의사항 TO-CHAR 사용 시 형태에 한글 사용 안됨
--사용가능한 것: -(하이픈), :(콜론), .(점), ,(컴마) 사용 가능
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD-DAY D')
FROM DUAL
;
--출력: 2021-04-09, 금요일, 1
--AM,PM : 오전 ,오후
--HH : 시간 (12시간 기준)
--HH24: 시간 (24시간 기준)
--MI : 분
--SS : 초
SELECT TO_CHAR(SYSDATE, 'AM HH: MI :SS')
FROM DUAL
;
--출력: 오후 04:25: 15
--몇 주차
--W : 해당 월의 1일 기준 몇주차인지
--WW : 1월 1일 기준 몇주차 인지
-- IW: 첫째 월요일 기준 몇주차 인지
SELECT TO_CHAR(SYSDATE, 'W'),TO_CHAR(SYSDATE, 'WW'),TO_CHAR(SYSDATE, 'IW')
FROM DUAL
;
--출력: w: 2 ww:15 Iw :14
--Q : 분기
SELECT TO_CHAR(SYSDATE, 'Q')
FROM DUAL
;
--출력: 2
--날짜 + -숫자 : 해당일자 만큼 증감
--숫자 기준으로 날짜 빼줌
SELECT SYSDATE -30
FROM DUAL
;
--출력 : 4월9일 기준으로 21-03-10
--TO_CHAR에서 형태에 9가 오는 경우 해당 위치에 숫자를 넣는다는 의미
-- 소수점을 표시할 경우 아래 자리수는 자동 반올림
-- L : 해당 오라클 설치 장치의 언어 셋팅에 따른 통화기호제공
SELECT TO_CHAR(123456, '999999')
FROM DUAL;
--출력 : 123456, 9가 자리수 보다 적으면 #으로 나옴
SELECT TO_CHAR(123456.789, 'L999,999,999.99')
FROM DUAL
;
--출력: ₩123,456.79
--DBMS_RANDOM.VALUE(값1, 값2):
--값1부터 값2까지 사이의 난수를 구한다.
--DBMS_RANDOM.STRING(형태, 개수) :
--형태로 지정된 규칙대로 개수만큼 불특정 문자열을 만든다. 비밀번호 설정 시 사용
--U : 대문자, L : 소문자, A : 대소문자,
--X : 대문자숫자, P : 출력 가능한 모든 경우의 수
SELECT DBMS_RANDOM.STRING('X', 10), DBMS_RANDOM.VALUE(1, 10)
FROM DUAL;
--급여가 3000이상인 사원들의 급여를 10% 인상하고, 나머지는 그대로 출력하시오.
--출력 : 이름, 급여, 변경급여
--CASE WHEN 조건1 THEN 값1 ELSE 값 N :
--조건 1이 TRUE면 값1을 돌려줌. TRUE가 없으면 값N을 돌려줌
--CASE WHEN THEN END 필수, ELSE 선택
SELECT ENAME, SAL,
CASE WHEN SAL >= 3000
THEN SAL * 1.1
ELSE SAL
END AS REAL
FROM EMP;
--출력 : 3000이상 사원들 급여 10&인상
-- 미만인 사람들은 인상없이 원래급여 나옴
--업무가 점원인 사원들의 급여를 10%인상하고,
--업무가 세일즈맨인 사원들의 급여 50% 인하 나머지는 그대로 출력하시오.
SELECT ENAME, SAL, JOB,
CASE WHEN JOB = 'CLERK'
THEN SAL *1.1
WHEN JOB = 'SALESMAN'
THEN SAL * 0.5
ELSE SAL
END AS RSAL
FROM EMP;
--출력 : 업무가 점원인 사람들만 10% 씩 올랐다.
--DECODE(값, 값1, 값1-1, ..., 값N)
--값이 값1과 같으면 값1-1을 돌려준다. 값, 값1, 값1-1필수
--같은 것이 없으면 값 N을 돌려준다.
SELECT ENAME, JOB, SAL,
DECODE(JOB, 'CLERK', SAL * 1.1, SAL) AS RSAL
FROM EMP;
--홀수월에 입사한 사원들의 급여를 50%인상하고,
--짝수월에 입사한 사원들의 급여를 50%감봉하여 사원 정보를 출력하시오.
--출력 : 이름, 입사월, 기존급여, 변경급여
--case 문법
SELECT ENAME, TO_CHAR(HIREDATE,'MM'),SAL,
CASE WHEN MOD(TO_CHAR(HIREDATE,'MM'),2) =1
THEN SAL*1.5
ELSE SAL*0.5
END AS RSAL
FROM EMP;
--DECODE 문법
SELECT ENAME, TO_CHAR(HIREDATE,'MM'),SAL,
DECODE(MOD(TO_CHAR(HIREDATE,'MM'),2) 1, SAL*1.5, SAL) AS RSAL
FROM EMP;
서브쿼리 위치별 조건,
A. select - 실행결과 : 단일 column,단일 row
B. from - 실행결과 : Anything
C. where - 실행결과 : 기본적으로 단일 column,단일 row
단, in으로 사용할 경우 단일 column,복수 row가능
간단하게 생각해서 VIEW를 재가공하는 것
--점원들의 급여를 50%인상하고 나머지 급여는
--그대로 적용하여 변경급여가 1500이하인 사원들을 구하시오.
--불가능
SELECT ENAME, JOB, SAL,
DECODE(JOB, 'CLERK', SAL*1.5, SAL) AS REAL
FROM EMP
;
--서브쿼리 사용, 서브쿼리는 효율성을 위해 FROM에서 쓰고 정 안될경우,
--WHERE에서 IN 사용해주기
SELECT ENAME, JOB, SAL, RSAL
FROM (SELECT ENAME, JOB, SAL, DECODE(JOB, 'CLERK', SAL * 1.5, SAL) AS RSAL
FROM EMP)
WHERE RSAL<=1500;
--응용
SELECT ENAME, JOB, SAL, RSAL
FROM(SELECT ENAME, JOB, SAL,
DECODE(JOB, 'CLERK', SAL*1.5, SAL) AS RSAL
FROM EMP)
WHERE RSAL<3000;
데이터베이스 2일차인데, 이것도 쉽지는않은 것같다. 그러나 자바처럼 노력을하면 익숙해지지 않을까 라고 생각한다. 일단 연습을 많이 해보자