這是MySQL系列筆記的第一部分,本系列筆記但願能按照筆者本身學習MySQL技術的經從來記錄,避免純粹按照內容一塊一塊總結,也就是不一樣於通常按內容分配章節的書籍的結構,有一個平滑的閱讀曲線。內容比較豐富的技術點會按照專題在多個學習筆記中逐漸深刻。html
這部分的標題叫比CRUD多一丁點兒,比起最基礎的w3c的SQL教程以外,只多一點的擴展,知足應付從純粹閱讀入門資料到能夠上手完成一個簡單的工做的需求。mysql
第二篇的主要內容是基礎SQL語句,會根據我工做中的經驗,每一個語句多介紹一點實際開發中比較常見的用法。sql
SQL是Structure Query Language
的簡寫。SQL並不僅是用來跟數據庫,而是一種完備編程語言,在各類編程語言排行榜上也都是名列前茅。SQL語言的歷史和C語言同樣長,從1970年Codd博士將數據庫領域逐漸發揚光大至今近半個世紀,已經能夠算是編程語言中的老人了。筆者認爲伴隨着關係數據庫(RDBMS)產生的SQL語言隨着軟件底層技術的日益成熟,軟件應用日益滲透到生活方方面面,軟件開發教育也愈來愈普及(好比前段時間有江蘇省已經將Python語言列入高考),將來可能掌握SQL語言的工程師會遠遠多於掌握C語言的工程師。數據庫
同其餘語言相似,SQL有標準組織出具的規範,但不一樣的數據庫也有本身的不一樣的實現。可類比爲各類語言有本身的標準,也有不一樣的編譯器(或解釋器等)的實現,相信作C++開發的都會被微軟的VC編譯器和GNU組織的GCC編譯器的細微不一樣而苦惱的經歷。這個問題在SQL語言領域應該是更大一些,不一樣的數據庫SQL實現有不小的區別,但基本的看SQL語言能夠分爲三類:編程
DML(Data Manipulation Language):數據操縱語句,用戶增刪查改數據庫記錄,包括insert, select, update, delete,也就是咱們文章標題裏面常說CRUD(create read update delete)時候指代的這四個語句。可能入門學習時候通常說的SQL就是指這種類型的。本篇基礎SQL語句
其實也只會介紹此類。數組
DDL(Data Definition Language):數據定義語言,定義數據庫、數據表、列、索引等。包括create, drop, alter等。安全
DCL(Data Control Language):數據控制語句,用於控制不一樣數據的訪問權限,配置密碼等。暴扣grant, revoke。編程語言
本文下來分別介紹DML中的INSERT
,SELECT
,UPDATE
,DELETE
。函數
最簡單的形式以下:學習
insert into table_name(id, cardno, `name`, `desc`) values('1', 100001, "good", "good boy");
複製代碼
第一個括號裏是列名,第二個括號裏是對應順序的值。
一次插入多條數據:
insert into table_name(id, cardno, `name`, `desc`) values('1', 100001, "good", "good boy"),('2', 100002, "bad", "bad girl");
複製代碼
順帶說幾個常見的小問題,在上面的寫法裏出現的:
desc
,select
這種SQL的關鍵字和保留字時候必須使用,不然是會報語法錯誤的。select
是關鍵字,desc
是保留字具體可看手冊。實際上人腦也不會記憶這些關鍵字,因此在使用時候就全都使用轉義就行了。學海無涯,每種技術的縮寫、特例等等層出不窮,筆者的習慣是記憶一種比較通用和安全的用法,始終去使用便可。由於不少技術點的多種方法也是一項技術發展的歷史緣由形成的,並非說都記着多種辦法會有切實的場景。若是表本身建立時候,推薦的作法就仍是要過一遍上述連接中的保留字,直接不要使用這些詞爲好,畢竟這個選名字的時間在建表作設計階段總的時間比起來並不會佔用多少比例。筆者遇到的一些ORM庫之類對這些關鍵字可能並非處理的十全十美,因此不用是最佳。'
引發來。用'
不用"
還有一個好用的地方是當輸入字符串裏面有雙引號"
時候,能夠免於寫一級轉義。這是很經常使用的技巧,當進行數據導入時候會碰到插入的數據須要從另外一個表中獲取,可使用insert into ... select
的寫法。
例若有供應商和顧客兩張表,有一部分列內容是重合的,就以下寫法
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;
複製代碼
但注意,在statement-based的同步中,這種語句是並不安全的。相似的用法還有 INSERT ... ON DUPLICATE KEY UPDATE , INSERT IGNORE。能夠看手冊中的詳細介紹。
最基礎的再也不贅述,SELECT用法的內容最豐富,後續會專門開一個題。這裏說幾個常見的Tips。
首先是注意NULL,建表應該避免用NULL值,全部列均可以賦予一個默認值。由於NULL在SELECT、索引、統計函數等不少場合都會有一些讓人Surprise的現象,後續可能會單獨寫一篇關於NULL的博客。
查找NULL時候用IS NULL
, IS NOT NULL
,若是NULL值須要轉換,須要用好關於NULL的幾個函數IFNULL()
, ISNULL()
, COALESCE()
IFNULL(exp,value)
能夠用在語句中代替exp的位置,表示當exp不爲NULL時候使用value中的值替代。ISNULL(exp)
作邏輯判斷COALESCE(....)
函數是個多值函數,意思是返回這多個參數中按順序第一個非NULL的值。在各類操做符號如>
,<
,=
後使用ANY和ALL能夠表示任意一個和全部的意思。
好比查詢比任意Alert表中id大的Account表值:
select id from Account where id > ANY (select id from Alert);
複製代碼
好比查詢比本身的id還大的(^_^結果固然是沒有)
select id from Account where id > ALL (select id from Account);
複製代碼
GROUP BY的基本用法比較常見,但統計函數除了count,sum等還有幾個經常使用的聚合函數(Aggregate Function)。
鏈接函數 group_concat會將分組內的值組裝爲一個逗號分隔的數組
select ag.id, ag.name, group_concat(a.id) as resource_ids from AccountGroup ag left join AccountGroup_Account aga on ag.id=aga.account_group_id left join Account a on aga.account_id=a.id group by ag.id;
複製代碼
返回會是相似
+----+------------------------------------+--------------+
| id | name | resource_ids |
+----+------------------------------------+--------------+
| 1 | admin | 1,2,3 |
+----+------------------------------------+--------------+
複製代碼
count函數能夠加distinct表示去重
SELECT COUNT(DISTINCT results) FROM student;
複製代碼
更多能夠看手冊