MySql - 단일행 함수2 (null, conversion)

Agnes Park·2022년 3월 20일
0

DATABASE

목록 보기
8/9

1. null 관련 단일행 함수

null 처리 함수

  • null 을 허용하는 필드에 대해서 연산이 이루어질 경우 매우! 주의해야 한다.
  • null 은 연산에서 빠지기 때문이다! (단일행 함수및 일반 연산)

IFNULL / ISNULL / if 함수

  • IFNULL : NULL값을 만나면 다른 값으로 치환해서 출력하는 함수
  • ISNULL : NULL 인지 체크하는 함수 (null 이면 1, 아니면 0 리턴)
  • IF : 첫번째 인자가 true 이면 두번째 값을, false 이면 세번째 값!

[예시]

SELECT 
bonus, isnull(bonus), ifnull(bonus, 0), if(isnull(bonus), 0, bonus) 
FROM t_professor;

[SingleRow2_Null.sql]

SELECT * FROM t_professor;

-- null 값과의 연산 결과는 언제나 null 이다
SELECT name, pay, bonus, pay + bonus
FROM t_professor;

# IFNULL : NULL값을 만나면 다른 값으로 치환해서 출력하는 함수
# ISNULL : NULL 인지 체크하는 함수 (null 이면 1, 아니면 0 리턴)
# IF : 첫번째 인자가 true 이면 두번째 값을, false 이면 세번째 값!


SELECT bonus, ifnull(bonus, 0), isnull(bonus), if(bonus, bonus, 0)	-- null값은 거짓판정
FROM t_professor;


SELECT name, pay, bonus, pay + ifnull(bonus, 0) "총지급액"
FROM t_professor;

2. 형변환 단일행 함수

1. MySQL 데이터 타입

https://dev.mysql.com/doc/refman/8.0/en/data-types.html

2. 묵시적(자동)변환

SELECT 1 + '1';

숫자로 된 ‘문자’ 는 산술 연산시 자동적으로 숫자로 변환해준다
실제로는 아래와 같은 형변환 함수가 호출되는 거다

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

3. 형변환 함수 : CAST, CONVERT

4. DATE_FORMAT() 함수 (날짜 → 문자)

5. 숫자 콤마 찍기

[SingleRow3_Conversion.sql]

-- java 1 + "1" => "11"

# MYSQL 은 필요시 string -> number, 혹은 number -> string 으로 묵시적 형변환 수행
SELECT 1 + '1';	-- 2 (숫자)
SELECT concat(1, '1');	-- '11' (문자)

-- 실제로는 아래와 같이 동작
SELECT 1 + CAST('1' AS SIGNED);

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


-- 명시적 형변환
-- CAST(expr AS type)
-- CONVERT(expr, type)

SELECT 38.8, CAST(38.8 AS CHAR);

# BINARY[(N)]
# CHAR[(N)] [charset_info]
# DATE
# DATETIME
# DECIMAL[(M[,D])]
# JSON
# NCHAR[(N)]
# SIGNED [INTEGER]
# TIME
# UNSIGNED [INTEGER]

# 시간 -> SIGNED 타입
SELECT CAST(now() AS SIGNED);
SELECT CONVERT(now(), SIGNED);

# 숫자 -> 날짜타입
SELECT CAST(20210801 AS DATE);

# 숫자 -> 문자열 타입
SELECT CAST(20200221030330 AS CHAR);

#-------------------------------------------------------------------------
# 참고 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
 
# DATE_FORMAT() 함수

SELECT date_format(now(), '%Y%m%d');
SELECT date_format(now(), '%Y-%m-%d %H:%i:%s');
SELECT date_format(now(), '%Y년%m월%일 %H시 %i분 %s초');

SELECT YEAR(now()), MONTH(now()), DAY(now()), weekday(now())
	, HOuR(now()), MINUTE(now()), SECOND(now());

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

# 4302 (실습)
# t_student 테이블의 생일(birthday) 이 3월인 학생의 이름(name) 과 생일(birthday) 를
# 다음과 같은 형식으로 출력하세요 (DATE_FORMAT 사용)

SELECT name, date_format(birthday, '%Y-%d-%m') 생일
FROM t_student
WHERE month(birthday) = 3
;


# 숫자 세자리마다 콤마 찍기
SELECT 1234567, format(1234567, 0)
;


# 4304
# 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;

0개의 댓글

관련 채용 정보