新·SQL小抄
雖然這邊紀錄了常用的語句或內聚函數,但我認為最難的還是效能調教...
原廠提供的這些語句、函數在面對超多資料時有時反而會造成效能瓶頸......
只能說知己知彼百戰百勝...關於效能另開一篇筆記
null的判斷
得用is或is not 詳參
同場加映:資料列有null怎麼查?
- 如果不等於某值時 想要連null一起撈出來 考慮
or 欄位 is 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 < 某數;
各家資料庫的不等於不盡相同
- MySQL是
!=<>
CASE WHEN
多用於需要返回值
GROUP BY
select的欄位得要是可以被聚合的
同場加映datetime只想計算到日可以用這個
這種場合你select的日期要跟group by的一樣
補充:Date format
那想要去除特定條件的資料列怎麼辦...
and not?但效能是個問題-考驗邏輯的時候到了...
子查詢
SELECT的秘密
SELECT 1 FROM TABLE,SQL语句中的1代表什么意思
加索引
常用where查詢的條件建議加索引
(但索引不是只有優點,建立索引後欄位的增改速率都會下降)
一個條件就做單索引;多個條件就做多重索引(基本上就是照著你的where語句的順序~)
備份相關
mysqldump
- How can I create a mysql database (if it doesn't exist) or replace it (if it exists)?
- [MySQL] Mysqldump 備份&還原資料庫 – 指令範例
- MYSQL 權限帳號密碼匯出
解決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;
轉載自此