데이터분석
[데이터분석/SQL] 기초 QUERY 공부(2) 단일행 함수
바네바K ・ 2023. 11. 20. 10:00
URL 복사 이웃추가
본문 기타 기능
신고하기
단일행 함수: 단일한 값을 입력받아 단일한 값을 출력하는 함수
다중행 함수: 다중의 값을 입력받아 단일한 값을 출력하는 함수
단일행 함수
구분 | 함수명 | 설명 |
문자함수 | UPPER( column명) LOWER( column명) | 문자 모두 대문자로 출력 (예시: select upper(column명) ) 문자 모두 소문자로 출력 (예시: select lower(column명) ) |
INITCAP( column명) | 첫 문자는 대문자, 나머지는 소문자로 출력할 때 (예시: select initcap([열1]) ) | |
SUBSTR(column명,n, m) | n번째 문자부터 m개를 추출함(substring 추출하기) (예시: substr('vannevar',1,2) -> 결과: Va ) * 특정 단어만 추출하고 싶은 경우 FROM 뒤에 테이블명이 아닌 dual(가상의 테이블 구성)을 적어야 함. 테이블명을 적을 경우 테이블의 행 갯수 n 만큼 동일한 값이 (n,1)으로 적힐 것) | |
INSTR(column명 또는 '문장','단어' ) | '문장' 내에서 '단어'가 가장 처음 출현한 위치의 자릿 수를 출력함. (예시: instr('VANNEVAR','V') -> 결과: 1) | |
LENGTH( ) | 철자 길이를 출력하는 함수 예시) select length('VANNEVAR') from dual; -> 결과 8 | |
REPLACE(column명 또는 '문자열', '기존 문자열', '변경할 문자열') | 특정 문자열를 다른 문자열로 변경하는 함수 예시) select replace('HELLO WORLD','HELLO','GOODBYE') from dual; -> 결과: GOODBYE WORLD | |
CONCAT('문자열1','문자열2') | 문자열끼리 합치는 함수 예시) select concat('Hello ','World') from dual; -> 결과: Hello World | |
LPAD(column명, n, '문자') RPAD | 총 n개의 자릿 수 중 남은 자리를 '문자'로 채우는 것 (LPAD는 왼쪽부터 '문자'를 채워넣고, RPAD는 오른쪽부터 채워넣음) 예시6 참고 | |
LTRIM(column명, '문자') RTRIM(column명, '문자') TRIM('문자' FROM column명) | 특정 '문자' 잘라내기 (L= 왼, R = 오, TRIM = 양쪽) '문자'를 입력하지 않으면 공백을 잘라낸다. 예시) SELECT LTRIM('$3,000','$') -> 결과 : 3,000 예시) SELECT RTRIM('3,000원','원') -> 결과 : 3,000 예시) SELECT TRIM('돈' FROM '돈3,000돈') -> 결과 : 3,000 예시) SELECT TRIM(' VANNEVAR ') -> 결과: VANNEVAR | |
숫자함수 | ROUND(column명, n) | 소수점 n번째 자리에서 반올림 예시) select round(1234.5678, -1) from dual; -> 결과: 1230 예시) select round(1234.5678) from dual; -> 결과: 1235 예시) select round(1234.5678, 1) from dual; -> 결과: 1234.6 |
TRUNC(column명, n) | 소수점 n번째 자리 뒤는 다 버림 예시)select trunc(1234.5678, 1) from dual; -> 결과: 1234.5 | |
MOD(column명,n) | n으로 나눈 나머지 값 출력하기 예시) select mod(10,3) from dual; -> 결과: 1 | |
날짜함수 | MONTHS_BETWEEN(최근날짜, 과거날짜) | 과거부터 최근까지 총 몇달이 지났는지 계산해주는 함수 예시) 입사 후 오늘까지 총 몇년을 근무했는지 정수로 반올림하여 출력하라 답: select round(months_between(sysdate, hiredate)/12) *sysdate = 오늘날짜 |
ADD_MONTHS(기준날짜, n) | 기준날짜로부터 n개월 뒤 날짜를 출력하는 함수 | |
NEXT_DAY(기준날짜,찾는요일) | 기준날짜로부터 바로 돌아오는 찾는요일의 날짜를 계산하는 함수 예시) select next_day(sysdate, '월') from dual; * 만약 nls_date_language가 한국어로 설정되어 있으면 영문 'mon','monday'등은 지정한 요일이 부적합하다며 에러가 남. 영문으로 사용하고 싶으면 alter session set nls_date_language = 'american'; 을 먼저 입력해야 함. | |
LAST_DAY(기준날짜) | 특정 날짜가 있는 달의 마지막 날짜 출력하는 함수 예시) select last_day('21/05/05') from dual; -> 결과: 21/05/31 | |
변환함수 | TO_DATE(날짜, 포맷) | 날짜를 원하는 포맷으로 데이터 유형 변환하기 예시) to_date('2023/11/20','YY/MM/DD') * 현재의 날짜 형식 확인하기: select * from nls_session_parameters; * 현재 세션의 날짜 형식 바꾸기: alter session set nls_date_format = '원하는 포맷'; 날짜 포맷 년도: YYYY, YY 월 : MM 일: DD 요일: DAY, DY |
TO_NUMBER(column명) | 숫자형으로 데이터 유형 변환하기 예시) to_number('100') | |
TO_CHAR(column명, 포맷) | 문자형으로 데이터 유형 변환하기 예시) select name, to_char(birthday,'day'), to_char(salary, '999,999'), to_char(date, 'YYYY') 예시) select to_char(to_date('01/01/01','RR/MM/DD'),'day') from dual; | |
일반함수 | NVL(column명, 지정값) | NULL 값 대신 지정값을 반환하는 함수 *만약 column의 값과 지정값의 데이터 유형이 서로 다르면 에러가 난다, 이때 to_char이나 to_number 등을 이용해 적절히 변경해주면 된다. |
NVL2(column명, 지정값1, 지정값2) | NULL값이 아니면 지정값1을, NULL값이면 지정값2를 반환하는 함수 | |
CASE when column명 조건1 then 결과1 when column명 조건2 then 결과2 ... else 나머지의결과값 end | if문을 구현함(비교연산도 가능) | |
DECODE(column명, 조건1, 결과1, 조건2, 결과2, 조건3, 결과3,....나머지에대한 결과) | if 문을 구현함(등가연산만 가능하고 비교연산이 안됨) 예시) select decode(gender, 'F','Female','Male') 은 가능하지만 select decode(salary, salary> 1, 'has job','jobless')는 불가능함. |
* SQL은 IF문을 사용하지 못함. 그러나 decode함수, case 함수를 통해 if문과 유사한 결과를 낼 수 있음.
예시 문제
예시1) 'Vannevar'의 이름과 나이를 추출할 때, 이름을 소문자로 검색해도 결과값이 나오도록 하려면?
답:
SELECT name, age
FROM peoplelist
WHERE LOWER(name) = 'vannevar';
예시2) 명단의 이름을 출력할 때, 이름의 첫글자만 출력하고 첫글자를 소문자로 출력하라
답:
select LOWER(SUBSTR(name,1,1)) from namelist;
또는
select SUBSTR(LOWER(name),1,1) from namelist;
예시3) 이름의 철자가 6 이상인 학생들의 이름을 출력하라
답: SELECT name FROM namelist WHERE LENGTH(ename) >=6;
예시4) 이름에 철자 V가 들어간 학생들의 이름을 알파벳 순으로 출력하라.
답: SELECT name FROM namelist WHERE INSTR(name,'V') > 0 ORDER BY name ASC;
예시5) 이름과 월급을 출력할 때 숫자 0~3까지는 *로 출력되게 하라.
답: select name, regexp_replace(salary, '[0-3]', '*') from employeelist;
* regexp_는 정규식 함수로, 뒤에 사용할 함수명을 입력하면 원하는 값이 출력된다.
예시6) 이름과 월급을 출력할 때 월급 column의 자릿수를 10자리로 하고, 월급을 출력하고 남은 나머지 자리에 별표(*)를 채워 출력해보라.
답: select name, LPAD(salary, 10, '*') from employeelist;
예시7) 00년생 찾기
답: where birthday between to_date('2000/01/01','YY/MM/DD') and to_date('2000/12/31','YY/MM/DD')+1
(더하기 1을 하는 이유는 날짜의 기준이 00:00:00 시 까지이기 때문. )
예시8) 아래의 쿼리문은 실행이 되는가(O,X)
(1) select salary from emp where salary = '3000';
답: (O) 오라클에서 암시적으로 salary='3000'의 문자를 숫자로 바꿈. 그래서 실행 가능 . 그래도 에러 가능성 있기에 가급적 숫자로 쓸 것.
위 내용을 보면 sal=3000을 자동으로 숫자로 변환한 것을 볼 수 있다.
(2) select salary from emp where sal like '30%';
답: (O) 오라클에서 salary열의 값들을 숫자에서 문자로 바꿈.
sal열의 모든 값을 문자로 바꿨다는 뜻
예시9) 이름, 거주지역, 수도권여부를 출력하는데 거주지역이 서울 또는 경기이면 수도권여부를 'Y'로, 아닐 경우 'N'로 출력하라.
답) select name, address, decode(address, '서울','Y','경기','Y','N') as "cap_region" from table;
예제10) 전공이 '컴공' 또는 '전전'인 학생들의 이름, 점수, 그리고 등급을 출력하는데
시험지를 채점할 때 점수가 90점 이상이면 'A'를 주고, 80점 이상이면 'B'를 주고, 70점 이상이면 'C'를 주고, 나머지는 '재수강'을 출력하라.
답) select name,score, case when score >=90 then 'A'
when score >=80 then 'B'
when score >=70 then 'C' else '재수강' end
as "grade"
where major in ('컴공','전전')
from table;
댓글3 이 글에 댓글 단 블로거 열고 닫기
인쇄