2.1 (단일행 함수) 문자 함수
※ 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는 데이터를 오른쪽으로 몰고 남은 칸에 특정 문자를 삽입해서 빈캄을 채운다. |