SQL(3)

기혁·2023년 2월 9일
0

DBMS 학습

목록 보기
4/13
post-thumbnail

day02

📌 함수 심화

👉 concat

: 문자열 연결

SELECT CONCAT('Hello','Bye')
	,  CONCAT('good' ,'bad')
	,	'good' || 'bad'
FROM	dual
;

👉 initcap

: 첫 글자를 대문자로

SELECT	INITCAP('good morning')
FROM	dual
;

👉 대/소문자

SELECT LOWER('GOOD')
	,  UPPER('good')
FROM	dual
;

👉 lpad

SELECT LPAD('good', 6)
	,  LPAD('good', 7, '#')
	,  LPAD('good', 8, 'L')
FROM   dual
;

👉 rpad

SELECT RPAD('good', 6)
	,  RPAD('good', 7, '#')
	,  RPAD('good', 8, 'L')
FROM   dual
;

👉 LTRIM

SELECT LTRIM('ggoodbye','g')
	,  LTRIM('goodbye','o')
	,  LTRIM('goodbye','go')
FROM   dual
;

👉 RTRIM

SELECT RTRIM('ggoodbye','g')
	,  RTRIM('goodbye','e')
	,  RTRIM('goodbye','ye')
FROM   dual
;

👉 substr

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
;

👉 replace

SELECT REPLACE ('good morning tom', 'morning', 'evenning') -- morning 자리에 evenning 넣기
FROM	dual
;

👉 현재 시각 : sysdate()

SELECT SYSDATE 
FROM   dual
;

👉 7개월 더한다.

SELECT ADD_MONTHS(SYSDATE, 7)
FROM   dual
;

👉 현재 달의 마지막 날짜

SELECT LAST_DAY(SYSDATE)
FROM   dual
;

👉 to_char

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
;

👉 to_date

SELECT 	TO_DATE('2023-02-09', 'yyyy-mm-dd')
FROM	dual
;

👉 nvl()

: 널값을 다른 데이터로 변경하는 함수

SELECT FIRST_NAME ,	LAST_NAME 
	,  NVL(COMMISSION_PCT,0) commission 
FROM EMPLOYEES e 
;

👉 decode()

: switch

SELECT * FROM DEPARTMENTS d ;
SELECT DEPARTMENT_ID 
	,  DECODE(DEPARTMENT_ID, 20, 'MA', 60, 'IT', 90, 'EX' , 'ETC') de 
FROM DEPARTMENTS d 
;

👉 case

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 
;

📌 응용문제

💡 문1

EMPLOYEES 테이블에서 King의 정보를 소문자로 검색하고
사원번호,성명, 담당업무(소문자로),부서번호를 출력하라.

SELECT  EMPLOYEE_ID , LAST_NAME , LOWER(JOB_ID) , DEPARTMENT_ID  
FROM 	EMPLOYEES e 
WHERE 	LOWER(LAST_NAME) = 'king' 
;

💡 문2

EMPLOYEES 테이블에서 King의 정보를 대문자로 검색하고 사원번호,
성명, 담당업무(대문자로),부서번호를 출력하라.

SELECT EMPLOYEE_ID , LAST_NAME , UPPER(JOB_ID), DEPARTMENT_ID
FROM EMPLOYEES e 
WHERE UPPER(LAST_NAME) = 'KING'
;

💡 문3

DEPARTMENTS 테이블에서 부서번호와 부서이름, 위치번호를
합하여 출력하도록 하라.(||사용)

SELECT 	DEPARTMENT_ID || ' ' || DEPARTMENT_NAME || ' ' || LOCATION_ID 
FROM 	DEPARTMENTS d 
;

💡 문4

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 로 주면 해결된다.

💡 문5

SALARY+SALARYnvl(COMMISSION_PCT ,0) 이
10000이상이면, 'good'
5000 이상이면, 'average'
1이상 5000미만이면, 'bad'
0이면 no good 로 평가하고
EMPLOYEE_ID ,FIRST_NAME , SALARY ,COMMISSION_PCT,
SALARY+SALARY
nvl(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이니 위와 같은 방식으로 하면된다.

profile
⭐️내가만든쿠키⭐️

0개의 댓글