day02
: 문자열 연결
SELECT CONCAT('Hello','Bye')
, CONCAT('good' ,'bad')
, 'good' || 'bad'
FROM dual
;
: 첫 글자를 대문자로
SELECT INITCAP('good morning')
FROM dual
;
SELECT LOWER('GOOD')
, UPPER('good')
FROM dual
;
SELECT LPAD('good', 6)
, LPAD('good', 7, '#')
, LPAD('good', 8, 'L')
FROM dual
;
SELECT RPAD('good', 6)
, RPAD('good', 7, '#')
, RPAD('good', 8, 'L')
FROM dual
;
SELECT LTRIM('ggoodbye','g')
, LTRIM('goodbye','o')
, LTRIM('goodbye','go')
FROM dual
;
SELECT RTRIM('ggoodbye','g')
, RTRIM('goodbye','e')
, RTRIM('goodbye','ye')
FROM dual
;
SELECT SUBSTR('good morning john',1,4)
FROM dual
;
SELECT SUBSTR('good morning john',8,4) -- 8글자부터 4개 없앰
FROM dual
;
SELECT SUBSTR('good morning john', 8)
FROM dual
;
SELECT SUBSTR('good morning john', -4) -- 뒤에서부터 4자리 : john
FROM dual
;
SELECT REPLACE ('good morning tom', 'morning', 'evenning') -- morning 자리에 evenning 넣기
FROM dual
;
SELECT SYSDATE
FROM dual
;
SELECT ADD_MONTHS(SYSDATE, 7)
FROM dual
;
SELECT LAST_DAY(SYSDATE)
FROM dual
;
SELECT SYSDATE
, TO_CHAR(SYSDATE,'yyyy/mm/dd') "yyyy/mm/dd"
, TO_CHAR(SYSDATE,'yyyymmdd') "yyyymmdd"
, TO_CHAR(SYSDATE,'yyyy-mm-dd') "yyyy-mm-dd"
, TO_CHAR(SYSDATE,'yyyy-mm-dd HH24:MI:SS')
FROM dual
;
SELECT TO_DATE('2023-02-09', 'yyyy-mm-dd')
FROM dual
;
: 널값을 다른 데이터로 변경하는 함수
SELECT FIRST_NAME , LAST_NAME
, NVL(COMMISSION_PCT,0) commission
FROM EMPLOYEES e
;
: switch
SELECT * FROM DEPARTMENTS d ;
SELECT DEPARTMENT_ID
, DECODE(DEPARTMENT_ID, 20, 'MA', 60, 'IT', 90, 'EX' , 'ETC') de
FROM DEPARTMENTS d
;
SELECT FIRST_NAME , DEPARTMENT_ID
, CASE WHEN DEPARTMENT_ID = 20 THEN 'MA'
WHEN DEPARTMENT_ID = 60 THEN 'IT'
WHEN DEPARTMENT_ID = 90 THEN 'EX'
ELSE ''
END department
FROM EMPLOYEES e
ORDER BY DEPARTMENT_ID
;
EMPLOYEES 테이블에서 King의 정보를 소문자로 검색하고
사원번호,성명, 담당업무(소문자로),부서번호를 출력하라.
SELECT EMPLOYEE_ID , LAST_NAME , LOWER(JOB_ID) , DEPARTMENT_ID
FROM EMPLOYEES e
WHERE LOWER(LAST_NAME) = 'king'
;
EMPLOYEES 테이블에서 King의 정보를 대문자로 검색하고 사원번호,
성명, 담당업무(대문자로),부서번호를 출력하라.
SELECT EMPLOYEE_ID , LAST_NAME , UPPER(JOB_ID), DEPARTMENT_ID
FROM EMPLOYEES e
WHERE UPPER(LAST_NAME) = 'KING'
;
DEPARTMENTS 테이블에서 부서번호와 부서이름, 위치번호를
합하여 출력하도록 하라.(||사용)
SELECT DEPARTMENT_ID || ' ' || DEPARTMENT_NAME || ' ' || LOCATION_ID
FROM DEPARTMENTS d
;
EMPLOYEES 테이블에서 30번 부서 중 사원번호 이름과
담당 아이디를 연결하여 출력하여라. (concat 사용)SELECT CONCAT(CONCAT(EMPLOYEE_ID, LAST_NAME) , MANAGER_ID) FROM EMPLOYEES e WHERE DEPARTMENT_ID = 30 ;
🔑 KeyPoint
이 문제는 ||로 사용햇으면 ENPLOYEE_ID || LAST_GAME || MANAGER_ID랑 같은 쿼리문이다.
CONCAT은 CONCAT(X , Y)만 되기때문에 (X,Y,Z)로 하면 오류가 난다.
그래서 CONCAT(CONCAT(EMPLOYEE_ID, LAST_NAME) , LAST_NAME)로
CONCAT()에서
X값을 CONCAT(EMPLOYEE_ID, LAST_NAME)
Y값을 LAST_NAME 로 주면 해결된다.
SALARY+SALARYnvl(COMMISSION_PCT ,0) 이
10000이상이면, 'good'
5000 이상이면, 'average'
1이상 5000미만이면, 'bad'
0이면 no good 로 평가하고
EMPLOYEE_ID ,FIRST_NAME , SALARY ,COMMISSION_PCT,
SALARY+SALARYnvl(COMMISSION_PCT ,0) 평가를 출력해라.
SELECT EMPLOYEE_ID , FIRST_NAME , SALARY , COMMISSION_PCT
, SALARY + SALARY *NVL(COMMISSION_PCT, 0) AS sal
, CASE
WHEN SALARY + SALARY *NVL(COMMISSION_PCT, 0) >= 10000 THEN 'good'
WHEN SALARY + SALARY *NVL(COMMISSION_PCT, 0) >= 5000 THEN 'average'
WHEN SALARY + SALARY *NVL(COMMISSION_PCT, 0) >= 1
-- AND SALARY + SALARY *NVL(COMMISSION_PCT, 0) < 5000
THEN 'bad'
WHEN SALARY + SALARY *NVL(COMMISSION_PCT, 0) = 0 THEN 'no good'
END AS grade
FROM EMPLOYEES e
ORDER BY sal
;
🔑 keypoint
ALARY + SALARY *NVL(COMMISSION_PCT, 0) AS sal이 메인인 문제이다.WHEN SALARY + SALARY *NVL(COMMISSION_PCT, 0) >= 10000 = 10000이면
THEN 'good' = 'good'이다.
avearge 값도 위와 같다
bad는 1 <= 5000인데 이미 avg값에 5000이상이 있어서 아마 < 5000은 안써도 그대로 출력이 되는것같다 그래서 주석처리를 한것
no good도 값이 0이면 0이니 위와 같은 방식으로 하면된다.