[데이터분석/SQL] 기초 QUERY 공부(2) 단일행 함수 (2024)

데이터분석

[데이터분석/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 이 글에 댓글 단 블로거 열고 닫기

인쇄

[데이터분석/SQL] 기초 QUERY 공부(2) 단일행 함수 (2024)
Top Articles
Latest Posts
Recommended Articles
Article information

Author: Saturnina Altenwerth DVM

Last Updated:

Views: 6193

Rating: 4.3 / 5 (44 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Saturnina Altenwerth DVM

Birthday: 1992-08-21

Address: Apt. 237 662 Haag Mills, East Verenaport, MO 57071-5493

Phone: +331850833384

Job: District Real-Estate Architect

Hobby: Skateboarding, Taxidermy, Air sports, Painting, Knife making, Letterboxing, Inline skating

Introduction: My name is Saturnina Altenwerth DVM, I am a witty, perfect, combative, beautiful, determined, fancy, determined person who loves writing and wants to share my knowledge and understanding with you.