Blue___
코딩배우는 학생🌎
Blue___
전체 방문자
오늘
어제
  • 코딩배우는 학생🧀 (242)
    • Algorithms (145)
      • BOJ[Java] (107)
      • Programmers[Java] (32)
      • Coding_Contest (3)
    • Web (22)
      • .NET Core C# (2)
      • Java (1)
      • Oracle SQL (7)
      • Web-ProJect (3)
      • Error처리 (1)
      • Web지식 (4)
      • Javascript (1)
      • Vue (3)
    • Git (4)
    • Java_beginner(Repl.it) (55)
      • Auto-Graded-Course(AP CS A) (54)
    • 프로젝트 직딩일기 (3)
    • Hanyang_Assignment (0)
    • 이모저모 (4)
      • 잡담 (1)
      • 2021 오픈소스 컨트리뷰터 아카데미 (1)
      • DDD - 6기! (1)
    • 북리뷰 (1)
      • 리팩토링 2판 (1)
      • 클린코드 (0)

블로그 메뉴

  • 🐰GITHUB
  • ☘️포트폴리오
  • 🌸MBC개발_투표 2022
  • 🍭MBC_APP

공지사항

인기 글

태그

  • Java
  • Bakjoon
  • 백준
  • java basic
  • 코딩배우는 학생
  • 알고리즘
  • 코딩배우는학생
  • 프로그래밍
  • programmers
  • repl.it
  • Java tutorial
  • AP CS A
  • 코딩
  • REPL
  • 레플릿
  • algorithm
  • 자바
  • auto-graded course
  • coding
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO
Blue___

코딩배우는 학생🌎

Web/Oracle SQL

[SQL] 함수(Functions)

2020. 3. 27. 14:09

1. ORDER BY  (정렬)

 ORDER BY col1, col2...( co1로 정렬,  중복되면 col2로 정렬)

 **컬럼명 뒤에 ASC, DESC를 추가한다

 

  1-1 NULL을 포함하는 컬럼의 정렬

 

  NULL데이터를 원하는 위치에 정렬시키는 법 

  

  •  NULLS FIRST : NULL값을 처음으로 
  • NULLS LAST : 마지막으로 
1
2
SELECT empno, ename, comm FROM emp ORDER BY comm DESC NULLS LAST;
SELECT empno, ename, comm FROM emp ORDER BY comm DESC NULLS FIRST,empno;
 
 

2. DISTINCT (중복제거)

중복데이터를 제거하는 키워드 이며 SELECT 키워드와 함께쓰인다. SELECT키워드 바로 뒤에 붙여서 사용한다. 

1
2
3
SELECT DISTINCT deptno FROM emp ORDER BY deptno;
 
SELECT DISTINCT deptno,ename FROM emp order by deptno,ename; 
--두개의 컬럼이 모두 같아야 중복제거가 되기때문에 -deptno가 중복제거 안된다
 

 

3. 기타 여러함수 

3-1 length, lengthb  길이출력함수

 

length : 길이 출력 

lengthb : byte길이 출력

1
2
3
SELECT length('Apple') AS len1 FROM dual;
SELECT length('Apple') len1, length('안녕') len2, length('Hello 오라클')len3 FROM dual;
 
 

 

3-2 대소문자, 첫글자 대문자

 

UPPER : 모두 대문자로 변환

LOWER : 모두 소문자로 변환

INITCAP : 첫글자 대문자

1
2
3
4
5
6
7
8
-- 'hELlo' 모두 대문자로 변환 -> HELLO
SELECT UPPER('hELlo') FROM dual;
 
-- 'hELlo' 모두 소문자로 변환 -> hello
SELECT LOWER('hELlo') FROM dual;
 
-- 'hELlo' 이니셜(첫글자) 대문자 -> Hello
SELECT INITCAP('hELlo') FROM dual;
 

 

3-3 문자열의 위치, 문자열 자르기

 

INSTR : 문자열의 위치반환 첫번째는 1이다 (0아님)

SUBSTR : 문자열 자르기

SUBSTR(문자열, 시작위치, 끝위치) : 숫자가 하나만 들어간다면 1번부터 숫자까지 반환한다.

 

-SUBSTR와 INSTR은 B를 붙여주면 Byte 길이로 반환한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- SQL에서는 첫번째가 1이다 
-- 'ABCDEFGHI'에서 'D' 의 위치 -> 4
SELECT INSTR('ABCDEFGHI','D') FROM dual;
 
-- 'ABCDEFGHI'에서 'DEF'문자열의 위치 ->4
SELECT INSTR('ABCDEFGHI','DEF') FROM dual;
 
-- 'ABCDEFGHI'에서 'DF'문자열의 위치 -> 0 --없으면 0
SELECT INSTR('ABCDEFGHI','DF') FROM dual;
 
-- '안녕하세요'에서 '하'문자열의 위치 -> 3
SELECT INSTR('안녕하세요','하') FROM dual;
 
 -- '안녕하세요'에서 '하' 문자열까지 바이트
SELECT INSTRB('안녕하세요','하') FROM dual;
 
-- 'ABCABCDDD'에서 'C'문자열의 위치 -> 3
SELECT INSTR('ABCABCDDD','C') FROM dual;
 
--'Oracle SQL Developer'에서 5번째 인덱스 이후의 문자열로 자르기
SELECT SUBSTR('Oracle SQL Developer',5) FROM dual;
 
--'Oracle SQL Developer'에서 5번째 인덱스부터 5글자로 자르기
SELECT SUBSTR('Oracle SQL Developer',6,5) FROM dual; --5번째 이후
 
--'오라클 SQL'에서 2번째 인덱스부터 5글자로 자르기
SELECT SUBSTR('오라클 SQL',3,5) FROM dual;
SELECT SUBSTRB('오라클 SQL',3,5) FROM dual; --3번째부터 잘라서 5바이트 가져와라
--'안녕하세요오라클'에서 3번째 부터 자르기
SELECT SUBSTR('안녕하세요오라클',3) FROM dual;
 

 

3-4 패딩(Padding)

 

문자를 표현하기 위해서 공간을 확보하고 문자를 채우는 함수.

 

  • LPAD : left padding
  • RPAD : right padding
1
2
3
4
5
6
7
8
9
--LEFT PADDING : lpad()
SELECT lpad('SQL',10) FROM dual; --10개의 공간을 만든뒤 오른쪽으로 SQL출력
SELECT lpad(ename,10) FROM emp;  -- 10칸을 확보하고 오른쪽으로 값 출력
-- 글자수보다 공백이 작다면 글자수 만큼만 표현해준다
 
--RIGHT PADDING : rpad()
SELECT rpad('SQL',10) FROM dual; --오른쪽에 10개의 공간을 만든뒤 SQL출력
 
SELECT rpad('SQL',10,'*') FROM dual; --공백대신 *이 들어감
 

 

3-5 TRIM 공백지우기

 

TRIM : 데이터의 양 끝단에 있는 공백을 제거해줍니다

1
2
SELECT '   SQL   ', ltrim('   SQL   '), rtrim('   SQL   '), trim('   SQL   ') FROM dual; --왼쪽공백제거 오른쪽 공백제거 등--
SELECT ltrim(rtrim('   SQL   ')) FROM dual; -- = trim()
 

 

4. 날짜 함수

날짜를 매개로 사용하는 함수

** Sysdate : 현재 날짜시간을 반환하는 함수이다.

사용방법 : 매개변수와 ()도 미사용

 

**대체로 서식지정자와 함께 사용한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--날짜함수, DATETIME--
 --sysdate 
 
SELECT sysdate FROM dual; --오늘날짜 출력 20/3/24 :년원일
 
--날짜시간 타입->문자 타입(서식지정)
SELECT to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') now FROM dual; 
 
--MONTHS_BETWEEN : 개월 수 차이
SELECT months_between('20-01-01','20-02-01') A FROM dual; --왼쪽-오른쪽 (1=1개월)
SELECT months_between('20-01-01','20-02-01') A,round(months_between('20-01-01','20-02-15'),2) B FROM dual; 
--round로 반올림
 
--next_day : 지정된 요일이 다가오는 날짜 구하기
SELECT next_day(sysdate,'금') FROM dual;
 
 
--trunc 함수 (버리기)--trunc는 매개변수로 숫자or날짜가능 ** 중요(시간을00시로 버린다)
--trunc(datetime)
SELECT sysdate,to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),to_char(trunc(sysdate),'YYYY/MM/DD HH24:MI:SS')
 FROM dual;
--20/03/24    2020/03/24 19:43:17    2020/03/24 00:00:00
 
--보이는 결과는 같지만 시간이 포함되어 서로 다른 값을 가진다
SELECT sysdate,trunc(sysdate) FROM dual;
 
 

 

 

5. 단일 행 함수

5-1 NVL

 매개변수가 NULL인지 판단하여 NULL이라면 원하는 값을 반환하는 함수

 

5-2 NVL2 

 NVL과 같지만 NULL이 아닐때 원하는 값으로 반환가능

 NVL2 (데이터, NULL이 아닐 경우 반환값, NULL일 경우 반환값)

 

1
2
3
4
5
6
7
8
9
--NVL
 
SELECT empno, ename, NVL(comm,0) as BONUS FROM emp ORDER BY comm DESC,ename;
-- comm(상여금)  NULL ->0으로 치환해준다
 
--NVL2
-- comm이 NULL이면 sal로 치환
-- comm이 NULL이 아니면 sal+comm로 치환
SELECT ename, sal, comm, sal+comm FROM emp; --하나가 NULL이라면 덧셈을 수행하지 않는다
SELECT ename, NVL2(comm,sal+comm,sal)AS pay FROM emp; --comm이 NULL이어도 덧셈을 수행할 수 있게 변경
 

5-3 NULLIF

  두 개의 값이 같은지 비교하여 같으면 NULL반환

  다르면 첫번째 매개변수를 반환

  

  NULLIF(첫째값, 둘째값)

 

5-4 DECODE && CASE

  비교값을 여러 개 나열하여 비교결과를 반환하는 함수

  기준값과 비교값이 같으면 반환값을 반환

 

** default 값은 생략 가능

** 기준값과 비교값이 같을 때 비교값 바로 다음에 오는 반환값을 반환

 

1
2
3
4
5
6
7
8
9
10
11
12
--NULLIF
 
SELECT
    NULLIF(10,20)"1", --10
     NULLIF(20,10)"2", --20
      NULLIF(10,10)"3" --null
      FROM DUAL;
      
 
 
 
1
2
3
4

--응용

--job컬럼에서 'salesman' 을 찾는다 ->null변환

-- NULL값을 NVL을 이용해 '영업'변환

 
SELECT empno,ename,job, 
    NULLIF(job,'SALESMAN') N_IF, 
    NVL(NULLIF(job,'SALESMAN'),'영업') job_kor 
FROM emp;
 
 

#CASE : DECODE와 같은 용도 (CASE를 더 많이 사용한다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--CASE 구문
--이렇게도 표현 가능하다 
SELECT empno, ename, deptno,
    CASE deptno       
        WHEN 10 THEN '회계팀'
        WHEN 20 THEN '연구팀'
        WHEN 30 THEN '영업팀'
        WHEN 40 THEN '운영팀'
        ELSE '부서없음'
    END as dname --alias는 여기에
FROM EMP;
 
 
SELECT empno, ename, deptno,
    CASE      
        WHEN job=upper('president') THEN'사장'
        WHEN deptno=10 THEN '회계팀'
        WHEN deptno=20 THEN '연구팀'
        WHEN deptno=30 THEN '영업팀'
        WHEN deptno=40 THEN '운영팀'
        ELSE '부서없음'
    END as dname --alias는 여기에
FROM EMP;
 
 
 

 

5-5 기타 함수

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
--COUNT
SELECT count(*) FROM emp;  --12개의 행 --전체 행수
 
SELECT empno FROM emp; --전체 출력
SELECT count(empno) cnt_empno FROM emp; --그룹핑해서 한줄로 12출력
 
SELECT mgr FROM emp; --12개중 null값을 하나 가지고 있다
SELECT count(mgr) FROM emp; --null을 제외하고 11(행의합) 출력
 
SELECT count(comm) FROM emp ORDER BY comm; --4개 (null)값 제외
 
SELECT 1 FROM emp; --1을 12개출력
SELECT count(*) FROM emp; --12
SELECT count(1) FROM emp; --12
 
--SUM
SELECT sum(sal) total FROM emp;
 
--AVG
SELECT round(avg(sal),2)average FROM emp; -- 둘째짜리까지 반올림
 
--MAX
SELECT max(sal) maximum FROM emp;
 
--MIN
SELECT min(sal) minimun FROM emp;
 
SELECT max(ename) FROM emp; --알파벳순서로 가장 큰값
SELECT min(ename) FROM emp; --알파베순서 제일 앞의 값
 
SELECT max(hiredate),min(hiredate) FROM emp; --날짜도 가능(큰게 최근) , (작은게 오래된) --단순 숫자가 큰것
 
 
--전체 sal에 대한 합계
SELECT sum(sal) FROM emp; 
-->변경 -부서별 급여 합계
 
SELECT 
    deptno,
    sum(sal)
FROM emp GROUP BY deptno ORDER BY deptno; --deptno로 그룹을 지어준다
 
--부서별 인원수
 
SELECT
    deptno,
    count(*) cnt
FROM emp GROUP BY deptno;
 
SELECT ename from emp WHERE sal=5000;
 
--부서별+ 직무별 사원수
SELECT 
    deptno,
    job,
    count(*)
FROM emp
GROUP BY deptno,job --두개의 컬럼을 하나처럼 인식
ORDER BY deptno,job;
 
 
 

 

 

 

 

 

반응형
저작자표시 (새창열림)

'Web > Oracle SQL' 카테고리의 다른 글

[PROGRAMMER Level-4] 입양 시각 구하기(2)[Oracle]  (0) 2020.03.29
[PROGRAMMERS Level 4] 우유와 요거트가 담긴 장바구니(Summer/Winter Coding(2019)) [Oracle]  (0) 2020.03.29
[SQL] 변환함수,서식지정자  (0) 2020.03.27
[SQL] 정의와 기본문법  (0) 2020.03.27
[mySQL] Workbench에서 csv 파일 import 하기 [Mac]  (4) 2019.11.26
    'Web/Oracle SQL' 카테고리의 다른 글
    • [PROGRAMMERS Level 4] 우유와 요거트가 담긴 장바구니(Summer/Winter Coding(2019)) [Oracle]
    • [SQL] 변환함수,서식지정자
    • [SQL] 정의와 기본문법
    • [mySQL] Workbench에서 csv 파일 import 하기 [Mac]
    Blue___
    Blue___
    완전 연소한 불은 재를 남기지않는다 : 코딩배우는학생 🌎

    티스토리툴바