Itwill 학습내용 정리/1. SQL

2.1 (단일행 함수) 문자 함수

cannonvirus 2019. 4. 17. 23:41

 


※ EMP 테이블 구조


 

※ 문자함수

문자함수 대소문자 변환 함수 lower, upper, initcap
문자 조작 함수 concat, substr, length, instr, lpad(rpad), trim, replace

 

1. upper 함수 ~ 대문자로 출력

 # 문제 25. emp 테이블의 모든 문자를 대문자로 출력하라.

 

select upper(*)

  from emp;

 

select empno, upper(ename), upper(job), mgr, hiredate, sal, comm, deptno

  from emp;

 - 첫번 째 쿼리는 당연하게 에러가 난다. upper는 문자만 대문자로 바뀌기 때문에 숫자나 날짜형식을 upper로 씌울 수 없다.

 

2. lower 함수 ~ 소문자로 출력

 # 문제 26. 이름과 월급을 출력하는 데 이름을 출력할 때 소문자로 출력하시오.

 

select lower(ename), sal

  from emp;

 

3. initcap 함수 ~ 첫문자는 대문자, 나머지는 소문자로 출력

 # 문제 27. 이름을 출력하는데 이름의 첫번째 철자는 대문자로, 나머지는 소문자로 출력하시오.

 

select initcap(ename)

  from emp;

 

4. substr 함수 ~ 문자에서 특정 철자만 출력하는 함수

 # 문제 28. 이름의 첫번째 철자만 소문자로 출력하시오.

 

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

  from emp

 - substr(ename,1,3) 의 의미는 ename의 첫번째 철자부터 3개를 출력하라는 의미이다.

 - 즉 substr(ename,2,2)는 SMITH --> MI 가 된다.

 # 문제 29. 아래의 SQL을 initcap을 쓰지 말고 출력하시오.

select initcap(ename) from emp;

 

select upper(substr(ename,1,1)) || lower(substr(ename,2)) as "initcap(ename)"

  from emp

 # 문제 30. 1981년에 입사한 사원의 이름과 월급과 입사일을 출력하시오.

 

select ename, sal, hiredate

  from emp

  where to_char(hiredate,'RRRR') = '1981';

 

select ename, sal, hiredate

  from emp

  where substr(hiredate,3,2) = '81';

 

5. concat 함수 ~ 두 개의 컬럼의 데이터를 연결해서 출력하는 함수

 # 문제 31. 이름과 월급을 한 컬럼에 합쳐서 출력하시오.

 

select concat(ename, sal)

  from emp;

 

6. length 함수 ~ 철자를 세는 함수

 # 문제 32. 이름과 월급과 이름의 철자 갯수를 출력하는 데 이름의 철자가 많은 사원부터 출력하시오.

 

select ename, sal, length(ename)

  from emp

  order by length(ename) desc;

 

7. instr 함수 ~ 특정 철자의 위치(인덱스)를 출력하는 함수

 # 문제 33. 다음과 같은 이메일이 있다. 이 이메일에서 id만 출력하시오. <컬럼명 email, 릴레이션 emp3>

juf5123@naver.com

poll99@hanmail.com

d9d9ddd123@xerato.com

9977faldco@gmail.com

 

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

  from emp3;

 - instr(email,'@')-1 의 예를 들어 설명하자면 juf5123@naver.com 의 @의 위치는 인덱스로 8로 최종값은 -1을 뺀 7이 된다.

 - 그러면 최종적으로 substr(email,1,<@ 앞까지의 인덱스 값>)이 되어 id만 출력할 수 있다.

 # 문제 34. 위의 릴레이션에서 naver, hanmail, xerato, gmail을 출력하려면 어떻게 해야 하는가?

 

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

  from emp3;

 - instr(email,'.')-instr(email,'@')-1는 '.'과 '@' 갯수의 영문의 철자의 수를 세준다. 직접 해보시길~

 

8. trim 함수 ~ 특정 철자나 공백문자를 잘라내고 출력하는 함수

 # 문제 35. 실습을 위해 다음과 같은 쿼리를 수행한 후에 이름이 JACK인 사원의 이름과 월급을 출력하시오.

insert into emp(empno, ename, sal)

values(2919, 'JACK           ', 4500)

commit;

 

select ename,sal

  from emp

  where trim(ename) = 'JACK';

 

select ename, sal

  from emp

  where rtrim(ename) = 'JACK';

 - trim 함수를 사용할 경우에는 검색속도 매우 느려지기 때문에 가급적 사용하지 않으며 사용된 경우에는 튜닝을 권장

 - rtrim : 오른쪽에 있는 특정 철자나 공백문자를 잘라낸다.

 - ltrim : 왼쪽에 있는 특정 철자나 공백문자를 잘라낸다.

 

9. replace 함수 ~ 특정 철자를 다른 철자로 변경하는 함수

 # 문제 36. 이름과 월급을 출력하는데 숫자 0을 *로 출력하시오.

 

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

  from emp;

 # 문제 37. 이름과 월급을 출력하는데 월급을 출력할 떄 0~3까지의 숫자를 *처리하시오.

 

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

  from emp;

 - '[0-3]'은 정규표현식이다. 나중에 다루니 일단 패스

 

10. lpad, rpad 함수 ~ 문자나 숫자를 출력할 때 양쪽에 원하는 철자를 출력하게 한다.

 # 예시

select ename, lpad(sal, 10,  '*'), rpad(sal, 10, '*') from emp;

 - 총 10칸의 공간에 lpad는 데이터를 오른쪽으로 몰고 남은 칸에 특정 문자를 삽입해서 빈캄을 채운다.