일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 백준 4358번
- 깃허브 토큰 인증
- 딥러닝
- 네트워크
- SQL
- 백준 4949번
- 모두를 위한 딥러닝
- 데이터베이스
- HTTP
- 팀플회고
- 문자열
- 모두를위한딥러닝
- 자바
- 백준 5525번
- 백준
- 리액트 네이티브 프로젝트 생성
- 백준 4358 자바
- 리액트 네이티브 시작하기
- 깃 연동
- 리액트 네이티브
- 스터디
- 지네릭스
- 깃허브 로그인
- 깃 터미널 연동
- 정리
- 데베
- 머신러닝
- 모두의 네트워크
- React Native
- 모두의네트워크
- Today
- Total
솜이의 데브로그
13-15강 ) 문자열, 날짜, CASE문 본문
Reference : SQL 첫걸음
13강 ) 문자열 연산
1. 문자열 결합
문자열 결합 연산자
연산자/함수 | 연산 | 데이터베이스 |
+ | 문자열 결합 | SQL Server |
|| | 문자열 결합 | Oracle, DB2, PotgreSQL |
CONCAT | 문자열 결함 | MySQL |
- 문자열을 결합하는 연산자는 데이터베이스 제품마다 방언이 있다.
- 문자열 결합은 2개의 열 데이터를 모아 1개의 열로 처리하고 싶은 경우에 사용한다.
ex) 문자열형인 unit 열과 INTEGER 형의 quantity열을 CONCAT 함수를 이용해 결합.
SELECT CONCAT(quantity, unit) FROM sample35;
문자열로 결합한 결과는 문자열형이 된다.
2. SUBSTRING 함수
- 문자의 일부분을 계산해서 반환
- 예) 연월일을 YYYYMMDD 와 같은 형식의 문자열로 데이터로 저장한 경우 따로 추출
- SUBSTRING('20140125001', 1, 4) → '2014'
3. TRIM 함수
- 문자열의 앞뒤로 여분의 스페이스가 있을 경우 제거
- 고정길이 문자열형에 대해 많이 사용
- 인수를 지정함으로써 스페이스 이외의 문자를 제거할 수 있다.
- TRIM('ABC ') → 'ABC'
4. CHARACTER_LENGTH 함수
- 문자열의 길이를 계산해 반환 (문자 단위)
- VARCHAR 형의 길이 계산 가능.
- OBJECT_LENGTH 함수는 문자열의 길이를 바이트 단위로 계산해 반환
- EUC-KR, UTF-8 등의 인코딩 방식에 따라 한 문자가 몇 바이트인지 쓰이는 문자세트마다 다른 것을 알 수 있다.
- 따라서 바이트 단위로 길이를 계산하는 OBJECT_LENGTH 함수 사용시 주의해야한다.
★ 문자열 데이터의 길이는 문자 세트에 따라 다르다!
14강 ) 날짜 연산
날짜, 시간 데이터를 저장하는 방법은 데이터베이스 제품에 따라 다르다.
1. SQL에서의 날짜
시스템 날짜
표준 SQL에서는 'CURRENT_TIMESTAMP' 라는 함수로 실행했을 때의 기준으로 시간을 표시한다.
SELECT CURRENT_TIMESTAMP;
날짜 서식
날짜 데이터는 서식을 지정할 수 있으며, 날짜 서식은 국가별로 다르다.
한국에서는 보통 연월일을 슬래시나 하이픈으로 구분해 표기
- YYYY/MM/DD
- YYYY-MM-DD
- 25 Jan 2014 (미국식)
Oracle의 경우 TO_CHAR 함수를 이용해 문자열 데이터로 출력 가능하다.
2. 날짜의 덧셈과 뺄셈
날짜시간형 데이터는 기간형 수치 데이터와 덧셈 및 뺄셈을 할 수 있다.
SELECT CURRENT_DATE + INTERVAL 1 DAY;
CURRENT_DATE는 시스템 날짜의 날짜만 확인하는 함수다. INTERVAL 1 DAY는 '1일 후'라는 의미의 기간형 상수이다.
날짜형 간의 뺄셈
두 날짜 사이에 차이가 얼마나 발생하는지 계산할 수 있다.
MySQL 에서는 DATEDIFF('2014-02-28', '2014-01-01') 로 계산할 수 있다.
15강 ) CASE문으로 데이터 변환하기
1. CASE문
사용자 정의 함수를 작성하지 않고도 CASE 문으로 처리 가능
CASE WHEN 조건식1 THEN 식1
[WHEN 조건식2 THEN 식2 ...]
[ELSE 식3]
END
- WHEN 에는 참과 거짓을 반환하는 조건식을 기술
- 조건식이 참이 되는 경우에는 THEN 절에 기술한 식 처리.
- WHEN 절의 조건식을 차례로 평가하다가 가장 먼저 조건을 만족한 WHEN ㅓㅈㄹ과 대응하는 THEN 절 식의 처리결과를 CASE문의 결괏값으로 반환.
- ELSE 절은 생략 가능하며 생략했을 경우 'ELSE NULL'로 간주된다.
SELECT a, CASE WHEN a IS NULL THEN 0 ELSE a END "a(null=0)" FROM sample37;
결과) CASE로 NULL값 0으로 변환하여 a(null=0) 열 출력
a | a(null=0) |
1 | 1 |
2 | 2 |
NULL | 0 |
COALESCE
위의 예제처럼 NULL값을 변환하는 경우는 COALESCE 함수를 구현하면 더 쉽다.
SELECT a, COALESCE(a,0) FROM sample37;
여러개의 인수를 지정할 수 있으며, 주어진 인수 가운데 NULL이 아닌 값에 대해서는 가장 먼저 지정된 인수의 값을 반환한다.
2. 또 하나의 CASE문
- 문자화하는 것을 '디코드' 라 부르고
- 수치화 하는 것을 '인코드' 라 부른다.
디코드를 CASE문으로 처리한 경우 예시
WHEN a=1 THEN '여자'
WHEN a=2 THEN '남자'
검색CASE : 위에서 설명한 것들
단순 CASE : 'CASE 식 WHEN 식 THEN 식 ...' 구문
- 식1의 값이 WHEN의 식2의 값과 동일한지 비교하고, 값이 같다면 식3의 값이 CASE문 전체의 결괏값이 된다.
- 값이 같지 않다면 그 뒤에 기술한 WHEN 절과 비교
성별 문자열을 디코딩하는 예시
(1) 검색 CASE
SELECT a AS "코드",
CASE
WHEN a=1 THEN '여자'
WHEN a=2 THEN '남자'
ELSE '미지정'
ELSE AS "성별" FROM sample37;
(2) 단순 CASE
SELECT a AS "코드",
CASE a
WHEN 1 THEN '여자'
WHEN 2 THEN '남자'
ELSE '미지정'
END AS "성별" FROM sample37;
단순 case를 사용한 경우 CASE문에서 비교할 항목인 'a'를 따로 지정하므로 WHEN에는 1,2처럼 비교할 값만 기술한다.
3. CASE를 사용할 경우 주의 사항
ELSE
- ELSE를 생략하면 ELSE NULL이 되는 것에 주의하자.
- ELSE를 생략하면 상정한 것 이외의 데이터가 왔을 때 ULL이 반환되므로, CASE문의 ELSE는 생략하지 않는 편이 좋다.
WHEN에 NULL 지정하기
- 단순 CASE문에서는 WHEN 절에 NULL 사용하면 =으로 비교하므로 정상적으로 처리되지 않는다.
- 따라서 NULL 값인지 아닌지를 판정하기 위해서는 IS NULL을 사용해야 한다.
- CASE문 특성상 = 연산자로 비교하는 만큼, NULL 값인지 판정하려면 검색 CASE문을 사용해야 한다.
★ 단순 CASE문으로는 NULL 값을 비교할 수 없다!
DECODE NVL
- Oracle에서는 DECODE 함수가 내장되어 있으며, CASE문과 같은 용도로 사용할 수 있다.
- NULL 값을 반환하는 Oracle의 NVL함수, SQLServer의 ISNULL 함수 등이 있다.
- 위의 함수들은 특정 데이터베이스에 국한된 함수이므로 NULL값을 변환할 때는 표준 SQL로 규정되어 있는 COALESCE 함수를 사용하는 것이 좋다.
'CS > Database' 카테고리의 다른 글
16-19강 : 데이터의 추가, 삭제, 갱신 (0) | 2021.10.31 |
---|---|
6장 ) SQL문의 기본 : Select (0) | 2021.10.31 |
5장 ) DBMS 기본지식 (0) | 2021.10.28 |
11, 12강 ) LIMIT, 수치 연산 (0) | 2021.10.14 |
4장 ) 데이터베이스와 아키텍처 구성(2) (0) | 2021.10.13 |