본문 바로가기
DBMS

8. 단일행 함수 : Single - Row Function

by suehyune12 2022. 3. 10.

 

1. 단일행 함수 & 그룹 함수 정의

 

 

 

 

단일행 함수(Single-Row Function)는 테이블 데이터에 여러개(레코드)에

각각 적용’되어, 산출

 

 

 

 

 

 

 

그룹함수(Aggregate Function) 는 여러 개(레코드) 를 동시에 입력받아 ‘한개의 결과값’ 산출

 

 

 

 

2.  단일행 함수 종류

 

 

 

 

 

 

 

 

 


 

  • lower( ), upper( )

 

 

 

lower( ) : 소문자 출력

upper( ) : 대문자 출력

 

 

 

 

 

 실습 : t_student 테이블 : 1전공(deptno1) 이 201번인 학생들의 ID를 이름과 함께 소문자, 대문자로 출력 / upper() 사용

SELECT name, id, lower(id) 소문자, upper(id) 대문자

FROM t_student WHERE deptno1 = 201;

 

전공 1 에서 201번 학생들의 이름과 id를 소문자, 대문자로 출력

 

  • concat(문자열, 문자열, ........)

 

 

 

전공이 101번인 교수님의 이름과 직위를 출력

교수님의 이름과 직위를 연결해서 한번에 출력하고 싶다면,

concat( )을 사용한다.

 

 

 

 

 

 

 

 

concat( name, POSITION )을 사용하여 교수님의 이름과 직위를 붙여서 출력 가능하다.

만약, 이름과 직위를 띄어쓰기 하고 싶다면, ' ' 를 사용한다

SELECT concat( name, ' ' , POSITION ) FROM t_professor WHERE deptno = 101;

 

 

 

  •  SUBSTR 함수

SUBSTR( ‘문자열’ 또는 컬럼명,  시작위치,  추출할 글자수 )

문자열에서 특정 길이의 문자를 추출할 때 사용하는 함수

 

 

시작 인덱스가 1부터 시작한다 (인덱스는 1부터 시작)

ABCDE에서 2번째부터 3개의 문자의 추출 :  BCD

 

 

 

 

 

ABCDE에서 20번째부터 3개의 문자 추출 : EMPTY 문자열

에러도 아니고, NULL도 아니다.

 

 

 

 

시작위치, 음수 가능하다.

ABCED에서 -2번째부터 2개의 문자 추출 :   뒤에서 -1부터 시작해서 DE 출력

 

 

 

 

 

실습: t_student 테이블에서 jumin이 3번째부터 2개의 문자가 08인 학생들의 이름과,

jumin 1번째부터 6개의 문자인 생년월일 출력 / substr( ) 사용

 

SELECT name, substr(jumin, 1, 6) 생년월일

FROM t_student  WHERE substr(jumin, 3, 2) = '08';

 

 t_student 테이블에서 jumin이 3번째부터 2개의 문자가 08인 학생들의 이름과, jumin 1번째부터 6개의 문자인 생년월일 출력




 

3. null 함수

 

 

 

 

null 값과의 연산 결과는 언제나 null이다. 

 

 

 

 

 

  • IFNULL( )

NULL값을 만나면 다른 값으로 치환해서 출력하는 함수

  • ISNULL( )

NULL 인지 체크하는 함수 (null 이면 1, 아니면 0 리턴)

  • IF( )

첫번째 인자가 true 이면  두번째 값을, false 이면 세번째 값

 

 

IFNULL( bonus, 0) = bonus가 null값이면 0으로 출력

ISNULL(bonus) = bonus가 null이면 1, 아니면 0 출력

IF( bonus, bonus, 0) = bonus가 null이 아니면 두번째값인                                      bonus출력, null이면 0출력

 

 


4. 묵시적(자동)변환

 

 

SELECT 1 + '1'; 

 

숫자로 된 ‘문자’ 는 산술 연산시 자동적으로 숫자로 변환해준다.

실제로는 아래와 같은 형변환 함수가 호출되는 거다

 

SELECT 1 + CAST('1' AS SIGNED);



 

 

묵시적 형변환은 편한것 같지만,  튜닝에서 뜻하지 않은 성능저하를 가져올수 있다.

 

 

5. 명시적 형변환

  • CAST(expr AS type)
  • CONVERT(expr, type)

 

 

 

 

 

 

 

 

 

 

시간을 SIGNED타입으로 변환

(2022-02-21 20:13:50 → 20220221201350)

 

숫자를 날짜 타입으로 변환

(20210801  →  2021- 08-01)

 

숫자를 문자열 타입으로 변환

(20200221030330 → 20200221030330)

 

 

 

  • DATE_FORMAT( ) 함수

날짜나 시간을 문자 타입으로 변환

 

 

 

 

weekday() : 월요일 0, 화요일 1 .....

 

 

 

 

실습 : t_student 테이블의 생일(birthday)이 3월인 학생의 이름(name)과

        생일(birthday)를  다음과 같은 형식으로 출력하세요

 

 

 

SELECT name, date_format(birthday, '%Y-%m-%d') 생일

FROM t_student WHERE month(birthday) = 3;

 

t_student 테이블의 생일(birthday)이 3월인 학생의 이름(name)과 생일(birthday)

 

  • 숫자 세자리마다 콤마 찍기

SELECT 1234567, format(1234567, 0);

 

 

 

 

 

 

 

 

 

실습: t_professor 테이블에서 2000년 이전에 입사한 교수명과 입사일,         현재 연봉과 10% 인상 후 연봉을 아래와 같은 양식으로 출력
       연봉은 보너스(bonus)를 제외한 pay * 12 로 계산하고
       연봉과 인상후 연봉은 천단위 구분 기호를 추가하여 출력하세요

 

 

 

 

SELECT name, date_format( hiredate, '%Y-%m-%d') 입사일,

format(pay * 12, 0) 연봉, 

format((pay * 12) + 1.1, 0) 인상후

FROM t_professor WHERE YEAR(hiredate) < 2000;

 

 


 

6. 숫자 단일행 함수

 

  • ROUND( ) : 반올림 함수

 

 

12

13

12.54

일의 자리에서 반올림 = 20

 

 

 

  • TRUNCATE( ) : 자르는 함수

 

 

12

12.34

10

 

 

 

  • MySQL은 % 연산자 없다 
    MOD( ) : 나머지 연산 함수

 

 

12 / 10 = 1 ... 2

12.6 / 4.1 = 3 ... 0.3

 

 

 

 

  • POWER( ) : 제곱

 

9

-27

0.01

1.4142135624

 

 

 


날짜 함수

 

 

 

 

 

 

date타입이 정수 변환한뒤

+1 산술연산 수행

 

 

  •  날짜 더하고 빼기

 

 

DATE_ADD(date, INTERVAL 계산수 계산형식)
DATE_SUB(date, INTERVAL 계산수 계산형식)
계산형식 = 월,일,시간 중 어떤걸 더할꺼냐를 선택

 

 

 

 

  • 날짜 차이 계산
  • 단위
    -- SECOND : 초
    -- MINUTE : 분
    -- HOUR : 시
    -- DAY : 일
    -- WEEK : 주
    -- MONTH : 월
    -- QUARTER : 분기
    -- YEAR : 연

 

 

DATEDIFF(날짜1, 날짜2);  = 일 차이

 

TIMESTAMPDIFF(단위, 날짜1, 날짜2);

= 연, 분기, 월, 주, 일, 시, 분, 초  .. 차이
 

 

 

 

 

실습:  t_professor 테이블에서 오늘(now())을 기준으로 

근속연수, 근속개월,  근속일를 계산해서 출력

(날짜양식은 YYYY-MM-DD)

 

 

 

 

 

 

SELECT

name "이름",

date_format(now(), '%Y-%m-%d') "오늘", 
date_format(hiredate, '%Y-%m-%d') "입사일",
TIMESTAMPDIFF(YEAR, hiredate, now()) "근속연수",
TIMESTAMPDIFF(MONTH , hiredate, now())"근속개월",
TIMESTAMPDIFF(DAY , hiredate, now()) "근속일"

FROM t_professor;

'DBMS' 카테고리의 다른 글

10. Join & Sub Query  (0) 2022.03.13
9. 그룹 함수 : Aggregate Function  (0) 2022.03.13
7. DCL : Commit & Rollback  (0) 2022.03.08
6. MySQL : 연산자, ORDER BY  (0) 2022.02.28
5. MySQL : DISTINCT, CONCAT, WHERE  (0) 2022.02.23