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