Learning SQL 7장 요약 - 데이터 생성, 조작과 변환

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() 함수를 사용하자.