$ ls crystal_folder

新·SQL小抄

雖然這邊紀錄了常用的語句或內聚函數,但我認為最難的還是效能調教...

原廠提供的這些語句、函數在面對超多資料時有時反而會造成效能瓶頸......

只能說知己知彼百戰百勝...關於效能另開一篇筆記


null的判斷

得用is或is not 詳參

同場加映:資料列有null怎麼查?


日期區間查詢

-- 如果欄位資料型態是Date(YYYY-MM-DD)就不用轉換
-- 注意表名跟跟欄位名稱千萬不要用單引號,
-- 要用也要用上引號`,而日期這種值要單引號(雙也可)
SELECT * FROM 表名 WHERE 日期欄位 BETWEEN '日期1' AND '日期2';

-- 如果欄位資料型態是Unix時間戳要轉換
SELECT * FROM 表名 WHERE DATE(日期欄位) BETWEEN '日期1' AND '日期2';

MySQL查幾個月內以前的資料

-- 用型態為DATE的CURDATE()對象比較<-不管日期欄位是DATE還是DATETIME都可以使用喔
SELECT * FROM 表名 WHERE 日期欄位 >= CURDATE() - INTERVAL 1 MONTH;

-- 其他寫法
SELECT * FROM 表名 WHERE 日期欄位 >= DATE_SUB(NOW(), INTERVAL 1 MONTH);

題外話:如果確定型態都沒問題,該轉換的也轉了,還是報錯-或許是有不被版本認可的資料混入了?

->按:如果不想改變資料,這時候或許能寫IF語句略過轉換異常的列?

但有時問題根本不是這些...

...而是像我一開始一樣給欄位加單引號被辨識為字串了Orz|||
謎之音:真是大聰明!


日期資料型態轉換相關函數

DATATIME轉DATE:

DATE_FORMAT(日期欄位, '%Y-%m-%d')

字串轉日期函數:

STR_TO_DATE(日期欄位, '%Y-%m-%d %H:%i:%s')

字串數字變變變

假設your_column的內容物,是"19999" "12000" "12001"這種字串但實際上意義是數字,我想比較大小時怎麼辦呢...

SELECT * FROM your_table
WHERE CAST(your_column AS UNSIGNED) > 12000;
-- 或用CONVERT

批量WHERE

SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" IN ('值一', '值二', ...);

來源


SQL兩欄位相加比較某數

SELECT *
FROM 表名
WHERE 欄位A + 欄位B < 某數;

各家資料庫的不等於不盡相同


CASE WHEN

多用於需要返回值


GROUP BY

解說

select的欄位得要是可以被聚合的

同場加映datetime只想計算到日可以用這個

這種場合你select的日期要跟group by的一樣

補充:Date format


那想要去除特定條件的資料列怎麼辦...

and not?但效能是個問題-考驗邏輯的時候到了...

子查詢

很不錯的教學


SELECT的秘密

SELECT 1 FROM TABLE,SQL语句中的1代表什么意思


加索引

常用where查詢的條件建議加索引

(但索引不是只有優點,建立索引後欄位的增改速率都會下降)

一個條件就做單索引;多個條件就做多重索引(基本上就是照著你的where語句的順序~)


備份相關

mysqldump


解決UNION/UNION ALL欄位名稱不同但意義相同的情境

這樣做來合併欄位吧~

SELECT column1 AS column_id, column2 AS column_name FROM table1
UNION ALL
SELECT col1 AS column_id, col2 AS column_name FROM table2;

LIMIT得再ORDER BY之前

而且會有一些小問題


ORDER BY多筆語法

SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;

轉載自

#DB #SQL