[Database] 데이터 형식(Data Type) & 함수 (1)
데이터 형식(Data Type)
1. 숫자 데이터 형식
2. 문자 데이터 형식
CHAR(10)
H | E | L | L | O |
- 10개의 공간 중 5개 만을 사용했기 때문에 5개의 공간이 남아있음
VARCHAR(10)
H | E | L | L | O |
- 10개 이하의 값보다 적을 경우 그 공간만 사용
- 10개가 넘는 값을 입력할 경우 오류 발생
TEXT
- CHAR과 VARCHAR의 범위보다 큰 데이터를 입력할 때 사용
3. 날짜와 시간 데이터 형식
4. 기타 데이터 형식
함수
1. 형 변환 함수
<ex1-1>
-- 숫자 데이터를 문자 데이터로 형 변환
-- CAST() 함수
SELECT 123456789;
SELECT CAST(123456789 AS CHAR);
<ex1-2>
-- 문자 데이터를 숫자 데이터로 형 변환
-- CAST()함수사용
SELECT CAST('1000000' AS INT)
<ex1-3>
-- 문자 데이터를 날짜 데이터로 형 변환
-- CAST() 함수 사용
-- 중간에 어떤 기호이든, 기호가 없든 변환 가능
SELECT CAST('2024/05/17' AS DATE);
<ex1-4>
-- 숫자 데이터를 날짜 데이터로 형 변환
SELECT CAST(20240517 AS DATE);
<ex2-1>
-- 숫자 데이터를 문자 데이터로 형 변환
-- CONVERT() 함수
SELECT 123456789;
SELECT CONVERT(123456789, CHAR);
<ex2-2>
-- 문자 데이터를 숫자 데이터로 형 변환
-- CONVERT()함수 사용
#문자열 중간에 ,(콤마가 들어가면 불가능)
SELECT CONVERT('1000000', INT);
<ex2-3>
-- ,(콤마)가 있는 문자 데이터를 숫자 데이터로 형 변환
-- CONVERT()함수 사용
-- REPLACE()함수 사용
SELECT CONVERT(REPLACE('1,000,000', ',', ''), INT);
<ex2-4>
-- 숫자 데이터를 날짜 데이터로 형 변환
#1
SELECT CONVERT(20240517154238, DATETIME);
#2
SELECT CONVERT(154238, TIME);
<ex3>
-- FORMAT()함수
#1
SELECT FORMAT(123456789, 0); # 세자리 마다 ,(콤마) 표시
#2
SELECT FORMAT(123456789, 1); # 소숫점 1자리까지 출력
#3
SELECT FORMAT(123456789, 2); # 소숫점 2자리까지 출력
<ex4>
-- birthYear 열의 데이터를 문자 데이터로 형 변환
SELECT NAME,
CONVERT(birthYear, CHAR)
FROM usertbl;
<ex5>
-- bytbl에서 평균 구매 개수를 int형으로 조회
# CAST()함수를 통해 반올림한 int형으로 출력
SELECT CAST(AVG(amount) AS INT)
FROM buytbl;
SELECT *
FROM buytbl;
<ex6>
-- 모든 데이터 타입 변환이 가능한 것은 아님
# 모두 에러가 발생하는 코드
SELECT CAST(2024 AS YEAR);
SELECT CONVERT(2024 AS SMALLINT);
SELECT CAST(2024 AS YEAR);
SELECT CONVERT(2024 AS SMALLINT);
<ex7>
-- 묵시적인 형 변환 실습
SELECT '100' + '200';
#'100'과 '200'을 '100200'으로 합치는 것코드
# CONCAT() 함수를 사용
# SELECT CONCAT('100', '200')
2. 제어 흐름 함수
<ex1>
--제어 흐름 함수 실습
# IF(수식, 참, 거짓)
SELECT IF(100>200, '참', '거짓');
<ex2>
-- 고객 별 전체 구매 개수의 합계 10개 이상인 고객을
-- VIP고객으로, 아닌 고객을 일반고객으로 출력
SELECT userID,
SUM(amount),
IF(SUM(amount) >= 10, 'VIP고객', '일반 고객')
FROM buytbl
GROUP BY userID
<ex3-1>
-- IFNULL()함수
-- IFNULL(수식1, 수식2) 형태
-- 수식 1이 NULL값이면 수식2를 출력
-- 수식 1이 NULL값이 아니면 수식 1을 출력
SELECT IFNULL(NULL, '값이 없음'), IFNULL(100, '값이 없음');
<ex3-2>
# NVL() 함수 == IFNULL()함수
SELECT NVL(NULL, '값이 없음'), NVL(100, '값이 없음');
# NVL2() 함수
# NVL2(수식1, 수식2, 수식3)
# 수식1이 NULL 값이면 수식3을 출력
# 수식1이 NULL 값이 아니면 수식2를 출력
SELECT NVL2(NULL, '값이 있음', '값이 없음'), NVL2(100, '값이 있음', '값이 없음');
<ex3-3>
-- employee 테이블에서 보너스를 0.1f 동결하여 직원명, 보너스율,
-- 동결된 보너스율, 보너스가 포함된 연봉
SELECT emp_name AS "직원명",
IFNULL(bonus, 0) AS "보너스율",
NVL2(bonus, 0.1, 0) AS "동결된 보너스 율",
(salary + salary * NVL2(bonus, 0.1, 0)) * 12 AS "보너스가 포함된 연봉"
From employee
<ex4>
-- buytbl 테이블에서 모든 데이터 출력
-- 단, groupName 열의 값이 NULL인 경우 '없음'으로 표시
SELECT num,
userid,
prodName,
IFNULL(groupname, "없음"),
price,
amount
FROM buytbl
<ex5>
-- NULLIF(수식1, 수식2)
-- 수식1과 수식2가 같으면 NULL 반환
-- 수식1과 수식2가 다르면 수식1 반환
#1
SELECT NULLIF("123", "123");
#2
SELECT NULLIF("123", "456");
<ex6-1>
-- case 연산자
SELECT CASE 10
WHEN 1 THEN "하나"
WHEN 5 THEN "다섯"
WHEN 10 THEN "열"
ELSE "알 수 없음"
END AS "결과";
<ex6-2>
-- employee 테이블에서 직원명, 급여, 급여등급(1~4) 조회
-- 급여가 500만원 초과인 경우 1등급
-- 급여가 500만원이하 350만원 초가인 경우 2등급
-- 급여가 5350만원이하 200만원 초가인 경우 3등급
-- 그 외의 경우 4등급
SELECT emp_name, salary,
CASE
WHEN salary > 5000000 THEN "1등급"
WHEN salary > 3500000 THEN "2등급"
WHEN salary > 2000000 THEN "3등급"
ELSE "4등급"
END AS "등급"
FROM employee
;
-- grade로 group by
SELECT grade,
COUNT(*) AS grade_count,
MIN(salary) AS min_salary,
MAX(salary) AS max_salary,
AVG(salary) AS avg_salary
FROM (
SELECT emp_name,
salary,
CASE
WHEN salary > 5000000 THEN "1등급"
WHEN salary > 3500000 THEN "2등급"
WHEN salary > 2000000 THEN "3등급"
ELSE "4등급"
END AS "grade"
FROM employee
) AS grade_table
GROUP BY grade
ORDER BY grade_count DESC;
3. 문자열 함수
<ex1>
-- ASCII() : 문자의 아스키 코드 반환
SELECT ASCII('A') AS "A ASCII CODE" , ASCII('a') AS "a ASCII CODE";
<ex2>
-- CHAR() 함수 : 아스키코드값에 해당하는 문자 반환
SELECT CHAR(65) AS "65" , CHAR(97) AS "97";
<ex3>
-- BIT_LENGTH(), CHAR_LENGTH(), LENGTH() 함수
-- MariaDB는 기본적으로 UTF-8 코드를 사용하기 때문에
-- 영문은 1Byte를, 한글은 3byte를 할당
#1
SELECT BIT_LENGTH("abc"), CHAR_LENGTH("abc"), LENGTH("abc");
#2
SELECT BIT_LENGTH("가나다"), CHAR_LENGTH("가나다"), LENGTH("가나다");