데이터베이스/MariaDB&MySQL
-
[연습문제02] 기간 계산 문제2009.09.24
-
[MySQL강의노트] 제10강 데이터 추가 및 삭제, 변경 명령2009.09.22
-
[MySQL강의노트] 제8강 MySQL 함수 - 수학 함수2009.09.20
[연습문제02] 기간 계산 문제
Q. DATETIME 형식으로 저장된 필드의 값을 읽어서 ○년전, ○달전, ○시간전,○분전으로 출력하세요. (SELECT문을 사용)
A. 아래를 마우스로 끌어보세요. 답을 확인하기 전에 여러가지 모범답안을 기대하겠습니다. 댓글로 달아주세요.
WHEN MONTH(NOW()) - MONTH(d) > 0 THEN CONCAT(CAST(MONTH(NOW()) - MONTH(d) AS CHAR), '달전')
WHEN DAY(NOW()) - DAY(d) > 0 THEN CONCAT(CAST(DAY(NOW()) - DAY(d) AS CHAR), '일전')
WHEN HOUR(NOW()) - HOUR(d) > 0 THEN CONCAT(CAST(HOUR(NOW()) - HOUR(d) AS CHAR), '시간전')
ELSE CONCAT(CAST(MINUTE(NOW()) - MINUTE(d) AS CHAR), '분전')
END
FROM q1 ORDER BY d DESC;
[연습문제01] 날짜 변환 문제
문제> DATETIME 타입으로 저장된 필드값을 읽어들여서 오늘 날짜의 경우 시간(HH시 MM분) 형식으로 출력하고 이전 날짜의 경우 날짜(MM월 DD일) 형식으로 출력하세요.
(조건: SELECT문으로 출력)
풀이>
다음과 같이 데이터를 준비합니다.
CREATE TABLE q1 (d DATETIME) ENGINE MyISAM;
INSERT INTO q1 VALUES (SYSDATE());
INSERT INTO q1 VALUES (DATE_SUB(NOW(), INTERVAL 1 DAY));
답>
아래 부분을 마우스로 끌어보세요. 이 밖에도 다양한 답을 기대하겠습니다.SELECT IF(PERIOD_DIFF(DATE(NOW()), DATE(d)) <= 0, DATE_FORMAT(d, '%H시 %i분'), DATE_FORMAT(d, '%m월 %d일')) AS `갱신시간` FROM q1 ORDER BY d DESC;
[MySQL강의노트] 제10강 데이터 추가 및 삭제, 변경 명령
데이터 추가 및 삭제와 변경
INSERT문
(형식)
SELECT INTO 테이블명 (컬럼 목록) VALUES (데이터 목록);
INSET문은 하나의 행(row)을 저장하는 명령입니다. 데이터 추가시 컬럼 목록과 데이터 목록의 짝이 반드시 맞아야 하며 컬럼의 순서는 컬럼 목록에 사용된 컬럼 이름을 따릅니다. 사실 데이터베이스의 테이블은 데이터의 저장순으로 로우(행)가 추가되며 로우의 순서는 의미가 없습니다. 대신 PRIMARY KEY(기본키)로 설정된 컬럼의 경우 자동으로 인덱스가 만들어져서 미리 정렬이 되어 있습니다. 인덱스와 연결된 테이블은 SELECT문의 실행시 기본키를 기준으로 정렬되어 출력됩니다.
AUTO_INCREMENT 컬럼 제약이 주어졌을 경우 추가시 컬럼을 생략하면 자동으로 증가된 값이 추가됩니다. NOT NULL 컬럼 제약이 주어진 컬럼은 무조건 추가를 해야합니다.
(사용예)
CREATE TABLE customers ( customer_id INT(5) NOT NULL PRIMARY KEY AUTO_INCREMENT, gender ENUM('남', '여') NOT NULL, name VARCHAR(8) NOT NULL, email VARCHAR(35) NOT NULL, address VARCHAR(255) NOT NULL, telephone VARCHAR(14) NOT NULL, registdate DATE DEFAULT NULL, modifydate TIMESTAMP ); INSERT INTO customers (gender, name, email, address, telephone, registdate) VALUES ('남', '홍길동', 'kidong@hong.com', '전라도 장성현 아차곡', '010-1234-1234', '2009-09-21'); INSERT INTO customers VALUES ('2', '남', '철수', 'cs@chol.com', '서울시', '02-1234-1234', '2009-09-21', '2009-09-21'); INSERT INTO customers VALUES (3, '여', '영희', 'yh@chol.com', '서울시', '02-4321-4321', '2009-09-20', '2009-09-21'), (4, '남', '칠숙', 'hwarang7@chol.com', '서울시', '02-1234-4321', '2009-09-20', '2009-09-21'), (5, '여', '덕만', 'queen@chol.com', '서울시', '02-4321-1234', '2009-09-20', '2009-09-21');
DELETE문, TRUNCATE문
(형식)
DELETE FROM 테이블명 WHERE 조건문;
DELETE문의 경우 테이블을 대상으로 삭제 작업을 하기 때문에 WHERE절이 없을 경우 테이블의 모든 데이터를 삭제합니다. 이때 로우 단위로 삭제하기 때문에 시간이 좀 걸리는데 만일 전체 데이터를 지우고자 한다면 TRUNCATE 테이블문을 사용하는 것이 더 효율적입니다.
(사용예)
DELETE FROM customers WHERE customer_id = 4;
UPDATE문
(형식)
UPDATE 테이블명 SET 컬럼1 = 데이터, 컬럼2 = 데이터, ... WHERE 조건문;
특정 컬럼의 값을 변경할 때 사용합니다.
(사용예)
UPDATE costomers SET name = '홍삼정', telephone = '031-0123-1234' WHERE name = '홍길동';
대량 데이터 입력 (Bulk operation)
LOAD DATA INFILE
(사용예)
LOAD DATA LOCAL INFILE 'C:\\zip.txt' INTO TABLE ziptable CHARACTER SET 'utf8' COLUMNS TERMINATED BY '\t' LINES TERMINATED '\n' (seq, sido, gugun, dong, bunji);
mysqlimport 유틸리티
(사용예)
c:\> mysqlimport -u root -p ziptable zip.txt
[MySQL강의노트] 제9강 MySQL 함수 - 날짜 관련 함수
MySQL 함수
날짜 함수
NOW(), CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, LOCALTIMESTAMP()
현재 시간을 리턴합니다.
SYSDATE()
'YYYY-MM-DD HH:MM:SS' 또는 'YYYYMMDDHHMMSS' 형식으로 현재 날짜나 시간을 리턴합니다. 5.0.13 버전이후부터는 SYSDATE()는 실행 시점의 시간을 표시하므로 NOW()와 차이점이 있습니다. 아래 명령을 실행하여 차이점을 확인하세요.
SELECT NOW(), SLEEP(2), NOW();
SELECT SYSDATE(), SLEEP(2), SYSDATE();
CURDATE(), CURRENT_DATE, CURRENT_DATE()
'YYYY-MM-DD' 또는 'YYYYMMDD' 형식으로 현재 날짜를 리턴합니다.
CURTIME(), CURRENT_TIME, CURRENT_TIME()
'HH:MM:SS' 또는 'HHMMSS.uuuuuu' 형식으로 현재 시간을 리턴합니다.
DATE_FORMAT(date,format)
date로 지정된 날짜른 format에 의해 표시합니다.
기호 | 설명 |
---|---|
%a | Sun, ..., Sat와 같은 요일의 약어 표시 |
%b | Jan, ..., Dec와 같은 달이름 약어 표시 |
%c | 1 ~ 12 사이의 월 표시 |
%D | 1st, 2nd, ... 와 같은 형식의 달의 날짜 표시 |
%d | 00, ..., 31 형식의 달의 날짜 표시 |
%e | 0, ..., 31 형식의 달의 날짜 표시 |
%f | 마이크로초 표시 |
%H | 24시간 형식의 시간 표시(00, ..., 23) |
%h, %I | 12시간 형식의 시간 표시(01, ..., 12 ) |
%i | 분 표시(00, ..., 59) |
%j | 년의 날짜 표시(001, ..., 366) |
%k | 24시간 표시(0, ..., 23) |
%l | 12시간 표시(1, ..., 12) |
%M | 달 이름 표시(Jenuary, ..., December) |
%m | 달 순서 표시(00, ..., 12) |
%p | AM, PM 표시 |
%r | 12시간제 표시(HH:MM:SS AM or PM) |
%S, %s | 초 표시(00, ..., 59) |
%T | 24시간제 표시(HH:MM:SS) |
%U | 일요일을 시작으로 년의 몇번째 주인가를 00, ..., 53으로 표시한다. |
%u | 월요일을 시작으로 년의 몇번째 주인가를 00, ..., 53으로 표시한다. |
%V | %X와 함께 쓰여 일요일을 시작으로 년의 몇번째 주인가를 01, ..., 53으로 표시한다. |
%v | %x와 함께 쓰여 월요일을 시작으로 년의 몇번째 주인가를 01, ..., 53으로 표시한다. |
%W | 요일명 표시(Sunday, ..., Saturday) |
%w | 요일의 순서를 표시(0=Sunday, ..., 6=Saturday) |
%X | %V와 함께 쓰이며 일요일을 시작하는 주를 기준으로 YYYY 형태의 년도를 표시한다. |
%x | %v와 함께 쓰이며 월요일을 시작하는 주를 기준으로 YYYY 형태의 년도를 표시한다. |
%Y | YYYY 형식으로 년도를 표시한다. |
%y | YY 형식으로 년도를 표시한다. |
%% | % 문자를 표시한다. |
GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})
특정 국가의 형식으로 표시합니다. 메뉴얼을 참고 하세요.
YEAR(date)
'1000'에서 '9999' 사이의 년도를 리턴합니다.
QUARTER(date)
분기를 1 ~4 로 리턴합니다.
MONTH(date)
월을 1 ~ 12 로 리턴합니다.
MONTHNAME(date)
월 이름을 리턴합니다.
WEEK(date[,mode])
요일 순서를 출력합니다. mode가 지정되면 특정 조건에 맞는 값을 리턴합니다.
Mode | First day of week | Range | Week 1 is the first week ... |
---|---|---|---|
0 | Sunday | 0-53 | with a Sunday in this year |
1 | Monday | 0-53 | with more than 3 days this year |
2 | Sunday | 1-53 | with a Sunday in this year |
3 | Monday | 1-53 | with more than 3 days this year |
4 | Sunday | 0-53 | with more than 3 days this year |
5 | Monday | 0-53 | with a Monday in this year |
6 | Sunday | 1-53 | with more than 3 days this year |
7 | Monday | 1-53 | with a Monday in this year |
WEEKDAY(date)
요일 순서를 리턴합니다. (0=Sunday, 1=Monday, ..., 6=Saturday) (0=Monday, 1=Tuesday, ..., 6=Sunday)
WEEKOFYEAR(date)
년중 주의 순서를 리턴합니다. WEEK(date, 3)과 동일한 표현입니다.
YEARWEEK(date), YEARWEEK(date,mode)
해당되는 년도 및 주를 리턴합니다. mode는 WEEK() 함수와 동일한 동작을 합니다.
DAYNAME(date)
요일 이름을 리턴합니다.
DAYOFYEAR(date)
년중 날짜를 리턴합니다.
DAY(date), DAYOFMONTH(date)
월중 날짜를 리턴합니다.
DAYOFWEEK(date)
주중 순서를 리턴합니다. (1=Sunday, 2=Monday, ..., 7=Saturday)
LAST_DAY(date)
해당 월의 마지막 날짜를 리턴합니다.
DATE(expr)
date나 datetime 형식에서 date 부분만 리턴합니다.
HOUR(time)
시간을 리턴합니다.
MINUTE(time)
분을 리턴합니다.
SECOND(time)
초를 리턴합니다.
TIME(expr)
time이나 datetime 형식에서 time 부분만 리턴합니다.
MICROSECOND(expr)
마이크로초를 리턴합니다.
PERIOD_ADD(P,N)
P기간에 N달만큼 더한 결과를 YYYYMM 형태로 리턴합니다.
PERIOD_DIFF(P1,P2)
YYMM 이나 YYYYMM 형식의 P1과 P2 사이가 몇 달인지를 리턴합니다.
DATE_ADD(date,INTERVAL expr unit), ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)
date로부터 expr만큼 type 단위로 더한 날짜를 리턴합니다.
unit | expr |
---|---|
MICROSECOND | 마이크로초 |
SECOND | 초 |
MINUTE | 분 |
HOUR | 시간 |
DAY | 날짜 |
WEEK | 주차 |
QUOTER | 분기 |
YEAR | 년 |
SECOND_MICROSECOND | '초.마이크로초' |
MINUTE_MICROSECOND | '분:초.마이크로초' |
MINUTE_SECOND | '분:초' |
HOUR_MICROSECOND | '시:분:초.마이크로초' |
HOUR_SECOND | '시:분:초' |
HOUR_MINUTE | '시:분' |
DAY_MICROSECOND | '일 시:분:초.마이크로초' |
DAY_SECOND | '일 시:분:초' |
DAY_MINUTE | '일 시:분' |
DAY_HOUR | '일 시' |
YEAR_MONTH | '년-월' |
DATE_SUB(date,INTERVAL expr unit), SUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)
date로부터 expr만큼 unit 단위로 뺀 날짜를 리턴합니다.
DATEDIFF(expr1,expr2)
expr1과 expr2 사이의 일 수를 리턴합니다.
TIMEDIFF(expr1,expr2)
expr1과 expr2 사이의 시간을 time 형식으로 리턴합니다.
ADDTIME(expr1,expr2)
date나 datetime 형식의 expr1에 time 형식의 expr1을 더한 time 형식의 값을 리턴합니다.
SUBTIME(expr1,expr2)
date나 datetime 형식의 expr1에 time 형식의 expr1을 뺀 time 형식의 값을 리턴합니다.
TIMESTAMP(expr), TIMESTAMP(expr1,expr2)
date나 datetime 형식의 시간을 datetime 형식으로 리턴합니다. expr2가 주어지면 해당 시간으로 시간을 지정합니다.
TIMESTAMPADD(unit,interval,datetime_expr)
datetime_expr로부터 interval만큼 unit 단위로 더한 시간를 리턴합니다.
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
datetime_expr1과 datetieme_expr2 사이를 unit 단위로 리턴합니다.
TIME_FORMAT(time,format)
time 형식의 시간을 format 형식으로 리턴합니다. format은 DATE_FORMAT() 함수와 동일합니다.
EXTRACT(unit FROM date)
date로부터 unit 형식으로 값을 리턴합니다.
SELECT EXTRACT(YEAR FROM SYSDATE());
SELECT EXTRACT(MONTH FROM SYSDATE());
SELECT EXTRACT(DAY FROM SYSDATE());
FROM_DAYS(N)
0년부터 계산되 날 수로부터 날짜를 리턴합니다.
TO_DAYS(date)
date를 기준으로 0년부터 계산된 날 수를 리턴합니다. 그레고리력을 따르지 않습니다.
SEC_TO_TIME(seconds)
초를 time 형식으로 리턴합니다.
TIME_TO_SEC(time)
time 형식의 시간을 초로 리턴합니다.
STR_TO_DATE(str,format)
문자열str을 format 형식의 시간으로 리턴합니다. format문자열은 DATE_FORMAT() 과 동일합니다.
MAKEDATE(year,dayofyear)
year와 day-of-year 값으로 date 형식(YYYY-MM-DD)의 날짜를 리턴합니다.
MAKETIME(hour,minute,second)
hour, minute, second 값으로 time 형식(HH:MM:SS)의 시간을 리턴합니다.
CONVERT_TZ(dt,from_tz,to_tz)
시간대 변경 함수.
FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)
유닉스 타입의 시간을 리턴합니다.
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
유닉스 시간 ('1970-01-01 00:00:00' 기준)을 리턴합니다. date가 주어지면 date의 유닉스 시간을 리턴합니다.
UTC_DATE, UTC_DATE()
UTC 시간을 리턴합니다.
UTC_TIME, UTC_TIME()
UTC 시간을 리턴합니다.
UTC_TIMESTAMP, UTC_TIMESTAMP()
UTC 시간을 리턴합니다.
[MySQL강의노트] 제8강 MySQL 함수 - 수학 함수
MySQL 함수
수학 함수
산술 연산자
+, -, *, /
더하기, 빼기, 곱하기, 나누기 사칙연산을 처리합니다.
DIV
정수 나누기 연산을 처리합니다. FLOOR() 함수로 비슷한 처리가 가능합니다.
SELECT 5 DIV 2;
SELECT FLOOR(5 / 2);
%
나머지 연산으로 MOD() 함수와 같은 역할을 합니다.
SELECT 5 % 2;
SELECT MOD(5, 2);
수학 함수
MOD(N, M), N % M, N MOD M
N을 M으로 나눈 나머지를 리턴합니다.
ABC(X)
절대값을 리턴합니다.
SIGN(X)
양수, 음수에 따라 부호를 리턴합니다.
CEIL(X), CEILING(X)
X보다 작지 않은 정수의 최소값을 리턴합니다.
FLOOR(X)
X보다 크지 않은 정수의 최대값을 리턴합니다.
ROUND(X), ROUND(X, D)
반올림 값을 리턴합니다. 두번째 문법은 D자리까지의 반올림 값을 리턴합니다.
TRUNCATE(X, D)
D자리에서 버림한 값을 리턴합니다.
FORMAT(X, D)
문자열 함수의 FORMAT() 참고.
RAND(), RAND(N)
0 ~ 1 사이의 난수를 리턴합니다. N은 seed 값을 의미합니다.
POW(X, Y), POWER(X, Y)
X의 Y 제곱한 값을 리턴합니다.
SQRT(X)
X의 제곱근을 리턴합니다.
CONV(X, from_base, to_base)
form_base진수 X를 to_base진수로 리턴합니다.
OCT(N)
8진수로 리턴합니다.
HEX(X or str)
문자열 함수 HEX() 참고.
EXP(X)
X의 제곱에 대한 자연로그의 근 e 값을 리턴합니다.
LN(X)
X의 자연로그를 리턴합니다.
LOG(X), LOG(B, X)
로그 근을 구합니다.
LOG2(X)
e를 밑으로 하는 로그를 리턴합니다.
LOG10(X)
상용로그를 리턴합니다.
CRC32(expr)
CRC값을 계산하여 32비트의 부호화되지 않은 값을 리턴합니다.
PI()
원주율 값을 리턴합니다. 기본적으로 7자리의 값을 리턴하지만 MySQL은 이배정도 값까지 리턴할 수 있습니다.
SELECT PI(); -- 3.141593
SELECT PI() + 0.000000000000000000; -- 3.14159265358979
RADIANS(X)
X각도의 라디안 값을 리턴합니다.
DEGREE(X)
X 라이안 값을 각도로 리턴합니다.
SIN(X)
라디안 X의 사인 값을 리턴합니다.
COS(X)
라디안 X의 코사인 값을 리턴합니다.
TAN(X)
라디안 X의 탄젠트 값을 리턴합니다.
ASIN(X)
라디안 X의 역 사인 값을 리턴합니다.
ACOS(X)
라디안 X의 역 코사인 값을 리턴합니다.
ATAN(X)
라디안 X의 역 탄젠트 값을 리턴합니다.
COT(X)
라디안 X의 코탄젠트 값을 리턴합니다.