Mysql你必須知道的查詢語句

引言

在Mysql數據庫的操作中有核心的兩種語言,一種是DDL(Data Definition Language),翻譯爲數據定義語言,它主要是對數據庫,表的創建,修改和刪除。另外一種叫DML(Data Manipulation Language),翻譯爲數據操作語言,它主要是對錶數據的插入,查詢,修改和刪除,也稱之爲CRUD(Create、Read、Update、Delete)操作。在本篇博文中,主要是介紹了在DML中的一些不太常用,但是很核心的命令,主要包括JOIN操作,子查詢,DISTINCT操作,GROUP BY,IN和BERWEEN等等。筆者目前整理的一些blog針對面試都是超高頻出現的。大家可以點擊鏈接:http://blog.csdn.net/u012403290

技術點

所有DML的命令的演示,需要有數據庫表,然而數據表之間的邏輯,我們用ER建模來描述表與表之間的關係。

1、Crow`s foot表示法
是一種ER建模的表現模式,實體標識爲矩形框,關係標識爲矩形框之間的線,線兩端的形狀表示關係的基數。空心圓表示零或多,單陰影線表示一或多,單陰影線和空性圓表示零或一,雙陰影線表示有且僅唯一。在維基百科中有這麼一張圖片,我給它加了描述:
這裏寫圖片描述

它所表達的就是,在Song實體一方存在空心圓,表示0,1或者更多。靠近Artist實體一方的雙豎線表示1有且只爲1。所以它整體所要表現的是一個藝術家可以表演0首,1首或者更多的歌曲。

一個例子

在測試每一個命令之前,我們需要定義一個數據模型。以下是它們之間的Crow`s foot 表示的ER圖:
這裏寫圖片描述
在上面的圖中,描述了這麼一種場景:
用戶註冊了應用之後,會在user表中增加一條用戶數據,相應的會在token中增加一條屬於該用戶的token,它們之間的關係是一個用戶只擁有一個tokne。在應用上購買產品,購買一次就會在order表中增加一條數據,它們之間的關係就是一個用戶可以擁有0個、1個或者多個購買記錄。interest表表示興趣類型,user_interest表示用戶關聯興趣,它們之間的關係就是用戶可以有1個或者多個興趣,一個興趣被一個或者多個用戶所關聯。且各個表單內容如下:
user表:
這裏寫圖片描述

token表:
這裏寫圖片描述

order表:
這裏寫圖片描述
注意圖片中上面在select的時候並不成功,因爲order是mysql的保存關鍵字。說明我這個例子並不是很完美,不過如果涉及到關鍵字,你可以用‘order’來包含它就可以正常使用。

interest表:
這裏寫圖片描述

user_interest表:
這裏寫圖片描述

匹配符

mysql有兩個通配符,“_”匹配任意單個字符,“%”匹配任意多個字符
比如說我要在user表中查詢開始爲si,共有5個字符名字的用戶,可以這麼描述:
select * from user where name like ‘si___’;#注意這裏有3個“_”。
這裏寫圖片描述

再比如說我要在user表中查詢已t開頭爲名字的用戶,可以這麼描述:
select * from user where name like ‘t%’;
這裏寫圖片描述

範圍操作符

mysql有兩個範圍操作符,“IN”和“BETWEEN”。
比如說我要在order表中查找價格爲100和200的訂單記錄,可以這麼描述:
select * from order where price in(100,200);
這裏寫圖片描述

再比如說,我要在order表中查找,價格介於150到200區間的訂單記錄,可以這麼描述:
select * from order where price between 150 and 200;
這裏寫圖片描述

去除重複數據

mysql中我們用DISTINCT來獲取不重複的唯一值。
比如說我們要在order表中查看哪些用戶買過產品,也就是要去除單個用戶多次購買的記錄,那麼我們可以這麼描述:
select distinct user_id from order;
這裏寫圖片描述
當然,這裏還是不夠徹底可以看出那些用戶,在後面會繼續說這個問題。

分組統計

mysql中用GROUP BY 來進行分組統計。
比如說我要查看order表,按照各個價位查看訂單,那麼我們可以這麼描述:
select * from order group by price;#在這種情況下,訂單列表會按照訂單價格出現的次數進行降序排列,比如說在這個例子中price=100出現了兩次,那麼它就會在篩選的頭部:
這裏寫圖片描述

聚集函數

mysql中有很多函數,最常用的包括:COUNT,計算總量;MIN,尋找最小;MAX,尋找最大;AVG,平均值;SUM,求和;
比較簡單,就不貼圖了,比如說你要計算一共有多少用戶,可以直接這樣描述:
select count(*) from user;

比如你要計算訂單總共有多少錢,那麼你可以這麼描述:
select sum(price) from order;

並集操作

mysql中主要用UNION和UNION ALL進行並集操作,他們的用途主要是把兩個結果集合併爲一個,但是UNION比UNION ALL 更快捷。UNION在做並集的時候,會去除重複的數據。同時要注意一點,如果要把兩個結果集進行並操作,那麼你必須保證他們的列數是相等的,如果不相等會提示:The used SELECT statements have a different number of columns 錯誤。還需要注意的一點是,它的列名會複用你前面一張表的列名,比如說在例子中,user_interest表與order表一樣都是有3列,那麼我們可以對他們進行並操作,描述如下:
select * from user_interest union select * from order;
這裏寫圖片描述

JOIN鏈接

join鏈接操作鏈接的表越多,那麼函數嵌套的層數也會越多,算法複雜度就會呈指數增長。同時,join操作分爲三種:①等值鏈接,INNER JOIN,其中INNER可以省略;②左外連接,LEFT JOIN;③右外連接,RIGHT JOIN。

等值鏈接:
比如說我們要直觀的查看哪些用戶購買了產品,那麼最好的顯示就是用戶信息+該用戶所對應的消費信息,那麼我們可以這麼描述爲:
select * from user u join order o on u.user_id = o.user_id;
在上面的描述中, user u的意思就是用u這個簡單的字符來代替user這個複雜的描述,在後面的on條件中我們就可以直接用u.user_id來描述實體的屬性。同理order表也是如此,用o來代替。上面的描述翻譯過來就是:關聯查詢user表和order表,在user_id相等的情況下。
這裏寫圖片描述

左外連接:
通俗的說就是,假如A,B兩表進行左外連接,那麼它會展示所有A表的數據,那麼A表對應條目在B表是空的情況。
比如說上面的情況,我要查看所有用戶,直觀的看出哪些用戶沒有購買產品,那麼我們可以這麼描述:
select * from user u left join order o on u.user_id = o.user_id;
這裏寫圖片描述
在上面的圖中可以看出,user表所有的用戶都會展現出來,即使這個linda完全沒有購買產品也會展示出來。

右外連接:
和左外連接恰恰相反的,它會展示出所有的B表的數據,哪怕A表的數據是空。所以右外連接很少使用,因爲它很容易就可以轉換成左外連接。我們把上面的情況改變一下,換一種形式:
select * from order o right join user u on o.user_id = u.user_id;
那麼結果是剛好相反的,NULL出現了在左邊:
這裏寫圖片描述

在這裏,我想說明一下mysql中NULL值,在mysql中判斷NULL值一般都是用IS NULL或者IS NOT NULL,不能用操作符 ==和!=來描述。因爲NULL是一個特殊的值。

子查詢

子查詢也是屬於一種嵌套查詢,而且特別好理解。
比如說我要查詢那些用戶購買了200產品,那麼我們用子查詢就可以這麼描述:
select * from user where user_id = (select user_id from order where price = 200);
這裏寫圖片描述

這裏我們要注意這個“=”號,在子查詢的結果唯一的時候我們可以用“=”號來進行關聯,但是如果子查詢有很多的返回,那麼就要用我們前面說到的IN的範圍操作符了。比如說我要查詢誰購買了價格爲100的產品,在本例子中價格爲100的有兩條,如果用“=”號來鏈接就會拋出這個錯誤:Subquery returns more than 1 row。而用IN來描述就可以:
這裏寫圖片描述

尾記

在日常的操作數據庫的過程中,其實很少如上面的例子一樣操作的。可以採用一些mysql工具,比如說:Sqlyog,Navicat,甚至是mysql workbench等等。博主比較喜歡Sqlyog,用起來方便實用。同時,很多工具都可以根據的設計的數據庫,給你生成一個對應的ER圖,下圖是我用sqlyog自動生成的brickwork庫的ER圖:
這裏寫圖片描述

希望對大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章