SQL
2022. 11. 27. 15:39
7장 데이터 생성, 조작과 변환
SQL 문에서 어떻게 데이터가 생성되고 조작되는지 알아본다.
문자열 데이터 처리
먼저 다음 테이블을 생성하자.
CREATE TABLE string_tbl(
char_fld CHAR(30),
vchar_fld VARCHAR(30),
text_fld TEXT
);
문자열 생성
가장 간단한 방법은 문자열을 따옴표로 묶는 것이다.
INSERT INTO string_tbl (char_fld, vchar_fld, text_fld)
VALUES (
'This is char data',
'This is vchar data',
'This is text data'
);
MySQL 6.0 이후 기본 모드는 'strict'모드이다.
문자열이 길어지면 바로 예외를 발생시킨다.
이전 버전에서는 문자열을 최대 크기로 자르고 경고만 생성했다.
이전 버전처럼 하려면 ANSI 모드를 선택해야 한다.
SELECT @@session.sql_mode;
SET sql_mode = 'ansi';
SELECT @@session.sql_mode;
작은 따옴표 포함
이스케이프 문자를 사용해주자.
doesn't의 아포스트로피 바로 앞에 작은 따옴표를 하나 더 추가하면 된다.
오라클, MySQL의 경우 백슬래시(\)를 추가해줘도 된다.
추가해준 이스케이프 문자까지 보고싶다면
MySQL의 quote() 내장함수를 사용해보자.
SELECT quote(text_fld) FROM string_tbl;
특수 문자 포함
ASCII 캐릭터셋의 값을 이용해보고 싶다면 char() 함수를 사용해보자.
SELECT 'abcdefg', CHAR(97, 98, 99, 100, 101, 102, 103);
만약 2번째 열에서 abcdefg가 안나온다면,
만약 2번째 열에서 abcdefg가 안나온다면,
서버의 환경변수 값을 변경해줘야 한다.
현재 환경변수 값을 조회해보자.
SHOW VARIABLES LIKE 'character_set_%';
// 또는
status
클라이언트/Conn. 캐릭터셋이 utf-8이 아닐 것이다.
1.
세션이 유지되는 동안만 바꾸는 방법은 아래 명령어를 입력해주는 것이다.
SET NAMES utf8;
2.
반영구적인 변경 방법은 my 파일을 수정하는 것이다.
(Windows는 my.ini이다. Linux는 my.cnf이다.)
아래 태그들을 하나씩 찾아가며 값을 추가하거나 수정해주자.
[mysqld]
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8
collation-server = utf8_general_ci
[client]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
문자열 조작
먼저 string_tbl을 비우고 새 값을 집어넣자.
DELETE FROM string_tbl;
INSERT INTO string_tbl (char_fld, vchar_fld, text_fld)
VALUES (
'This string is 28 characters',
'This string is 28 characters',
'This string is 28 characters'
);
숫자를 반환하는 문자열 함수 (173쪽 참고)
함수 | 반환값 및 동작 |
length() | 문자열 길이 |
position() | 부분 문자열 위치, 없으면 0을 반환 |
locate() | 특정 위치에서 시작하여 부분 문자열 위치 검색 |
strcmp() | 두 문자열의 전후 순서 |
문자열을 반환하는 문자열 함수 (178쪽 참고)
함수 | 반환값 및 동작 |
concat() | 문자열 이어 붙이기 |
insert() | 문자열 위치에 다른 문자열 삽입 |
replace(), stuff() | 문자열 대체 |
substring() | 부분 문자열 추출 |
숫자 데이터 처리
산술 함수 (183쪽 참고)
함수 | 반환값 및 동작 |
acos(x) | x의 아크 코사인 값 |
asin(x) | x의 아크 사인 값 |
atan(x) | x의 아크 탄젠트 값 |
cos(x) | x의 코사인 값 |
cot(x) | x의 코탄젠트 값 |
exp(x) | e^x 값 |
ln(x) | x의 자연 로그 값 |
sin(x) | x의 사인 값 |
sqrt(x) | x의 제곱근 값 |
tan(x) | x의 탄젠트 값 |
함수 | 반환값 및 동작 |
mod() | 나머지 값 |
pow() | 제곱 값 |
숫자 자릿수 관리 (185쪽 참고)
함수 | 반환값 및 동작 |
ceil() | 가장 가까운 정수로 올림 |
floor() | 가장 가까운 정수로 내림 |
round() | 소수점 n번째 자리에 맞춰 반올림 |
truncate() | 소수점 n번째 자리에 맞춰 버림 |
Signed 데이터 처리 (188쪽 참고)
함수 | 반환값 및 동작 |
sign() | 양수이면 1, 0이면 0, 음수이면 -1 반환 |
abs() | 절댓값 반환 |
시간 데이터 처리
시간대 처리
글로벌 시간대와 세션 시간대 확인
SELECT @@global.time_zone, @@session.time_zone;
세션 시간대 변경
SET time_zone = 'Europe/Zurich';
시간 데이터 생성
문자열을 날짜로 변환
cast() 함수를 사용하자.
SELECT CAST('2019-09-17 15:30:30' AS DATETIME);
날짜 생성 함수 (194쪽 참고)
str_to_date() 함수를 쓰자.
예)
UPDATE rental
SET return_date = STR_TO_DATE("September 17, 2019', '%M %d, %Y')
WHERE rental_id = 99999;
현재 날짜를 생성하려면 다음 함수를 쓰자.
SELECT CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP();
시간 데이터 조작
날짜를 반환하는 시간 함수 (196쪽 참고)
date_add() 함수를 사용해서 일정 기간을 더할 수 있다.
어떤 월의 마지막 날을 알고 싶다면 last_day() 함수를 사용하자.
문자열을 반환하는 시간 함수 (199쪽)
요일을 알고싶다면 dayname() 함수를 사용하자.
날짜 요소(연도(년), 월, 일)을 뽑고 싶다면 extract() 함수를 사용하자.
숫자를 반환하는 시간 함수 (200쪽)
두 날짜 사이의 기간을 계산하고 싶다면 datediff() 함수를 사용하자.
변환 함수 (201쪽)
cast() 함수를 사용하자.
'SQL' 카테고리의 다른 글
Learning SQL 8장 요약 - 그룹화와 집계 (0) | 2022.12.01 |
---|---|
Learning SQL 6장 요약 - 집합 연산자 (0) | 2022.11.24 |
Learning SQL 5장 요약 - 다중 테이블 쿼리 (0) | 2022.11.24 |
Learning SQL 4장 요약 - 필터링 (0) | 2022.11.24 |
Learning SQL 3장 요약 - 쿼리 입문 (0) | 2022.11.24 |