亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

MySQL基本操作四:數(shù)據(jù)的查詢

來源: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)載請附上博文鏈接!


分享:
評論:
你還沒有登錄,請先