[24일 차] : Oracle - SELECT문(2), 함수(문자/날짜)

서하루·2022년 11월 15일
0

(2) Oracle 공부기록

목록 보기
2/11

[학습목표]

  • Oracle SELECT문(2)
  • 함수(문자)
  • 함수(날짜)

📝LIKE 📝
📌 비교하고자 하는 컬럼값이 내가 제시한 특정 패턴에 만족될 경우 조회
% : 0글자 이상 / _ : 1글자

EX) 
비교대상컬럼 LIKE '문자%' => 비교대상의 컬럼값이 해당 문자로 시작될 경우 조회
비교대상컬럼 LIKE '%문자' => 비교대상의 컬럼값이 해당 문자로 끝날 경우 조회
비교대상컬럼 LIKE '%문자%' => 비교대상의 컬럼값에 해당 문자가 포함되어있을 경우 조회 <<키워드검색>>

비교대상컬럼 LIKE '_문자' => 비교대상의 컬럼값이 어떠한 한글자 뒤에 해당문자가 올 경우 조회
비교대사얼럼 LIKE '__문자' => 비교대산 컬럼값이 어떠한 두글자 뒤에 해당문자가 올 경우 조회


-- 사원들 중 성이 전씨인 사원들의 사원명, 급여, 입사일 조회

SELECT EMP_NAME, SALARY, HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';

-- 사원들 중 이름에 하 가 포함되어있는 사원들의 사원명, 주민번호, 전화번호 조회
SELECT EMP_NAME, EMP_NO, PHONE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%하%';

-- 이름의 가운데 글자가 하 인 사원들의 사원명, 전화번호 조회
SELECT EMP_NAME"사원명", PHONE "전화번호"
FROM EMPLOYEE
WHERE EMP_NAME LIKE '_하_';

-- 전화번호의 3번째 자리가 1인 사원들의 사번, 사원명, 전화번호, 이메일 조회
SELECT EMP_ID, EMP_NAME, PHONE, EMAIL
FROM EMPLOYEE
WHERE PHONE LIKE '__1%';

-- 이메일 중 _ 앞글자가 3글자인(=이메일의 4번째자리가 _인) 사원들의 사번, 사원명, 이메일 조회
SELECT EMP_NO, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '____%'; 
-- 원했던 결과 도출 못함
-- 와일드카드랑 컬럼값에 담긴 문자가 동일하기 때문에 제대로 조회 안됨(다 와일드카드로 인식함)
-- 어떤게 와일드카드고 어떤게 실제 데이터값인지 구분지어야함

SELECT EMP_NO, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___!_%' ESCAPE '!';
--> 데이터값을 취급하고자 하는 값 앞에 나만의 와일드 카드를 제시하고 ESCAPE OPTION으로 나만의 와일드카드로 등록

-- 위 사원들이 아닌 그 외의 사원 조회
SELECT EMP_NO, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE NOT EMAIL LIKE '___!_%' ESCAPE '!';
-- NOT은 컬럼명 앞 또는 LIKE 앞에 기입 가능 --> 반대되는 조건으로 조회됨!

📝IS NULL / IS NOT NULL📝
📌컬럼값에 NULL이 있을 경우 비교할 때 사용되는 연산자

-- 보너스를 받지 않는 사원(보너스값이 NULL)들의 사번, 이름, 급여, 보너스 조회
SELECT EMP_ID, EMP_NAME, SALARY, BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL;

-- 부서배치를 아직 받지 않고 보너스는 받는 사원들의 사원명, 보너스, 부서코드 조회
SELECT EMP_NAME, BONUS, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL;

📝 IN 📝
📌비교대상컬럼값이 내가 제시한 목록 중에 일치하는 값이 있는지 조회

-- 부서코드가 D6이거나 D8이거나 D5인 부서원들의 이름, 부서코드, 급여 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE IN ('D6','D8','D5');

-- 그 외의 사원들 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE NOT DEPT_CODE IN ('D6','D8','D5');

-- OR보다  AND가 먼저 연산됨 
-- 직급코드가 J7이거나 J2인 사원들 중에 급여가 200만원 이상인 사원들의 모든 컬럼 조회
SELECT *
FROM EMPLOYEE
--WHERE JOB_CODE = 'J7' OR JOB_CODE='J2'AND SALARY>=2000000;
--J2이면서 급여가 200만원이상이고, 코드가 J7인 사원으로 해석됨
WHERE (JOB_CODE = 'J7' OR JOB_CODE='J2') AND SALARY>=2000000;

< 연산자 우선순위 >
0. ()
1. 산술연산자(+,-,*,/)
2. 연결연산자
3. 비교연산자
4. IS NULL / LIKE '특정패턴' / IN 연산자
5. BETWEEN AND
6. NOT (논리연산자)
7. AND (논리연산자)
8. OR (논리연산자)


📝 ORDER BY 절📝
SELECT문 가장 마지막 줄에 작성 / 실행순서도 가장 마지막

- ASC : 오름차순정렬 (작은수 ~ 큰수) / 생략시 기본값
- DESC : 내림차순정렬 (큰수 ~ 작은수)

** 실행 (해석) 되는 순서 **
1. FROM 절
2. WHERE 절
3. SELECT 절
4. ORDER BY 절 
SELECT *
FROM EMPLOYEE
ORDER BY BONUS DESC, SALARY ASC; -- 여러개 제시 가능 (첫번째 기준의 컬럼값이 동일할 경우, 두번째 기준의 컬럼가지고 정렬)

-- 전 사원의 사원명, 연봉 조회(이때 연봉별 내림차순 정렬조회)
SELECT EMP_NAME, SALARY*12 "연봉"
FROM EMPLOYEE
--ORDER BY 연봉 DESC; -- 별칭 사용 가능
-- ORDER BY SALARY * 12 DESC; 산술연산식도 가능함
ORDER BY 2 DESC; -- 컬럼 순번도 가능

2. 문자 처리 함수
📝 LENGTH / LENGTHB📝

  • LENGTH('문자열값' | 컬럼명) : 해당 문자열값의 글자수 반환
  • LENGTHB('문자열값' | 컬럼명) : 해당 문자열값의 바이트 수 반환

'강','ㄱ','나' => 한글자당 3바이트
영문자,숫자,특수문자 => 한글자당 1바이트


📝 INSTR 📝
📌 문자열로부터 특정문자의 시작위치를 찾아서 반환

INSTR('문자열값', '찾고자하는문자', [찾을위치의 시작값[순번]] => 결과값 NUMBER타입

찾을 위치의 시작값 1 : 앞에서부터 탐색
찾을 위치의 시작값 -1: 뒤에서부터 탐색

SELECT INSTR('AABAACAABBAA','B') FROM DUAL; -- 찾을 위치의 시작값 1이 기본값, 순번도 1이 기본값(앞에서부터 첫번째 B의 값을 찾겠다)
SELECT INSTR('AABAACAABBAA','B', -1) FROM DUAL; -- 뒤에서부터 B의 값 찾음 => 결과값은 앞에서 10번째
SELECT INSTR('AABAACAABBAA','B',1,2) FROM DUAL;  -- 앞에서부터 두번째 있는 B의값 찾음
SELECT INSTR('AABAACAABBAA','B',1,100) FROM DUAL; -- 값을 찾지 못할 경우 0을 반환함 

SELECT EMAIL, INSTR(EMAIL,'_',1,1) "_위치", INSTR(EMAIL,'@')"@위치"
FROM EMPLOYEE;

📝 SUBSTR 📝
문자열에서 특정 문자열을 추출해서 반환 (=자바의 substring과 유사)

SUBSTR(STRING, POSITION, [LENGTH]) => 결과값 CHARACTER타입
STRING :문자타임의 컬럼 또는 문자열
POSITION : 문자열을 추출할 시작위치 값(정수, 음수제시 가능)
LENGTH : 추출할 문자 갯수 (생략시 시작위치부터 끝까지 추출)

SELECT SUBSTR('SHOWMETHEMONEY', 7) 7번째부터 끝까지 출력
SELECT SUBSTR('SHOWMETHEMONEY',5,2) 5번째부터 2개의 값 출력
SELECT SUBSTR('SHOWMETHEMONEY',1,6) 1번째부터 6개의 값 출력
SELECT SUBSTR('SHOWMETHEMONEY'-8,3) 뒤에서 8번째부터 3개의 값

SELECT EMP_NAME, EMP_NO, 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';

📝 LPAD / RPAD 📝
📌 문자열에 특정 문자를 왼쪽 또는 오른쪽에 붙일 때 사용

-- 950918-2****** 형식으로 조회 => 총 글자수 : 14글자
--SELECT RPAD(주민번호값성별자리까지추출한문자열,14,'*')
SELECT EMP_NAME,RPAD(SUBSTR(EMP_NO,1,8),14,'*')
FROM EMPLOYEE;

SELECT EMP_NAME,SUBSTR(EMP_NO,1,8) || '******'
FROM EMPLOYEE;

📝 LTRIM / RTRIM 📝
📌문자열에서 특정 문자를 제거한 나머지를 반환

SELECT LTRIM('   B  R ') FROM DUAL; -- 제거하고자하는 문자 생략시 기본값이 공백문자 
SELECT LTRIM('123123BR123','123') FROM DUAL;
SELECT LTRIM('ACABACCBR','ABC') FROM DUAL;

📝 TRIM 📝
📌문자열의 앞/뒤/양쪽에 있는 지정한 문자열을 제거한 나머지 반환

-- 기본적으로 양쪽에 있는 문자들 다 찾아서 제거 
SELECT TRIM('   B R    ') FROM DUAL;
SELECT TRIM('Z' FROM 'ZZZBRZZZ') FROM DUAL;

SELECT TRIM(LEADING 'Z' FROM 'ZZZBRZZZ') FROM DUAL; -- LEADING == 앞 == LTRIM
SELECT TRIM(TRAILING 'Z' FROM 'ZZZBRZZZ') FROM DUAL; -- TRAILING == 뒤 == RTRIM
SELECT TRIM(BOTH 'Z' FROM 'ZZZBRZZZ') FROM DUAL; -- BOTH == 양쪽 == 생략시 기본값

📝 LOWER / UPPER / INITCAP📝
📌소문자 / 대문자 / 앞글마다 대문자 변경

📝 CONCAT 📝
📌문자열 두개를 전달받아 하나로 합친 결과를 반환 (두개이상은 안됨)

SELECT CONCAT('가나다','ABD') FROM DUAL;
SELECT '가나다' || 'ABC' FROM DUAL;

📝 REPLACE 📝
📌str1 값을 str2 값으로 바꿔주는 것(실제 데이터값이 바뀌는게 아님)
REPLACE(STRING, STR1, STR2) => CHARACTER타입

SELECT EMP_NAME,REPLACE(EMAIL,'br.com', 'gamil.com')
FROM EMPLOYEE;

📝 ABS 📝
📌 숫자의 절대값을 구해주는 함수
ABS(NUMBER)=> 결과값 NUMBER타입


📝 MOD 📝
📌 두 수를 나눈 나머지 값을 반환해주는 함수
MOD(NUMBER,NUMBER) => 결과값 NUMBER


📝 ROUND 📝
📌 반올림한 결과 반환해주는 함수
ROUND(NUMBER ,[위치]) => 결과값 NUMBER


📝 CEIL 📝
📌 올림처리 해주는 함수
CEIL(NUMBER) => 결과값 NUMBER


📝 FLOOR 📝
📌 소수점 아래 버림처리 하는 함수


📝 TRUNC 📝
📌 위치 지정이 가능한 버림처리해주는 함수
TRUNC (NUMBER, [위치])


3. 날짜 처리 함수
📝 SYSDATE 📝
📌 현재 시스템 날짜 및 시간을 반환


📝 MONTHS_BETWEEN(DATE1, DATE2)📝
📌 두 날짜 사이의 개월 수를 반환해주는 함수

--
📝 ADD_MONTHS(DATE, NUMBER) 📝
📌 특정날짜에 해당 숫자만큼의 개월수를 더해서 날짜 리턴해주는 함수 => 결과 DATE타입


📝 NEXT_DAY(DATE,요일(문자|숫자) 📝
📌 특정날짜 이후에 가까운 해당 요일의 날짜 반환해주느 함수 => DATE타입


📝 LAST_DAT(DATE) 📝
📌 해당 월의 마지막 날짜를 구해서 반환해주는 함수


📝 EXTRACT(YEAR | MONTH | DAY FROM DATE) 📝
📌 특정 날짜로부터 년도/월/일 만 추출해서 반환해주는 함수

0개의 댓글