SQL 데이터형

·2024년 4월 3일
0

MySQL

목록 보기
6/14
post-thumbnail

CHAR와 VARCHAR

  • 공통점

    텍스트를 저장할 수 있는 데이터형

  • 차이점

    저장 및 검색 방식이 다름
    최대 길이 다름

VARCHAR는 최대 길이를 지정할 수 있음.
CHAR는 크기가 같거나 거의 비슷한 텍스트를 저장해야 하는 경우에 적합하다.

VARCHAR는 다양한 크기의 텍스트를 저장할 수 있도록 하는 데에 최적화되어 있음

CHAR는 아래와 같은 경우에 사용하는 것을 권장함.

CREATE TABLE states(abbr CHAR(3));

INSERT INTO states(abbr) VALUES("PUS"), ()...;

공항 코드네임 및 지역 약어, 우편번호 등
PUS, GMP, FUK, NRT ..

abbr에는 3개의 문자열만 들어올 수 있음.
만약 1개 및 2개의 문자열이 들어오면 SQL 자체에서 문자열 오른쪽으로 공백을 포함시켜 지정한 텍스트 크기에 맞게 확장시켜 저장한다.
검색시에는 공백이 제거된 상태로 검색된다.

CHAR의 이러한 특징은 자원낭비와 관련있기 때문에 알고가는 것이 중요할 것 같다.

아래 이미지로 요약 가능.

VARCHAR는 4글자가 꼭 아니더라도 공백으로 텍스트를 확장하거나 하지 않는다.
반면 CHAR는 4글자 미만의 텍스트가 들어올 때, 강제로 공백을 삽입시켜 텍스트를 확장하여 데이터베이스에 저장시킨다.

정수, 양수만을 저장 가능하게 해주는 Number 키워드

키워드 UNSIGNED를 기입해주면 정수, 양수만 저장할 수 있다.

CREATE TABLE numberPrac(num TINYINT UNSIGNED);

-- numberPrac에는 정수와 양수만 저장될 수 있다.
-- -128 ~ 127이 아닌 0 ~ 255까지 저장 가능

DECIMAL

DECIMAL을 사용하면 정확한 소수를 저장할 수 있다.

DECIMAL(5, 2);

INSERT INTO products(price) VALUES(124.52);
-- 정상적인 입력

INSERT INTO products(price) VALUES(9234.52);
-- Out of range value for column 'price' at row 1 Error
-- 총 할당된 값의 자릿수는 5개인데, 6개가 들어왔으므로 에러가 발생함.

INSERT INTO products(price) VALUES(24.2323235528);
-- 소수점 2번째 자리에 반올림한 값으로 값이 들어간다.
  • 첫 번째 숫자의 의미 : 주어진 숫자에 할당할 총 최대 자릿수
  • 두 번째 숫자의 의미 : 소수점 뒤에 오는 최대 자릿수
  • 요약 : 숫자는 최대 5개까지, 소수점 뒤에 숫자는 최대 2개까지 가능

FLOAT

소수를 저장할 수 있음.
DECIMAL보다는 정확하진 않지만, 큰 문제가 되지 않는다.

CREATE TABLE numbers(x FLOAT, y DOUBLE);
INSERT INTO numbers(x,y) VALUES(1.12345678, 1.12345678);

위 코드를 실행시키면, 아래와 같은 출력값을 확인할 수 있다.

2번에 해당하는 값만 보면 되는데, FLOATx에는 값이 잘린 것을 확인할 수 있다.
FLOAT소수점 포함 7자리가 넘어가면 정확성을 보장하기 힘들다.

DATE

날짜만 저장합니다.
시간을 포함하지 않습니다.
YYYY-MM-DD (연-월-일)형식이다.

TIME

시간을 저장합니다.
시간을 표현하는 형식이 다양합니다.
표준 형식은 HH:MM:SS입니다. (시:분:초)

DATETIME

날짜와 시간을 저장합니다.
YYYY-MM-DD HH:MM:SS 형식입니다.
(년-월-일 시:분:초)

  • DATE, TIME, DATETIME 사용코드
 CREATE TABLE people(
     name VARCHAR(20),
     birthDate DATE,
     birthTime TIME,
     brithDateTime DATETIME
 );

INSERT INTO people(name, birthDate, birthTime, brithDateTime) VALUES("vella", "1990-02-25", "04:12:31", "1990-02-25 04:12:31");

CURTIME()

내장함수. 현재 시간 표시

CURDATE()

내장함수. 현재 날짜 표시

NOW()

내장함수. 현재 날짜와 시간을 표시

INSERT INTO people(name,birthDate,birthTime,brithDateTime) VALUES("미진축산", CURDATE(), CURTIME(), NOW());
-- 미진축산이라는 이름으로 현재 날짜, 시간, 날짜-시간 저장

DAY()

날짜 데이터에서 요일에 해당하는 값만 출력

SELECT birthDate, DAY(birthDate) FROM people;

DAYOFWEEK();

요일을 알려준다. 1 - 일요일 | 7 - 토요일

MONTHNAME();

연-월-일 중, 을 알려주는 함수.

HOUR(), MINUTE(), SECOND();

시, 분 초를 골라서 출력해줄 수 있는 내장 함수

DATE_FORMAT();

SQL DATE Specifier

날짜 및 시간 양식을 변경하는 함수.
DATE와 TIME 형식에 사용 가능하다.

SELECT birthDate, DATE_FORMAT(birthDate, '%a %b %D') FROM people;
-- 날짜

SELECT brithDateTime, DATE_FORMAT(brithDateTime, "태어난 시간 : %H:%i") FROM people;
-- 시간

아래처럼 출력된다.

날짜 계산

  1. DATEDIFF(date1, date2)를 사용하여 두 날짜 간격을 구할 수 있음. 단순하게 일수만 알려준다.

반환값은 숫자

SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
-- 1
SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');
-- -31

2.DATE_ADD
DATE_ADD(date,INTERVAL expr unit)

INTERVAL이 먼저 오고, 그 다음에 표현식과 단위를 작성한다.

-- 현재 날짜를 기준으로 7일 후의 날짜 계산
SELECT DATE_ADD(CURRENT_DATE(), INTERVAL 7 DAY) AS "7일 후";

선거 투표가 가능한 나이인 18세가 되는 때가 언제인지도 알 수 있다.

SELECT birthDate, DATE_ADD(birthDate, INTERVAL 18 year) AS vote FROM people;

3.DATE_SUB
DATE_SUB(date,INTERVAL expr unit)

INTERVAL이 먼저 오고, 그 다음에 표현식과 단위를 작성한다.

-- 현재 날짜를 기준으로 1달 전의 날짜 계산
SELECT DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH) AS "1달 전";

그 외

  • 지금으로 부터 20년 전
SELECT NOW() - INTERVAL 20 YEAR;
  • 21세 이상 음주 가능
SELECT name, birthDate, YEAR(birthDate + INTERVAL 21 YEAR) AS I_AM_ADULT FROM people;

시간 계산

  1. TIMEDIFF
SELECT TIMEDIFF(CURTIME(), '10:00:00');
-- 10시와 지금 현재시간의 간격

반환값은 시간 형식

시간 계산 중요 포인트

INTERVAL 구문을 까먹지 말 것

TIMESTAMPS

날짜와 시간을 결합한 형태
TIMESTAMP 데이터 유형은 날짜와 시간이 모두 포함된 값에 사용된다.

DATETIME 유형은 날짜와 시간이 모두 포함된 값에 사용된다.

TIMESTAMPDATETIME의 차이점?
1. TIMESTAMP는 저장 공간을 덜 차지한다.

  • DATETIME날짜 범위는 1000년부터 9990년.
  • TIMESTAMP날짜 범위는 1970년부터 2038년 1월 19일.
  • DATETIME > TIMESTAMP
    따라서 지원 범위가 더 좁은 TIMESTAMP가 저장 공간을 덜 차지한다.
  1. TIMESTAMP⭐️기본값 지정⭐️이 가능하다.
    자동 업데이팅 - TIMESTAMP, DATETIME (MySQL 공식문서)
CREATE TABLE captions(
     text VARCHAR(150),
     created_at TIMESTAMP default CURRENT_TIMESTAMP 
 );
 
INSERT INTO captions(text, created_at) VALUES("오늘 날씨 비 내림", NOW());

INSERT INTO captions(text) VALUES("내일 새벽 6시 아침운동");
-- created_at을 기본값으로 지정했기 때문에, 시간을 별도로 넣어주지 않아도 테이블에 생성된다.

  1. ⭐️업데이팅 추적이 가능하다.⭐️
    먼저 댓글을 하나 달았다고 가정한다.
CREATE TABLE comment(
     text VARCHAR(150),
     created_at TIMESTAMP default CURRENT_TIMESTAMP,
     updated_at TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
 );
 
 -- created_at과 updated_at를 왜 분리하는가?
 -- ✅ 확실하게 언제 생성되었는지, 언제 마지막으로 업데이트 되었는지 항상 알 수 있다.

 INSERT INTO comment(text) VALUES("고깃집, 양식 레스토랑");

이후 아래 쿼리로 comment의 text를 수정한다.

 UPDATE comment SET text="뭐든지 할 수 있어!";

결과값은 아래와 같다.

‼️중요

text만 변경했다.
updated_at를 전혀 건드리지 않았다.

UPDATE하기 전에는 updated_atNULL이 들어가있는 상태.
text UPDATE 후에 자동으로 updated_at가 업데이팅되는 것을 확인할 수 있다.

profile
- 배움에는 끝이 없다.

0개의 댓글