來(lái)源:guoziqing506 發(fā)布時(shí)間:2018-12-08 11:29:03 閱讀量:1396
之前我介紹了MySQL中,數(shù)據(jù)記錄的增、刪、改操作。本文我們看查詢操作。
為方便后面舉例,還是先建立一個(gè)表,并插入一些數(shù)據(jù)。我在這里依舊建立一個(gè)學(xué)生信息表,建表的代碼如下:
CREATE TABLE tab_student(
StuID CHAR(4),
Name VARCHAR(20),
Sender CHAR(1),
Age INT,
Math INT,
English INT,
Nationality VARCHAR(20)
);
1
2
3
4
5
6
7
8
9
插入一些數(shù)據(jù),然后是這樣的:
表建好了,也有了數(shù)據(jù),現(xiàn)在可以展開(kāi)查詢了。
1. 簡(jiǎn)單數(shù)據(jù)記錄查詢
1.1 查詢?nèi)繑?shù)據(jù)記錄
數(shù)據(jù)查詢用的是關(guān)鍵字SELECT,語(yǔ)法形式如下:
SELECT * FROM table_name;
1
其中,*表示表中的所有字段,就上面建立的表來(lái)說(shuō),查詢結(jié)果正是上圖。
1.2 查詢指定字段數(shù)據(jù)記錄
語(yǔ)法形式如下:
SELECT Att_1, Att_2, ... FROM table_name;
1
其實(shí)就是改變一下*符號(hào)。要查哪些字段,就用字段名稱替代*。舉個(gè)例子來(lái)看,還是上面這個(gè)表,我想查所有學(xué)生的姓名和年齡:
SELECT Name, Age FROM tab_student;
1
結(jié)果如下:
1.3 避免重復(fù)數(shù)據(jù)查詢
有時(shí),我們會(huì)面臨查詢的字段有重復(fù)的情況,比如上面的學(xué)生信息表中,我想知道學(xué)生的年齡都有哪些。如果直接查,會(huì)得到20, 20, 18, 19, 21, 20六項(xiàng)數(shù)據(jù),但是我實(shí)際上只要知道有18, 19, 20, 21 四個(gè)數(shù)據(jù)就行。
實(shí)現(xiàn)這種避免重復(fù)數(shù)據(jù)查詢,就需要用到關(guān)鍵字DISTINCT。語(yǔ)法形式如下:
SELECT DISTINCT Att_1, ATT_2, ... FROM table_name;
1
我們用DIDTINCT查詢一下學(xué)生年齡:
SELECT DISTINCT Age FROM tab_student;
1
1.3 實(shí)現(xiàn)四則運(yùn)算的數(shù)據(jù)查詢
有時(shí)會(huì)遇到這種情況,我們需要將字段中的一項(xiàng)或多項(xiàng)經(jīng)過(guò)一定的數(shù)學(xué)四則運(yùn)算后,再返回查詢結(jié)果。比如雇員表中記錄了雇員的月薪,而如果我要查年薪,那么最好將月薪數(shù)據(jù)乘12再返回查詢結(jié)果,再比如學(xué)生信息表中記錄了學(xué)生的每門課的成績(jī),我現(xiàn)在要查詢他們的總分。
語(yǔ)法形式很簡(jiǎn)單,只需要在要查詢的字段上加上四則運(yùn)算符號(hào)就行。比如,現(xiàn)在要查詢學(xué)生的兩門課的總分。代碼如下:
SELECT Name, Math + English FROM tab_student;
1
結(jié)果如下:
1.4 查詢結(jié)果的格式優(yōu)化
我們還可以通過(guò)連接字符串的函數(shù)CONCAT()來(lái)優(yōu)化查詢結(jié)果。比如還是上面查詢總分的例子,我現(xiàn)在希望查詢結(jié)果顯示為“誰(shuí)的總分是多少”這種形式,同時(shí)我還想給查詢結(jié)果起個(gè)名字叫"總分統(tǒng)計(jì)".
語(yǔ)法形式如下:
SELECT CONCAT(Name, '的總分為', Math + English) 總分統(tǒng)計(jì) FROM tab_student;
1
運(yùn)行結(jié)果如下:
2. 條件數(shù)據(jù)記錄查詢
2.1 簡(jiǎn)單的條件數(shù)據(jù)記錄查詢
我們用WHERE + condition的形式篩選出符合條件的數(shù)據(jù)元組。語(yǔ)法形式如下:
SELECT att_1, att_2, ... FROM table_name WHERE condition;
1
其中,‘condition’可以是一個(gè)條件,也可以是多個(gè)條件的組合。條件一般用關(guān)系運(yùn)算符(’>’, ‘<’, ‘=’, '!='之類)或者邏輯運(yùn)算符(‘AND’, ‘OR’, 'NOT’之類)表示。
舉個(gè)例子,我要查詢上面的學(xué)生信息表中Bob的兩門課的成績(jī),代碼如下:
SELECT Math, English FROM tab_student WHERE Name = 'Bob';
1
結(jié)果如下圖所示:
寫個(gè)更復(fù)雜一點(diǎn)的例子,我要查詢總分在250分以上的男生的全部信息:
SELECT * FROM tab_student WHERE Sender = 'M' AND Math + English > 250;
1
結(jié)果如下圖所示:
下面有幾種比較常用的條件中帶關(guān)鍵字的查詢,我大致介紹一下:
BETWEEN AND關(guān)鍵字。大于號(hào)、小于號(hào)的存在實(shí)際上是為了控制要查詢的字段數(shù)值的范圍。如果我們要查詢某個(gè)字段在區(qū)間[minVal, maxVal]之間,也可以用形如BETWEEN minVal AND maxVal的語(yǔ)句實(shí)現(xiàn)。同理,若要查詢某屬性值不在某區(qū)間內(nèi)的元組,只需要將代碼寫成NOT BETWEEN minVal AND maxVal即可。
IS NULL關(guān)鍵字。WHERE att IS NULL用來(lái)篩選出屬性值’att’為空的數(shù)據(jù)元組,同理,可以用WHERE att IS NOT NULL篩選出屬性值’att’不為空的數(shù)據(jù)元組
IN關(guān)鍵字。WHERE att IN set用來(lái)篩選出屬性值’att’在某個(gè)集合set中的數(shù)據(jù)元組,同理,NOT IN set表示對(duì)應(yīng)屬性不在set中的元組。需要注意的是,如果IN后面跟的集合中有NULL,則查詢結(jié)果是不受影響的,但是如果是NOT IN后面的集合中有NULL則不會(huì)查到任何結(jié)果。
2.2 模糊條件數(shù)據(jù)記錄查詢
很多時(shí)候我們的查詢條件并不是一個(gè)精確的值,而是具備某種特征的值的集合。比如在一張雇員表中,我要查詢姓"ZHANG"的雇員名單。由于雇員的姓名是寫在一起的,所以用=肯定不行了。這個(gè)時(shí)候就要用到關(guān)鍵字LIKE進(jìn)行模糊查詢。語(yǔ)法形式如下:
SELECT att_1, att_2 FROM table_name WHERE att LIKE value;
1
后面的WHERE att LIKE value為篩選條件,其中value一般為存在通配符的表達(dá)式。通配符大致有’%‘和"_"兩種,’%‘表示匹配任意長(zhǎng)度的字符串,而’_'表示匹配任意單個(gè)字符。比如,value是A%,則表示以A開(kāi)頭的字符串;_A%表示以A為第二個(gè)字符開(kāi)頭的字符串,而%A%表示任意含A的字符串。
其實(shí),LIKE關(guān)鍵字做模糊匹配在一些復(fù)雜情況下并不好用。不過(guò)好在MySQL也支持正則表達(dá)式,直接在WHERE后面跟正則表達(dá)式即可。正則表達(dá)式的語(yǔ)法我在這里省略了。感興趣的話,可以參考我之前寫的一篇關(guān)于Python中正則表達(dá)式的用法:Python–正則表達(dá)式
2.3 排序數(shù)據(jù)記錄查詢
可以用關(guān)鍵字ORDER BY對(duì)查詢出來(lái)的數(shù)組元組排序。語(yǔ)法形式如下:
SELECT att, ... FROM table_name ORDER BY att_1 ASC/DESC;
1
最后的ASC/DESC表示是以升序還是降序排列。其中,ASC表升序,而DESC表降序,默認(rèn)的排序方式為升序。
有時(shí),排序的規(guī)則會(huì)比較復(fù)雜。例如,我們需要先以att_1升序或降序排序,而對(duì)于任意att_1的值相等的元組則再以att_2升序或降序排序。語(yǔ)法形式也很簡(jiǎn)單:
SELECT att, ... FROM table_name ORDER BY att_1 ASC/DESC, att_2 ASC/DESC;
1
2.4 限制數(shù)據(jù)記錄查詢數(shù)量
查詢數(shù)據(jù)結(jié)果的數(shù)量用關(guān)鍵字LIMIT限制。語(yǔ)法形式如下:
SELECT att, ... FROM table_name WHERE condition LIMIT offset_start, row_count;
1
其中,offset_start表示數(shù)據(jù)記錄起始的偏移量,默認(rèn)值是0;而row_count表示數(shù)量限制。
2.5 統(tǒng)計(jì)函數(shù)的應(yīng)用
統(tǒng)計(jì)函數(shù)能夠直接在查詢的過(guò)程中,幫助我們得到對(duì)滿足條件的元組的相關(guān)計(jì)算。常用的統(tǒng)計(jì)函數(shù)有以下5種:
COUNT():計(jì)數(shù)功能,語(yǔ)法形式如下,其中COUNT(att)表示滿足條件的數(shù)據(jù)元組中屬性att非空的元組個(gè)數(shù):
SELECT COUNT(att) FROM table_name WHERE condition;
1
如果不關(guān)心att是否為空,只是想統(tǒng)計(jì)全表中滿足條件的元組個(gè)數(shù),可以使用COUNT(*)的形式。
AVG():求平均值,語(yǔ)法形式如下:
SELECT AVG(att) FROM table_name WHERE condition;
1
計(jì)算平均值時(shí),將忽略att為NULL的情況,也就是說(shuō),用所有att不為空的滿足條件的元組中att的數(shù)值加和后,再除att不為空的滿足條件的元組個(gè)數(shù)。
SUM():求和,語(yǔ)法形式如下。相關(guān)事項(xiàng)與AVG()函數(shù)一致,不多說(shuō)了:
SELECT SUM(att) FROM table_name WHERE condition;
1
MAX():求最大值;
MIN():求最小值;
這兩個(gè)函數(shù)更簡(jiǎn)單了,給出語(yǔ)法形式如下,其實(shí)這個(gè)形式可以同時(shí)查詢到最大最小值:
SELECT MAX(att), MIN(att) FROM table_name WHERE condition;
1
3. 分組數(shù)據(jù)記錄查詢
3.1 簡(jiǎn)單分組查詢
以學(xué)生信息表為例,假設(shè)每個(gè)學(xué)生有他們的國(guó)籍信息,我想要查詢出每個(gè)國(guó)家學(xué)生的平均分,這樣就得用到分組查詢了。分組查詢用關(guān)鍵字GROUP BY實(shí)現(xiàn)。語(yǔ)法形式如下:
SELECT * FROM table_name GROUP BY att_1;
1
查詢時(shí),先根據(jù)att_1將所有的數(shù)據(jù)元組分組,然后從每個(gè)分組中展示一個(gè)元組出來(lái)。也就是說(shuō),顯示的結(jié)果一共有k個(gè),k為分組數(shù)。舉個(gè)例子,以國(guó)籍分組,查詢代碼如下:
SELECT * FROM tab_student GROUP BY Nationality;
1
顯示的結(jié)果如下:
3.2 實(shí)現(xiàn)統(tǒng)計(jì)功能的分組查詢
其實(shí)上面這種分組實(shí)際應(yīng)用中并沒(méi)有多大意義。但是如果和統(tǒng)計(jì)函數(shù)結(jié)合起來(lái)就有用多了。比如學(xué)生信息表中,我想統(tǒng)計(jì)來(lái)自不同國(guó)家的學(xué)生人數(shù),平均分,總分等等。而如果我想知道來(lái)自各個(gè)國(guó)家的學(xué)生的姓名,也可以用函數(shù)GROUP_CONCAT()實(shí)現(xiàn)。語(yǔ)法形式如下:
SELECT GROUP_CONCAT(att_1) FROM table_name GROUP BY att_2;
1
表達(dá)的意思是以屬性att_2分組后,展示出每個(gè)分組的att_1的值。以上面表格為例,我要查詢來(lái)自每個(gè)國(guó)家的學(xué)生的姓名:
SELECT GROUP_CONCAT(Name) FROM tab_student GROUP BY Nationality;
1
查詢的結(jié)果如下:
3.3 多字段分組查詢
除了使用單字段進(jìn)行分組查詢之外,還可以使用多字段。比如:
SELECT att, ... FROM table_name GROUP BY att_1, att_2, ...;
1
這個(gè)語(yǔ)句實(shí)現(xiàn)的功能是先按att_1分組,在每個(gè)分組內(nèi)部,再按屬性att_2分組,。。。以此類推。
3.4 有條件限制的分組查詢
如果要對(duì)分組進(jìn)行條件限制,就要用到HAVING關(guān)鍵字了。注意,之前用的WHERE關(guān)鍵字是對(duì)數(shù)據(jù)元組進(jìn)行條件限制的,而HAVING限制的是分組。語(yǔ)法形式如下:
SELECT att, ... FROM table_name WHERE condition_1 GROUP BY att_1 HAVING condition_2;
1
這個(gè)語(yǔ)句的意思是先篩選出滿足condition_1的元組,并根據(jù)att_1進(jìn)行分組,最后找出這些分組中滿足條件condition_2的分組。
舉個(gè)例子,我要查出每個(gè)國(guó)家的學(xué)生信息,并且要求這些國(guó)家的學(xué)生的數(shù)學(xué)平均分大于120:
SELECT * FROM tab_student GROUP BY Nationality HAVING AVG(Math) > 120;
1
---------------------
作者:guoziqing506
來(lái)源:CSDN
原文:https://blog.csdn.net/guoziqing506/article/details/84727288
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信