SQL Tips - Heeyoung-Ahn/MariaDB-with-Excel-VBA GitHub Wiki
INSERT ON DUPLICATE KEY UPDATE
- INSERT ... ON DUPLICATE KEY UPDATE is a MariaDB/MySQL extension to the INSERT statement that, if it finds a duplicate unique or primary key, will instead perform an UPDATE.
INSERT INTO ins_duplicate VALUES (4,'Gorilla') ON DUPLICATE KEY UPDATE animal='Gorilla';
CTE Recursive
-- ํน์ ์ผ(2019-01-31)๋ถํฐ ์ ์๋ง๊น์ง ์กฐํ์์ ๋ชฉ๋ก์ผ๋ก ๊ตฌ์ฑ
WITH RECURSIVE query_month AS (
SELECT '2019-01-31' AS q_month
UNION ALL
SELECT LAST_DAY(q_month + INTERVAL 1 MONTH)
FROM query_month
WHERE q_month < LAST_DAY(CURRENT_DATE - INTERVAL 1 MONTH)
)
SELECT q_month FROM query_month;
DB๊ฐ ๋๋ ค์ง๋ฉด
- DB์๋ฒ์์ ์คํ์ค์ธ ํ๋ก์ธ์ค ํ์ธ:
SHOW FULL processlist
- Command Prompt์์
netstat -an | findstr Host์ ์ฐํ ๋ฌธ์ ๊ฐ ๋๋ ์ฐ๊ฒฐ์ ๋ฌธ์์ด
- ์
netstat -an | findstr 51955
- ์
- ํด๋น Session Terminate: KILL id_no;
- ๊ทธ๋๋ ์๋๋ฉด ์๋ฒ ์ฌ์์
- ์์ > services.msc ์ ๋ ฅ ํ ์ํฐ
- ์ค์น ์ ์ค์ ํ ์๋์ฐ ์๋น์ค๋ช (๊ธฐ๋ณธ MySQL) ์ ์ฐพ์ '๋ค์์์'
Next Record, Previous Record
SELECT *
FROM co_account.corporations
WHERE corporation_id = (SELECT MIN(corporation_id)
FROM co_account.corporations
WHERE corporation_id > 4 AND suspended = 0)
SELECT *
FROM co_account.corporations
WHERE corporation_id = (SELECT MAX(corporation_id)
FROM co_account.corporations
WHERE corporation_id < 4 AND suspended = 0)
EVENT SCHEDULER
SET GLOBAL event_scheduler = ON;
SHOW VARIABLES LIKE 'event%'; -- ์ด๋ฒคํธ ๋ณ์ ํ์ธ
SELECT * FROM information_schema.EVENTS; -- ์ด๋ฒคํธ ๋ชฉ๋ก ํ์ธ
- my.ini์ [mysqld]์๋ event_scheduler = ON ์ถ๊ฐํด์ผ ํจ
- ์ต์ ์ ์ฟผ๋ฆฌ๋ก ๋ณ๊ฒฝํด๋ ์๋ฒ๊ฐ ์ฌ์์๋๋ฉด ๊ธฐ๋ณธ ์ค์ ์ธ off๋ก ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ
CREATE EVENT IF NOT EXISTS set_today_to_refer_date
ON SCHEDULE
EVERY 1 DAY STARTS '2019-11-28 00:00:01'
ON COMPLETION PRESERVE
ENABLE
COMMENT '์ ํ์กฐํ๊ธฐ์ค์ผ์ ๋ง์ง๋ง๋ ์ ์ค๋๋ก ์
๋ฐ์ดํธ'
DO BEGIN
-- ๋ฒ์ธ์ ์๋ณ ์ด๊ณ์ ์์ฅ ๋ฐ์ดํฐ ๊ตฌ์ฑ
-- ๋ฒ์ธ์ ์ฐ๋ณ ์ด๊ณ์ ์์ฅ ๋ฐ์ดํฐ ๊ตฌ์ฑ
-- ์ด๊ณ์ ์์ฅ์ ๊ธฐ๊ฐ์ 2019๋
1์ ๋ถํฐ ํ์ฌ๊น์ง
CALL account_report.s_dw_general_ledger_corporation_monthly(3);
CALL account_report.s_dw_general_ledger_corporation_yearly;
END
CREATE OR REPLACE EVENT make_refer_month
ON SCHEDULE
EVERY 1 MONTH
STARTS '2020-01-01 00:10:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT '์กฐํ์ ์๋ฃ ์์ฑ'
DO
CALL account_report.s_update_refer_month;
Date_Format
- ๋ฌธ๋ฒ:
DATE_FORMAT(date, format[, locale])
- ์ต์ ์ฐธ์กฐ: https://mariadb.com/kb/en/date_format/
SELECT DATE_FORMAT(CURDATE(), '%Y'); -- ๋ฌธ์ํ์ผ๋ก ๋ณ๊ฒฝ๋จ: 2020
SELECT DATE_FORMAT(CURDATE(), '%Y') - 1; -- ์ซ์๋ก ํ์๋จ: 2,019
SELECT CAST(DATE_FORMAT(CURDATE(), '%Y') AS INT); -- ์ซ์๋ก ๋ณ๊ฒฝ๋จ: 2,020
STR_TO_DATE
- DATE_FORMAT์ ๋ฐ๋
- ๋ฌธ๋ฒ:
STR_TO_DATE(str,format)
- ์ต์ ์ฐธ์กฐ: https://mariadb.com/kb/en/str_to_date/
SELECT STR_TO_DATE('20200111', '%Y%m%d'); -- 2020-01-11
SELECT STR_TO_DATE('20200111', '%Y%m%d %T'); -- 2020-01-11 00:00:00
ROW(), DENSE_ROW(), ROW_NUMBER()
- ROW() ๋ฌธ๋ฒ
RANK() OVER (
[ PARTITION BY partition_expression ]
[ ORDER BY order_list ]
)
- DENSE_ROW() ๋ฌธ๋ฒ
DENSE_RANK() OVER (
[ PARTITION BY partition_expression ]
[ ORDER BY order_list ]
)
- ROW_NUMBER() ๋ฌธ๋ฒ
ROW_NUMBER() OVER (
[ PARTITION BY partition_expression ]
[ ORDER BY order_list ]
)
- ์
CREATE TABLE student(course VARCHAR(10), mark int, name varchar(10));
INSERT INTO student VALUES
('Maths', 60, 'Thulile'),
('Maths', 60, 'Pritha'),
('Maths', 70, 'Voitto'),
('Maths', 55, 'Chun'),
('Biology', 60, 'Bilal'),
('Biology', 70, 'Roger');
SELECT
RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS dense_rank,
ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC) AS row_num,
course, mark, name
FROM student ORDER BY course, mark DESC;
- ์ฐธ์กฐ: https://mariadb.com/kb/en/rank/
LAG, LEAD
- LAG ๋ฌธ๋ฒ
LAG (expr[, offset]) OVER (
[ PARTITION BY partition_expression ]
< ORDER BY order_list >
)
- LEAD ๋ฌธ๋ฒ
LEAD (expr[, offset]) OVER (
[ PARTITION BY partition_expression ]
[ ORDER BY order_list ]
)
- ์ฐธ์กฐ: https://mariadb.com/kb/en/lag/
Moving Average
ROWS BETWEEN N PRECEDING(FOLLOWING) AND N PRECEDING(FOLLOWING)
WITH t AS (
SELECT '201201' yyyymm, 100 amt FROM dual
UNION ALL SELECT '201202', 200 FROM dual
UNION ALL SELECT '201203', 300 FROM dual
UNION ALL SELECT '201204', 400 FROM dual
UNION ALL SELECT '201205', 500 FROM dual
UNION ALL SELECT '201206', 600 FROM dual
UNION ALL SELECT '201207', 700 FROM dual
UNION ALL SELECT '201208', 800 FROM dual
UNION ALL SELECT '201209', 900 FROM dual
UNION ALL SELECT '201210', 100 FROM dual
UNION ALL SELECT '201211', 200 FROM dual
UNION ALL SELECT '201212', 300 FROM DUAL
ORDER BY yyyymm
)
SELECT yyyymm,
amt,
(SUM(amt) OVER(ORDER BY yyyymm ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING)) AS amt_pre3,
(SUM(amt) OVER(ORDER BY yyyymm ROWS BETWEEN 1 FOLLOWING AND 3 FOLLOWING)) AS amt_fol3
FROM t
;
- ์ฐธ์กฐ
WITH cte_test AS (
SELECT 'Chun' name, 'SQL' test, 75 score FROM DUAL
UNION ALL SELECT 'Chun', 'Tuning', 73 FROM DUAL
UNION ALL SELECT 'Esben', 'SQL', 43 FROM DUAL
UNION ALL SELECT 'Esben', 'Tuning', 31 FROM DUAL
UNION ALL SELECT 'Kaolin', 'SQL', 56 FROM DUAL
UNION ALL SELECT 'Kaolin', 'Tuning', 88 FROM DUAL
UNION ALL SELECT 'Tatiana', 'SQL', 87
ORDER BY name
)
SELECT NAME,
test,
score,
SUM(a.score) OVER (ORDER BY a.score RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total_score
FROM cte_test a;
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW -- ์ต๊ทผ 3๊ฐ์
DATETIME ํ์ ์๋ฃ ์กฐํ
- ๋ก๊ทธ ๋ฐ์ดํฐ ๊ฒ์ ๋ฑ
SET @start_dt = '2020-01-17'; -- ์กฐํ ์์์ผ
SET @end_dt = '2020-01-17'; -- ์กฐํ ์ข
๋ฃ์ผ
SELECT * FROM v_logs a
WHERE a.time_stamp >= CONVERT(@start_dt, DATETIME) AND
a.time_stamp < CONVERT(DATE_ADD(@end_dt, INTERVAL 1 DAY), DATETIME);
SELECT CONVERT(@start_dt, DATETIME); -- ์กฐํ ์์์ผ
SELECT CONVERT(DATE_ADD(@end_dt, INTERVAL 1 DAY), DATETIME); -- ์กฐํ ์ข
๋ฃ์ผ
TIMESTAMP ๊ฒ์
SELECT * FROM financial_db.slips a
WHERE a.time_stamp >= CONVERT('2019-11-17', DATETIME) AND
a.time_stamp < CONVERT('2019-11-18', DATETIME);