공통점
텍스트를 저장할 수 있는 데이터형
차이점
저장 및 검색 방식이 다름
최대 길이 다름
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글자 미만의 텍스트가 들어올 때, 강제로 공백을 삽입시켜 텍스트를 확장하여 데이터베이스에 저장시킨다.
키워드 UNSIGNED
를 기입해주면 정수, 양수만 저장할 수 있다.
CREATE TABLE numberPrac(num TINYINT UNSIGNED);
-- numberPrac에는 정수와 양수만 저장될 수 있다.
-- -128 ~ 127이 아닌 0 ~ 255까지 저장 가능
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번째 자리에 반올림한 값으로 값이 들어간다.
소수를 저장할 수 있음.
DECIMAL
보다는 정확하진 않지만, 큰 문제가 되지 않는다.
CREATE TABLE numbers(x FLOAT, y DOUBLE);
INSERT INTO numbers(x,y) VALUES(1.12345678, 1.12345678);
위 코드를 실행시키면, 아래와 같은 출력값을 확인할 수 있다.
2번에 해당하는 값만 보면 되는데, FLOAT
인 x
에는 값이 잘린 것을 확인할 수 있다.
FLOAT
은 소수점 포함 7자리가 넘어가면 정확성을 보장하기 힘들다.
날짜만 저장합니다.
시간을 포함하지 않습니다.
YYYY-MM-DD
(연-월-일)형식이다.
시간을 저장합니다.
시간을 표현하는 형식이 다양합니다.
표준 형식은HH:MM:SS
입니다. (시:분:초)
날짜와 시간을 저장합니다.
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");
내장함수. 현재 시간 표시
내장함수. 현재 날짜 표시
내장함수. 현재 날짜와 시간을 표시
INSERT INTO people(name,birthDate,birthTime,brithDateTime) VALUES("미진축산", CURDATE(), CURTIME(), NOW());
-- 미진축산이라는 이름으로 현재 날짜, 시간, 날짜-시간 저장
날짜 데이터에서
요일
에 해당하는 값만 출력SELECT birthDate, DAY(birthDate) FROM people;
요일을 알려준다.
1 - 일요일
|7 - 토요일
연-월-일
중,월
을 알려주는 함수.
시, 분 초를 골라서 출력해줄 수 있는 내장 함수
날짜 및 시간 양식을 변경하는 함수.
DATE와 TIME 형식에 사용 가능하다.
SELECT birthDate, DATE_FORMAT(birthDate, '%a %b %D') FROM people;
-- 날짜
SELECT brithDateTime, DATE_FORMAT(brithDateTime, "태어난 시간 : %H:%i") FROM people;
-- 시간
아래처럼 출력된다.
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달 전";
SELECT NOW() - INTERVAL 20 YEAR;
SELECT name, birthDate, YEAR(birthDate + INTERVAL 21 YEAR) AS I_AM_ADULT FROM people;
TIMEDIFF
SELECT TIMEDIFF(CURTIME(), '10:00:00');
-- 10시와 지금 현재시간의 간격
반환값은 시간 형식
INTERVAL
구문을 까먹지 말 것
날짜와 시간을 결합한 형태
TIMESTAMP
데이터 유형은 날짜와 시간이 모두 포함된 값에 사용된다.
DATETIME
유형은 날짜와 시간이 모두 포함된 값에 사용된다.
TIMESTAMP
와 DATETIME
의 차이점?
1. TIMESTAMP
는 저장 공간을 덜 차지한다.
DATETIME
의 날짜 범위는 1000년부터 9990년.TIMESTAMP
의 날짜 범위는 1970년부터 2038년 1월 19일.DATETIME
> TIMESTAMP
TIMESTAMP
가 저장 공간을 덜 차지한다.TIMESTAMP
는 ⭐️기본값 지정⭐️이 가능하다.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을 기본값으로 지정했기 때문에, 시간을 별도로 넣어주지 않아도 테이블에 생성된다.
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_at
에 NULL
이 들어가있는 상태.
text
UPDATE 후에 자동으로 updated_at
가 업데이팅되는 것을 확인할 수 있다.