본문 바로가기

sql

3. 단일행 함수

728x90
반응형

 

■함수 (단일행 함수)

*함수 (function) 필요한 이유?

-다양하게 데이터를 검색하고 분석하기 위해서 반드시 필요한 기능

:

영화 겨울왕국에는 elsa 많이 나오나 anna 많이 나오나?

 

*함수의 종류 2가지

1. 단일행 함수: 문자, 숫자, 날짜, 변환, 일반

2. 복수행 함수: 최대, 최소, 평균, 토탈, 개수, 분산, 표준편차
 

 

 

데이터--------->정보를 추출

 함수를 알아야 한다

 

:

  내가 무슨 요일에 태어났는지?

  우리나라시장에서 가장 비싼 생필품은 무엇인지?

  우리나라에서 같은 이름이 가장 많은 이름이 무엇인지?

 

 

문자함수

upper, lower, initcap, concat, substr, length, instr, ipad, rpad, trim, replace

 

upper 함수

 "대문자로 출력하는 함수"

 

lower 함수

 "소문자로 출력하는 함수"

 

 

문제57. 이름과 월급을 출력하는데 이름을 출력할

 소문자로 출력하시오

select lower(ename), sal from emp;

 

소문자로 특정 보고 싶을

select ename, sal from emp

where lower(ename)='scott';

 

 

문제58.  우리반테이블에서 네이버이메일을 사용하는

학생들의 이름과 이메일을 출력하시오

select ename, email from emp2

where lower(email)  like '%naver%';

 

 

 

 

initcap 함수

"문자를 출력할 철자는 대문자로 출력하고

나머지는 소문자로 출력하는 함수"

 

 

문제59. 이름을 출력하는데 이름의 첫번째 철자는

대문자로 출력하고 나머지는 소문자로 출력하시오

select initcap(ename) from emp;

 

 

substr 함수

 "문자에서 특정 철자만 출력하는 함수"

:

 select ename, substr(ename, 1,3)

   from emp;

첫번째를 뜻함

숫자 순서부터 3 갖고와라

 

king (ename, 2,2) in 이런식으로.

 

 

 

문제60. 이름의 첫번째 철자를 출력하는데

소문자로 출력하시오

 

select lower(substr(ename,1,1))

from emp;

 

 

문제61. (점심시간 문제)

아래의 SQL 결과를 initcap 쓰지말고

upper, lower, substr, || 이용해서 출력하시오

 

select initcap(ename) from emp;

 

문법: substr (지정값, 자리수, 개수)

 

우리조 :

select upper(substr(ename,1,1)) ||

 lower(substr(ename,2))

as initcap from emp;

 

 

:

 select upper(substr(ename,1,1))||

lower(substr(ename,2))

from emp;

 

다른조 :

select upper(substr(ename,1,1))||

lower(substr(ename,2,99))

from emp;

 

 

concat

 " 개의 컬럼의 데이터를 연결해서 출력하는 함수"

:

  select concat(ename, age)

  from emp2;

 

 

화면 캡처: 2018-10-16 오후 1:46

 

 

 

length

 "철자의 갯수를 세는 함수"

:

  select ename, length(ename)

  from  emp;

 

 

 

문제62. 이름, 이메일, 이메일 철자의 갯수를

출력하는데

이메일 철자의 갯수가 많은 학생부터

출력하시오

select ename, email, length(email)

from emp2

order by length(email) desc;

 

 

instr

" 특정 철자의 위치번호를(인덱스) 출력하는 함수"

:

  select ename, instr(ename, 'A')

  from emp;

 

문법: instr(지정값, '지정값의 철자 하나') = 지정 철자의 순번

   ex): instr (explanation,   x  )   = 2

  

 

 

문제63. 이메일에서 @ 이전 철자들만 출력하시오
 

select substr(email, 1, instr(email, '@')-1)

from emp2;

********문자자리 라서 -1 연산 안됨*********

 

 

 

문제64. 이메일에서 아래의 철자만 출력하시오

              naver

              gmail

              xerato

 

select substr(email, instr(email , '@')+1, instr(email, '.')-instr(email, '@')-1)

from emp2;

 

select

 substr(email, instr(email, '@')+1, (instr(email, '.')-1)-(instr(email, '@') ))

 from emp2;

*substr(email, 순서, 길이)

 

 

trim 함수

 "특정 철자 공백문자를 잘라내고 출력하는 함수"

 

rtrim-> 오른쪽에 있는 특정 철자나 공백문자를

           잘라내는 함수

ltrim ->왼쪽에 있는 특정 철자나 공백문자를

           잘라내는 함수

trim->양쪽에 있는 특정 철자나 공백문자를

           잘라내는 함수

:

   select ename, rtrim(ename, 'T')

      from emp;

 

 

*자료입력

(insert 앞에서 컨트롤엔터

commit; 에서 컨트롤엔터)

insert into emp(empno, ename, sal)

   values(2919, 'JACK     ', 4500);

commit;

select ename from emp;

 

 

문제65. 이름이 JACK 사원의 이름과 월급을

출력하시오

select ename, sal

from emp;

where ename='JACK'

 

답이 안나온다. 왜냐면 아까 JAKC 입력할

공백을 넣었기 때문이다.

인식시키려면

공백수만큼 숫자로 입력해줘야 한다.

 

이런 상황을 생각해서

select ename, sal

from emp;

where trim(ename) = 'JACK'

 

현업에서 거의 trim 이용함.

근데 방식으로 하면 엄청 느림.

빠르게 하기 위한 튜닝기법도 배워야 .

 

설명

trim(ename) ename 양쪽 공백을 자르는 함수이다

위의 SQL 검색속도를 느리게 하는 악성 SQL 이다.

그래서 튜닝이 필요하다. 튜닝 방법은 SQL 튜닝 수업

배운다.

 

 

replace 함수

 "특정 철자를 다른 철자로 변경하는 함수"

:

  select ename, replace(ename, 'A', 'B')

   from  emp;

 

현업에서

고객 데이터 중에 주민등록번호를 암호화해서

저장해야 한다.

 

문제66. 이름과 월급을 출력하는데 숫자 0

*표로 출력하시오

select ename, sal, replace(sal, '0', '*')

from emp;

***

where 특정지정값을 표현할 쓰는

select ename, replace(sal, '0', '*') as salary from emp;

 

 

 

 

문제67. 이름과 월급을 출력하는데 월급을 출력할 때에

숫자 0부터 3까지는 * 출력되게 하시오

select ename, sal, regexp_replace(sal, '[0-3]', '*')

 from emp;

설명: regular expression (정규 표현식) 함수를

이용해서  출력하면 된다.

*정규 표현식은 나중에 배움.

 

Regexp_replace(지정값, '[범위]',  변환값)

 

 

 

lpad, rpad 함수

자리수 채워주는 함수.

(Padding : 형태를 잡기 위해 넣는 속, 충전재)

 

 

 "lpad 함수는 문자나 숫자를 출력할

오른쪽에 원하는 철자를 출력하는 함수이고

 

rpad 함수는 문자나 숫자를 출력할

왼쪽에 원하는 철자를 출력하는 함수이다"

 

:

  select ename, lpad(sal, 10, '*'), rpad(sal, 10, '*')

   from emp;

:

 lpad(sal, 10, '*') : 연봉을 10자리로 뽑는데,

                       남는 왼쪽을 * 채워라.

 

 

숫자함수(142페이지)

round, trunc, mod

 

round 함수

 " 반올림하는 함수"

select round (758.567, 2)

 from dual;

dual 결과값만 보기 위한 가상의 테이블

 

 

7   5   8   .   5   6   7

-3 -2  -1  0  1    2   3

 

만약

round(758.567, 0) 으로 하면

바로 다음 숫자에서 반올림 한다.

또는

round(758.567) 아무것도 쓴것과 값이 같다.

 

round(758.567, -1) 다른데

7 5 8 . 5 6 7

8에서 반올림 받아서 759 라고 생각하나

음수

가서 반올림 해준다. 760

 

 

trunc 함수

 " 값을 버리는 함수"

select trunc(758.567, -1)

 from dual;

7   5   8   .   5   6   7

-3 -2  -1  0   1   2  3  ------------> 750

 

(758.567, -2)  : 700

 

 

mod 함수

 "나눈 나머지 값을 출력하는 함수"

select mod(10, 3)

 from dual;

 

ex) 10/3 했을 3, 나머지 1

   나머지 1값을 출력하는 함수.

 

 

문제68. 이름, 나이, 나이가 짝수이면 0 출력하고

                         나이가 홀수이면 1 출력하시오

select ename, age, mod(age, 2) from emp2;

 

 

 

 

문제69. 위의 SQL replace 함수를 써서 아래와 같이

결과를 출력하시오(난이도 )

 

select ename, age,

     replace(replace(mod(age,2),'0','짝수'),'1','홀수')

from emp2;

 

select replace(replace(mod(age,2), '0', '짝수'), '1', '홀수')

 

728x90
반응형

'sql' 카테고리의 다른 글

5. NVL, DECODE, CASE  (0) 2019.03.30
4. 날짜함수  (0) 2019.03.30
2. SELECT 문의 산술, 비교, 논리 연산자  (0) 2019.03.30
1. SQL 설치 및 테이블, 컬럼 소개  (0) 2019.03.30
오라클 설치  (0) 2018.12.28