The Ultimate MySQL Bootcamp 10강을 공부하며 정리한 내용입니다.
ERROR 1406 (22001): Data too long for column
과 같은 에러가 발생한다.VALUE | CHAR(4) | STORAGE | VARCHAR(4) | STORAGE |
---|---|---|---|---|
'' | ' ' | 4 bytes | '' | 1 byte |
'ab' | 'ab ' | 4 bytes | 'ab' | 3 bytes |
'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
'abcdefg' | 'abcd' | 4 bytes | 'abcdefg' | 5 bytes |
DECIMAL(total digits, digits after decimal)으로 첫번째 인자인 total digits는 1부터 65이하의 숫자가 올 수 있고, digits after decimal은 0부터 30까지의 숫자가 올 수 있다. digits after decimal이 2이고, 1.995를 추가한 경우, warning과 함께 값이 반올림되어 2가 추가된다. 즉, 주어진 자릿수보다 많은 경우, 마지막 자릿수로 반올림된다.
DATE | TIME | DATETIME |
---|---|---|
YYYY-MM-DD | HH:MM:SS | YYYY-MM-DD HH:MM:SS |
NOW() | CUIRDATE() | CURTIME() |
---|---|---|
2022-01-08 01:10:06 | 2022-01-08 | 01:10:53 |
DATE_FORMAT(date, format)
date 값을 포맷 지정자를 사용해 원하는 문자열 형태로 만든다. 이때, 지정자 앞에는 %
기호를 사용해야한다.
SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
//'Sunday October 2009'
SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W-%M-%Y');
//'Sunday-October-2009'
select date_format(NOW(), '%m/%d/%Y');
//'01/08/2022'
select date_format(NOW(), '%m/%d/%Y at %h:%i');
//'01/08/2022 at 00:09'
SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
// '22:23:00'
DATEDIFF(expr1, expr2)
expr1-expr2
를 한 일수를 리턴한다.
DATEADD(date, INTERVAL expr unit)
date에 설정한 날짜표현만큼 더한 날짜를 리턴한다.
SELECT DATE_ADD('2018-05-01', INTERVAL 1 DAY);
//'2018-05-02'
SELECT DATE_ADD('2020-12-31 23:59:59', INTERVAL 1 SECOND);
//'2021-01-01 00:00:00'
DATE + || - INTERVAL expr unit
SELECT ('2018-05-01' + INTERVAL 1 DAY);
//'2018-05-02'
SELECT ('2018-05-01' - INTERVAL 1 DAY);
//'2018-04-30'
SELECT (NOW() + INTERVAL 1 DAY + INTERVAL 10 HOUR);
//'2022-01-09 10:35:26'
timestamp는 데이터타입이면서 데이터를 추가, 변경할때에 자동으로 생성되는 정보이기도 하다.
timestamp는 날짜와 시간을 저장한다는 점에서 datetime과 동일하지만, 다른 범위를 갖는다. datetime의 범위는 '1000-01-01 00:00:00'
부터 '9999-12-31 23:59:59'
까지이고, timestamp는 '1970-01-01 00:00:00' UTC
부터 '2038-01-19 03:14:07' UTC
까지의 범위를 갖는다. 따라서 광범위한 날짜 정보를 저장해야하는 경우, timestamp는 적합하지 않다.
timestamp는 datetime의 약 절반의 용량을 차지하기 때문에 매번 데이터를 추가하거나 변경했을때 저장하는 날짜 데이터타입으로 적합하다.
CREATE TABLE comments (
content varchar(100),
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE comments2 (
content varchar(100),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
//여기서 CURRENT_TIMESTAMP와 NOW()는 같은 기능
what's a good use case for CHAR?
고정된 글자수가 확실한 칼럼에 적당하다. 전화번호('010-0000-0000'
)와 같이 고정된 길이를 갖는 문자열의 데이터타입으로 적합하다.
fill in the blanks.
//price < 1,000,000
CREATE TABLE inventory (
item_name varchar(100),
price decimal(8,2), //가격은 1,000,000미만이면서 소수점이하 자릿수가 있을 수 있으므로.
quantity int
)
Difference between datetime and timestamp?
datetime과 timestamp는 모두 날짜와 시간을 저장한다. 하지만 기술적으로 저장가능한 날짜범위(range)와 저장방식 등에 차이가 있다. datetime은 날짜범위가 timestamp보다 넓지만, 용량이 timestamp의 2배를 차지한다. 따라서, 광범위한 날짜 범위가 필요한 경우 datetime을 작성하고, 데이터를 추가(insert), 변경(update)해 실시간으로 저장할때, timestamp가 적합하다.
print out the current time
SELECT curtime(); //15:21:15
SELECT curdate(); //2022-01-09
SELECT DAYOFWEEK(CURDATE()); //1 (Sunday === 1)
SELECT DAYOFWEEK(NOW()); //1
SELEC DATE_FORMAT(NOW(), '%w'); //1
SELECT DAYNAME(NOW()); //Sunday
SELECT DATE_FORMAT(NOW(), '%W'); //Sunday
mm/dd/yyyy
)SELECT DATE_FORMAT(NOW(), '%m/%d/%Y'); //01/09/2022
Jaunary 2nd at 3:15
SELECT DATE_FORMAT(NOW(), '%M %D at %h:%i'); //January 9th at 03:30
the tweet content, a username, time it was created
CREATE TABLE tweets (
content varchar(140),
username varchar(20),
created_at timestamp default NOW()
);
reference