인천일보아카데미/- 학습일지

[학습일지]JAVA교육일지 46일차

w1z 2022. 6. 19. 00:38

1. Case

2. Order by

3. Function


1. Case

- 컬럼 리스트, 조건절, 정렬에서 사용.(모든곳에서 사용가능)

- 자바의 if / switch와 비슷한 행동

- 조건을 만족하지 못하는 컬럼은 'NULL'을 반환

예제1
SELECT 
    CASE
        WHEN GENDER = 'm' THEN '남자'
        WHEN GENDER = 'f' THEN '여자'
    END AS GENDER
FROM EX1;
--> GENDER 캘럼안에 m -> 남자, f -> 여자

예제2 ELSE
SELECT
    CASE
    	WHEN CONTINENT = 'AS' THEN '아시아'
        WHEN CONTINENT = 'EU' THEN '유럽'
        ELSE '기타' --그 외 나머지값은 NULL이 되므로, '기타'로 표시 
    END AS CONTINENT
FROM EX2;
--> CONTINENT 캘럼안에 AS -> 아시아, EU -> 유럽

예제3 BETWEEN
SELECT
    CASE
        WHEN WEIGHT BETWEEN 50 AND 80 THEN '정상체중'
        WHEN WEIGHT BETWEEN 90 AND 100 THEN '과체중'
        ELSE '비정상체중'
    END AS WEIGHT
FROM EX3;
--> WEIGHT가 60~80 -> 정상체중 90~100 -> 과체중, 그외에 비정상체중

예제4 IS NULL
SELECT
    CASE
        WHEN CHECK IS NULL THEN '완료'
        WHEN CHECK IS NOT NULL THEN '미완료'
    END AS STATE
FROM EX4;
--> CHECK가 NULL이면 완료, 아니라면 미완료

예제5 IN
SELECT
    CASE
        WHEN POSITION IN ('과장', '부장') THEN '세단'
        WHEN POSITION IN ('대리', '사원') THEN '경차'
    END AS POSITION
FROM EX5;
--> POSITION이 (과장, 부장) -> 세단, (대리, 사원) -> 경차
        

2. Order by

- 정렬, Sort

- 레코드 순서 정렬

- 원본 테이블의 레코드 정렬이 아닌, SELECT한 테이블의 결과 테이블(결과셋)의 정렬이다.

- 오름차순(ASC), 내림차순(DESC)

- 특정 컬럼값을 기준으로 레코드를 정렬한다.

기본적인 문법>
SELECT 컬럼리스트
FROM 테이블명
WHERE 조건
ORDER BY 정렬기준;

정렬 기준 자료형>
1. 숫자형
2. 문자형
3. 날짜시간형

SELECT의 실행순서>
FROM -> WHERE -> SELECT -> ORDER BY
예제1
SELECT WEIGHT FROM EX1 ORDER BY WEIGHT ASC; --오름차순 정렬, 생략가능
SELECT WEIGHT FROM EX1 ORDER BY WEIGHT DESC; --내림차순 정렬

예제2 다중정렬
SELECT
    NAME, AGE, HEIGHT
FROM EX2
    --ORDER BY NAME ASC;                   --1차 정렬(기준 1개)
    --ORDER BY NAME ASC, AGE ASC;          --2차 정렬(기준 2개)
    ORDER BY NAME ASC, AGE ASC, HEIGHT ASC;--3차 정렬(기준 3개) 
--> 이름, 나이, 키 오름차순 정렬    
        
예제3 IN
SELECT 
	NAME, POSITION, SALARY
FROM EX3
    ORDER BY CASE
        WHEN POSITION IN ('부장', '과장') THEN SALARY * 2
        WHEN POSITION IN ('사원', '대리') THEN SALARY * 1.5
    END DESC;
--> 이름, 직급(부장, 과장), 월급 * 2 내림차순정렬
--> 이름, 직급(사원, 대리), 월급 * 1.5 내림라순정렬

예제4 직위별로 정렬(부장 - 과장 - 대리 - 사원)
SELECT
	NAME, POSITION
FROM EX4
    ORDER BY CASE
    	WHEN POSITION = '부장' THEN 1
        WHEN POSITION = '과장' THEN 2
        WHEN POSITION = '대리' THEN 3
        WHEN POSITION = '사원' THEN 4
    END ASC;
--> 이름, 직급별(부장 - 과장 - 대리 - 사원 순으로..)

3. Function

[ 집계 함수, Aggregation Function ]

1. COUNT()
- 결과셋의 레코드 갯수를 반환
- NUMBER COUNT(컬럼명)
- NULL은 카운트에서 제외한다.(*****)

--예제1
SELECT COUNT(*) FROM EX1;                
--모든 레코드 갯수 반환
SELECT COUNT(NAME) FROM EX1;             
--NAME 총 갯수
SELECT COUNT(NAME), COUNT(AGE) FROM EX1; 
--NAME, AGE 각각 총 갯수
SELECT COUNT(NAME, AGE) FROM EX1;        
--ERROR 컬럼리스트에 집계함수, 단일컬럼을 동시에 할 수 없다.

--예제2, 남자, 여자, 전체 인원수 구하기
SELECT 
    COUNT(*) AS "전체 인원수"
    COUNT(CASE
        WHEN GENDER 'm' THEN '남자'
    END) AS "남자 인원수"
    COUNT(CASE
    	WHEN GENDER 'f' THEN '여자'
    END) AS "여자 인원수"
FROM EX2;
--모든 레코드 갯수, 남자 인원수, 여자 인원수 반환

2. SUM()
- NUMBER SUM(컬럼명)
- 해당 컬럼값들의 합을 구한다.
- 숫자형만 대상(문자형X, 날짜X)

SELECT SUM(WEIGHT) FROM EX1;
SELECT 
    --방법1
    SUM(WEIGHT) + SUM(HEIGHT),
    --방법2
    SUM(WEIGHT + HEIGHT)
FROM EX2;

3. AVG()
- NUMBER AVG(컬럼명)
- 해당 컬럼값들의 평균값을 반환한다.
- 숫자형만 가능하다.
- 해당 컬럼이 NULL을 가진 항목은 제외한다.


SELECT 
    --방법1
    SUM(WEIGHT) / COUNT(*),
    --방법2
    AVG(WEIGHT) 
FROM EX1;

4. MAX()
- OBJECT MAX(컬럼명) : 최댓값 반환
- 숫자형,문자형,날짜형
    
5. MIN()
- OBJECT MIN(컬럼명) : 최솟값 반환
- 숫자형,문자형,날짜형

--숫자형 최대값, 최솟값
SELECT MAX(WEIGHT), MIN(WEIGHT) FROM EX1;
--문자형 최대값, 최솟값 (가, 나, 다, 라, ...)
SELECT MAX(NAME), MIN(NAME) FROM EX2;
--날짜형 최근날짜, 과거날짜 
SELECT MAX(DATE), MIN(DATE) FROM EX3;

 

[ 숫자 함수, Numeric Function ]

1. ROUND()
- 반올림 함수
- NUMBER ROUND(컬럼명) : 정수 반환
- NUMBER ROUND(컬럼명, 소수이하 자릿수) : 실수 반환
- 숫자형, 날짜형

SELECT ROUND(123.456) FROM DUAL;    --123
SELECT ROUND(123.456, 1) FROM DUAL; --123.4
SELECT ROUND(123.456, 2) FROM DUAL; --123.45

2. FLOOR(), TRUNC()
- 무조건 내림 함수
- 자바의 정수/정수 --> 몫
- NUMBER FLOOR(컬럼명)
- NUMBER TRUNC(컬럼명 [, 소수이하 자릿수])

SELECT FLOOR(123.456) FROM DUAL;         --123
SELECT FLOOR(123.999999999) FROM DUAL;   --123
SELECT TRUNC(123.456, 1) FROM DUAL;      --123.4

3. CEIL()
- 무조건 올림 함수
- NUMBER CEIL(컬럼명)

SELECT CEIL(123.456) FROM DUAL;        --124
SELECT CEIL(123.0000000001) FROM DUAL; --124

4. MOD()
- 나머지 함수
- NUMBER MOD(피제수, 제수)

SELECT MOD(10, 3) FROM DUAL; --1

SELECT -- 100분을 1시간 40분으로 만들기
    FLOOR(100/60) AS 시,
    MOD(100, 60) AS 분
FROM DUAL;

 

[ 문자열 함수, String Function ]

1. upper(), lower(), initcap()
- 대문자, 소문자 변환
- varchar2 upper(컬럼명)
- varchar2 lower(컬럼명)
- varchar2 initcap(컬럼명)

SELECT UPPER('a, b, c') FROM DUAL;        -- A, B, C
SELECT LOWER('A, B, C') FROM DUAL;        -- a, b, c
SELECT INITCAP('abc, ABC, aBc') FROM DUAL; -- Abc, Abc, Abc


2. SUBSTR()
- 문자열 추출 함수
- VARCHAR2 SUBSTR(컬럼명, 시작위치, 가져올 문자 개수
- VARCHAR2 SUBSTR(컬럼명, 시작위치)
- 서수를 1부터 시작(***)

SELECT
    SUBSTR('가나다라마바사아자차카타파하', 5),   -- 마바사아자차카타파하
    SUBSTR('가나다라마바사아자차카타파하', 5, 3) -- 마바사
FROM DUAL;


3. LENGTH()
- 문자열 길이
- NUMBER LENGTH(컬럼명)

SELECT LENGTH('TEST') FROM DUAL; -- 4


4. INSTR()
- 검색어의 위치를 반환 (자바의 INDEXOF()랑 비슷)
- ONE-BASED INDEX(서수가 1부터 시작)
- NUMBER INSTR(컬럼명, 검색어)
- NUMBER INSTR(컬럼명, 검색어, 시작위치)

SELECT
    INSTR('안녕하세요. 홍길동님', '홍길동'), -- 8
    INSTR('안녕하세요. 홍길동님', '아무개'), -- 0
    INSTR('안녕하세요. 홍길동님. 잘가세요. 홍길동님', '홍길동', 11) -- 20
FROM DUAL;


5. LPAD(), RPAD(), LEFT PADDING, RIGHT PADDING
- 원하는 자리수(정렬, 단위) 맞추기
- VRACHAR2 LPAD(컬럼명, 개수, 문자)
- VRACHAR2 RPAD(컬럼명, 개수, 문자)

SELECT
    LPAD('1', 3, '0'), -- 001
    LPAD('1', 3, '@'), -- @@1
    RPAD('1', 3, 0),   -- 100
    RPAD('1', 3, '+')  -- 1++
FROM DUAL;


6. TRIM(), LTRIM(), RTRIM()
- 공백제거
- VARCHAR2 TRIM(컬럼명)
- VARCHAR2 LTRIM(컬럼명)
- VARCHAR2 RTRIM(컬럼명)

SELECT
    TRIM('   하나 둘 셋   '),  -- 하나 둘 셋
    LTRIM('   하나 둘 셋   '), -- 하나 둘 셋(   )
    RTRIM('   하나 둘 셋   ')  -- (   )하나 둘 셋
FROM DUAL;


7. REPLACE()
- 문자열 치환
- VARCHAR2, REPLACE(컬럼명, 찾을문자, 바꿀 문자열)

SELECT REPLACE('테스트입니다123', '123', '000') FROM DUAL; -- 테스트입니다000


8. DECODE()
- 문자열 치환
- REPLACE() 유사
- VARCHAR2 DECODE(컬럼명, 찾을문자열, 바꿀문자열[, 찾을문자열, 바꿀문자열] X N)

--남자, 여자 구분 하기
SELECT
    DECODE(GENDER, 'm', '남자'),
    DECODE(GENDER, 'f', '여자')
FROM EX1;

MEMO>

# 오라클은 자바와 비슷하면서 다른점이 분명히 있는거같다

 

# 오라클을 3일 배웠지만 느낀것은 한 영어의 문장처럼 자연스럽고, 가장 중요한 SELECT 같은 경우 실행 순서를 먼저 파악하면서 공부하는게 좋을거같다.

 

# 결과셋을 테스트 해보고싶을때는 DUAL(시스템)테이블을 이용하면된다.