




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
7單表數據記錄查詢第章7.1基本查詢語句單表查詢是指從一張數據表中查詢所需要的數據。在MySQL中查詢數據的基本語句是SELECT語句,其基本語法格式如下:SELECT {*|<字段列表>} [ FROM<表1>,<表2>… [WHERE<表達式> [GROUPBY<groupbydefinition>] [HAVING<expression>[{<operator><expression>}…]] [ORDERBY<orderbydefinition>] [LIMIT[<offset>,]<rowcount>] ];7.2簡單數據記錄查詢簡單數據記錄查詢主要包括:查詢所有字段、查詢指定字段、查詢指定記錄、多條件查詢、排序查詢等。本節將以第5章創建的goods表為操作對象,講解簡單數據記錄查詢的具體實現方法,如果表內還沒有數據,執行以下語句在其中插入數據。INSERTINTOgoods(id,type,name,price,num,add_time)VALUES(1,'書籍','西游記',50.4,20,'2018-01-0113:40:40'),(2,'糖類','牛奶糖',7.5,200,'2018-02-0213:40:40'),(3,'糖類','水果糖',2.5,100,null),(4,'服飾','休閑西服',800,null,'2018-04-0413:40:40'),(5,'飲品','果汁',3,70,'2018-05-0513:40:40');查詢所有字段數據,是指從一張表中檢索出所有記錄,查詢方式有兩種,一種是使用通配符“*”,另一種是列出所有字段名,語法形式如下:SELECT{*|col_list}FROMtable_name;【實例7-1】使用通配符“*”查詢goods表中所有數據,SQL語句及其執行結果如下。mysql>SELECT*FROMgoods;+----+--------+--------------+--------------+--------------+-----------------------------+|id|type |name |price |num |add_time |+----+--------+--------------+--------------+--------------+-----------------------------+|1|書籍 |西游記 |50.40 |20 |2018-01-0113:40:40 ||2|糖類 |牛奶糖 |7.50 |200 |2018-02-0213:40:40 ||3|糖類 |水果糖 |2.50 |100 |NULL ||4|服飾 |休閑西服 |800.00 |NULL |2018-04-0413:40:40 ||5|飲品 |果汁 |3.00 |70 |2018-05-0513:40:40 |+----+--------+--------------+--------------+--------------+-----------------------------+5rowsinset(0.00sec)通過在SELECT關鍵字后面列出所有字段名,也可以查詢所有列數據,SQL語句如下,其查詢結果與實例7-1的結果相同。SELECTid,type,name,price,num,add_timeFROMgoods;
知識庫一般使用通配符查詢表中所有字段數據;而使用列出字段名的方式查詢部分字段數據。使用SELECT關鍵字也可以查詢指定字段的數據,語法形式如下:SELECTcol_name1[,col_name2,……,col_namen]FROMtable_name;【實例7-2】從goods表中查詢單個字段。mysql>SELECTnameFROMgoods;+--------------+|name|+--------------+|休閑西服||果汁||水果糖||牛奶糖||西游記|+--------------+5rowsinset(0.00sec)【實例7-3】從goods表中查詢多個字段。mysql>SELECTid,nameFROMgoods;+----+--------------+|id|name|+----+--------------+|4|休閑西服||5|果汁||3|水果糖||2|牛奶糖||1|西游記|+----+--------------+5rowsinset(0.00sec)當用戶需要查詢數據庫中符合一定條件的數據時,可以使用WHERE子句對表中的記錄進行篩選,語法形式如下:SELECT{*|col_list}FROMtable_nameWHEREcondition;WHERE子句中可以使用多種條件判斷符,如表7-1所示。表7-1WHERE子句中可用的條件判斷符條件判斷符說
明=相
等<
小
于>
大
于<>(!=)不相等<=小于或者等于>=大于或者等于注:“<>”和“!=”功能相同。使用“=”符號查詢1【實例7-4】從goods表中查詢id值為3的記錄。SQL語句及其執行結果如下:mysql>SELECT*FROMgoodsWHEREid=3;+----+----------+-----------+----------+----------+-----------------+|id|type |name|price |num |add_time|+----+----------+-----------+----------+----------+-----------------+|3|糖類 |水果糖|2.50 |100 |NULL |+----+----------+-----------+----------+----------+-----------------+1rowinset(0.06sec)【實例7-5】從goods表中查詢type值為“糖類”的記錄。SQL語句及其執行結果如下:mysql>SELECT*FROMgoodsWHEREtype='糖類';+----+--------+-----------+--------+--------+-------------------------------+|id|type|name|price|num|add_time |+----+--------+-----------+--------+--------+-------------------------------+|2|糖類|牛奶糖|7.50|200|2018-02-0213:40:40 ||3|糖類|水果糖|2.50|100|NULL |+----+--------+-----------+--------+--------+-------------------------------+2rowsinset(0.00sec)使用“>=”符號查詢2【實例7-6】從goods表中查詢num值大于等于100的記錄。SQL語句及其執行結果如下:mysql>SELECT*FROMgoodsWHEREnum>=100;+----+----------+-----------+----------+----------+-----------------------------+|id|type |name |price |num |add_time |+----+----------+-----------+----------+----------+-----------------------------+|2|糖類 |牛奶糖|7.50 |200 |2018-02-0213:40:40||3|糖類 |水果糖|2.50 |100 |NULL |+----+----------+-----------+----------+----------+-----------------------------+2rowsinset(0.00sec)使用AND關鍵字查詢1MySQL支持多條件查詢,如果條件之間使用AND關鍵字連接,那么只有符合所有條件的記錄才會被返回?!緦嵗?-7】從goods表中查詢price值大于50,并且id值大于3的記錄。SQL語句及其執行結果如下:mysql>SELECT*FROMgoodsWHEREprice>50ANDid>3;+----+----------+-----------------+----------+------------+-----------------------------+|id|type|name|price|num|add_time |+----+----------+-----------------+----------+------------+-----------------------------+|4|服飾|休閑西服|800.00|NULL|2018-04-0413:40:40|+----+----------+-----------------+----------+------------+-----------------------------+1rowinset(0.06sec)使用OR關鍵字查詢2如果多條件查詢中的條件使用OR關鍵字連接,表示只需要符合所有條件中的一個條件,此記錄就會被返回。【實例7-8】從goods表中查詢type值為“糖類”或者“書籍”的記錄。SQL語句及其執行結果如下:mysql>SELECT*FROMgoodsWHEREtype='糖類'ORtype='書籍';+----+----------+-----------+----------+----------+----------------------------+|id|type |name|price |num |add_time |+----+----------+-----------+----------+----------+----------------------------+|1|書籍|西游記|50.40|20 |2018-01-0113:40:40||2|糖類|牛奶糖|7.50|200 |2018-02-0213:40:40||3|糖類|水果糖|2.50 |100 |NULL |+----+----------+-----------+----------+----------+-----------------------------+3rowsinset(0.00sec)
提示AND關鍵字可以使用符號“&&”代替;OR關鍵字可以使用符號“||”代替。使用IN關鍵字查詢3使用IN關鍵字可以查詢字段值等于指定集合中任意一個值的記錄,語法形式如下:【實例7-9】執行SQL語句,查詢goods表中id值為1和3的記錄,結果如下:mysql>SELECT*FROMgoodsWHEREidIN(1,3);+----+----------+-----------+----------+----------+-----------------------------+|id|type |name |price |num |add_time |+----+----------+-----------+----------+----------+-----------------------------+|1|書籍 |西游記|50.40 |20 |2018-01-0113:40:40||3|糖類 |水果糖|2.50 |100 |NULL |+----+----------+-----------+----------+----------+-----------------------------+2rowsinset(0.01sec)SELECT{*|col_list}FROMtable_nameWHEREcol_nameIN(value1,value2,……valuen);SELECT*FROMgoodsWHEREid=1ORid=7;使用IN關鍵字查詢3另外,IN關鍵字還可以與NOT關鍵字配合使用,作用是查詢字段值不在指定集合中的記錄。【實例7-10】執行SQL語句,查詢goods表中id值不為1和3的記錄,結果如下:mysql>SELECT*FROMgoodsWHEREidNOTIN(1,3);+----+----------+--------------+-------------+-----------+-------------------------------+|id|type|name|price|num|add_time |+----+----------+--------------+-------------+-----------+-------------------------------+|2|糖類|牛奶糖|7.50|200|2018-02-0213:40:40 ||4|服飾|休閑西服|800.00|NULL|2018-04-0413:40:40 ||5|飲品|果汁|3.00|70|2018-05-0513:40:40 |+----+----------+--------------+-------------+-----------+-------------------------------+3rowsinset(0.00sec)MySQL提供ISNULL關鍵字,用于查詢字段值為NULL的記錄,語法形式如下:SELECT{*|col_list}FROMtable_nameWHEREcol_nameISNULL;【實例7-11】執行SQL語句,查詢goods表中num值為NULL的記錄,結果如下:mysql>SELECT*FROMgoodsWHEREnumISNULL;+----+----------+-----------------+----------+--------+----------------------------+|id|type|name|price|num|add_time |+----+----------+-----------------+----------+--------+-----------------------------+|4|服飾|休閑西服|800.00|NULL|2018-04-0413:40:40|+----+----------+-----------------+----------+--------+-----------------------------+1rowinset(0.02sec)ISNULL也可以和NOT關鍵字配合使用,用于查詢字段值不為NULL的記錄?!緦嵗?-12】執行SQL語句,查詢goods表中num值不為NULL的記錄,結果如下:mysql>SELECT*FROMgoodsWHEREnumISNOTNULL;+----+----------+-----------+----------+----------+-----------------------------+|id|type|name|price |num |add_time |+----+----------+-----------+----------+----------+-----------------------------+|1|書籍|西游記|50.40 |20 |2018-01-0113:40:40||2|糖類|牛奶糖|7.50 |200 |2018-02-0213:40:40||3|糖類|水果糖|2.50 |100 |NULL ||5|飲品|果汁 |3.00 |70 |2018-05-0513:40:40|+----+----------+-----------+----------+----------+-----------------------------+4rowsinset(0.00sec)需要注意的是,如果某些字段值為NULL,在將這些字段與其他值進行比較時,就會返回不準確的數據?!緦嵗?-13】執行SQL語句,查詢goods表中num值不等于100的記錄,查詢結果如下:mysql>SELECT*FROMgoodsWHEREnum<>100;+----+--------+----------+------------+----------+----------------------------------------+|id|type|name |price |num |add_time |+----+--------+----------+------------+----------+----------------------------------------+|1|書籍 |西游記 |50.40 |20 |2018-01-0113:40:40 ||2|糖類 |牛奶糖 |7.50 |200 |2018-02-0213:40:40 ||5|飲品|果汁 |3.00 |70 |2018-05-0513:40:40 |+----+--------+----------+------------+-----------+---------------------------------------+3rowsinset(0.00sec)通過前面的學習可以知道,如果要查詢goods表中商品的種類,直接查詢表示“種類”的字段即可。【實例7-14】執行SQL語句,查詢goods表中字段type的值,結果如下。mysql>SELECTtypeFROMgoods;+----------+|type |+----------+|書籍 ||糖類 ||糖類 ||服飾 ||飲品 |+----------+5rowsinset(0.00sec)MySQL提供了DISTINCT關鍵字,使查詢結果不重復。其語法形式如下:SELECTDISTINCTcol_listFROMtable_name;【實例7-15】執行SQL語句,查詢goods表中字段type不重復的值,結果如下:mysql>SELECTDISTINCTtypeFROMgoods;+----------+|type |+----------+|書籍 ||糖類 ||服飾 ||飲品 |+----------+4rowsinset(0.04sec)MySQL提供BETWEENAND關鍵字,用于查詢字段值在某個范圍內的記錄,語法形式為:【實例7-16】執行SQL語句,查詢goods表中price值為2.5到50的商品名稱和價格,結果如下:mysql>SELECTname,priceFROMgoodsWHEREpriceBETWEEN2.5AND50;+----------+----------+|name |price |+----------+----------+|牛奶糖 |7.50 ||水果糖 |2.50 ||果汁 |3.00 |+----------+----------+3rowsinset(0.00sec)【實例7-17】執行SQL語句,查詢goods表中price值不在2.5和50之間的商品名稱和價格,結果如下:mysql>SELECTname,priceFROMgoodsWHEREpriceNOTBETWEEN2.5AND50;+----------------+----------+|name |price |+----------------+----------+|西游記 |50.40 ||休閑西服 |800.00 |+----------------+----------+2rowsinset(0.00sec)SELECT{*|col_list}FROMtable_nameWHEREcol_nameaBETWEENvalue1ANDvalue2;使用LIKE關鍵字的查詢又稱為模糊查詢,通常用于查詢字段值包含某些字符的記錄,語法形式如下:SELECT{*|col_list}FROMtable_nameWHEREcol_nameaLIKEvalueb;通配符“%”1通配符“%”可以匹配任意長度的字符,可以是0個,也可以是1個或多個。【實例7-18】執行SQL語句,查詢goods表中name值以“果”開頭的記錄,結果如下:mysql>SELECT*FROMgoodsWHEREnameLIKE'果%';+----+--------+-------+----------+----------+-------------------------------+|id|type|name|price|num|add_time |+----+--------+-------+----------+----------+-------------------------------+|5|飲品|果汁|3.00|70|2018-05-0513:40:40 |+----+--------+-------+----------+----------+-------------------------------+1rowinset(0.00sec)執行以下語句,可查詢goods表中name值以“糖”結尾的記錄。SELECT*FROMgoodsWHEREnameLIKE'%糖';通配符“%”1執行以下語句,可查詢goods表中name值包含“游”的記錄。SELECT*FROMgoodsWHEREnameLIKE'%游%';執行以下語句,可查詢goods表中name值以“休”開頭,以“服”結尾的記錄。SELECT*FROMgoodsWHEREnameLIKE'休%服';通過以上多個語句可以看出,通配符“%”可以出現在匹配字符的任意位置,并且可以匹配任意數目的字符。使用LIKE關鍵字的查詢又稱為模糊查詢,通常用于查詢字段值包含某些字符的記錄,語法形式如下:SELECT{*|col_list}FROMtable_nameWHEREcol_nameaLIKEvalueb;通配符“_”2通配符“_”的使用方法與通配符“%”類似,都可以出現在匹配字符的任意位置,但通配符“_”只能匹配一個字符?!緦嵗?-19】執行SQL語句,查詢goods表中name值以“西”開頭,“西”后有兩個字符的記錄,結果如下所示。mysql>SELECT*FROMgoodsWHEREnameLIKE'西__';+----+--------+-------------+----------+----------+-----------------------------+|id|type|name |price |num |add_time |+----+--------+-------------+----------+----------+-----------------------------+|1|書籍|西游記 |50.40 |20 |2018-01-0113:40:40|+----+--------+-------------+----------+----------+-----------------------------+1rowinset(0.00sec)如果要查詢goods表中name值以“西”開頭,“西”后有一個字符的記錄,則執行以下語句即可。SELECT*FROMgoodsWHEREnameLIKE'西_';使用前面的方法查詢到的結果是按照記錄在表中的默認順序進行排列的。如果需要將查詢結果按照指定的順序排列,可以使用ORDERBY關鍵字。語法形式如下:SELECT{*|col_list}FROMtable_nameORDERBYcol_namea[ASC|DESC];單字段排序1在排序之前最好將有空值的記錄補充完整,否則,空值記錄將被排在最前面。【實例7-20】執行SQL語句,查詢goods表中id、name和add_time字段的數據,并按照add_time字段值進行排序,結果如下:mysql>SELECTid,name,add_timeFROMgoodsORDERBYadd_time;+----+--------------+-------------------------------+|id|name|add_time |+----+--------------+-------------------------------+|1|西游記|2018-01-0113:40:40 ||2|牛奶糖|2018-02-0213:40:40 ||4|休閑西服|2018-04-0413:40:40 ||5|果汁|2018-05-0513:40:40 ||3|水果糖|2018-06-0911:20:55 |+----+--------------+-------------------------------+5rowsinset(0.00sec)多字段排序2有些情況下,可能需要使用多個字段作為排序條件對查詢結果進行排序。為查看查詢結果,此處將第5條記錄的price值改為2.5(與第3條記錄值相同)?!緦嵗?-21】執行SQL語句,查詢goods表中所有記錄,并按照price和num字段值進行排序,結果如下:mysql>SELECT*FROMgoodsORDERBYprice,num;+----+--------+-------------+----------+----------+-----------------------------+|id |type|name|price |num |add_time |+----+--------+-------------+----------+----------+-----------------------------+|5|飲品|果汁|2.50|70 |2018-05-0513:40:40 ||3|糖類|水果糖|2.50|100 |2018-06-0911:20:55 ||2|糖類|牛奶糖|7.50|200 |2018-02-0213:40:40 ||1|書籍|西游記|50.40|20 |2018-01-0113:40:40 ||4|服飾|休閑西服|800.00 |10 |2018-04-0413:40:40 |+----+--------+-------------+----------+----------+-----------------------------+5rowsinset(0.00sec)降序排序3如果需要對查詢結果進行降序排序,可以使用DESC關鍵字?!緦嵗?-22】執行SQL語句,將goods表中所有記錄查詢出來,并按照price字段降序排序,結果如下:mysql>SELECT*FROMgoodsORDERBYpriceDESC;+----+--------+--------------+---------+----------+-----------------------------+|id|type|name|price |num |add_time |+----+--------+--------------+---------+----------+-----------------------------+|4|服飾|休閑西服|800.00|10 |2018-04-0413:40:40||1|書籍|西游記|50.40|20 |2018-01-0113:40:40||2|糖類|牛奶糖|7.50|200 |2018-02-0213:40:40||3|糖類|水果糖|2.50|100 |2018-06-0911:20:55||5|飲品|果汁|2.50|70 |2018-05-0513:40:40|+----+--------+--------------+---------+----------+-----------------------------+5rowsinset(0.00sec)降序排序3在按照多字段排序時,也可以使用DESC關鍵字進行降序排序?!緦嵗?-23】執行SQL語句,查詢goods表中所有記錄,并按照price字段和num字段進行排序,結果如下:mysql>SELECT*FROMgoodsORDERBYpriceDESC,num;+----+--------+--------------+---------+----------+-----------------------------+|id|type|name|price |num |add_time |+----+--------+--------------+---------+----------+-----------------------------+|4|服飾|休閑西服|800.00|10 |2018-04-0413:40:40||1|書籍|西游記|50.40|20 |2018-01-0113:40:40||2|糖類|牛奶糖|7.50|200 |2018-02-0213:40:40||5|飲品|果汁|2.50|70 |2018-05-0513:40:40||3|糖類|水果糖|2.50|100 |2018-06-0911:20:55|+----+--------+--------------+---------+----------+-----------------------------+5rowsinset(0.00sec)實際應用中,數據庫中的數據量通常是很大的,一般不會一次性將所有數據查詢出來,此時就需要使用LIMIT關鍵字來限制查詢結果的數量。語法形式如下:SELECT{*|col_list}FROMtable_nameLIMIT[offset_start,]row_count;【實例7-24】執行SQL語句,將goods表中的前3條記錄查詢出來,結果如下:mysql>SELECT*FROMgoodsLIMIT3;+----+--------+-----------+------------+----------+-----------------------------+|id|type|name|price |num |add_time |+----+--------+-----------+------------+----------+-----------------------------+|1|書籍|西游記|50.40 |20 |2018-01-0113:40:40||2|糖類|牛奶糖|7.50 |200 |2018-02-0213:40:40||3|糖類|水果糖|2.50 |100 |2018-06-0911:20:55|+----+--------+-----------+------------+----------+-----------------------------+3rowsinset(0.00sec)如果指定起始位置(從0開始),則系統會從起始位置開始查詢,返回總條數為顯示條數的記錄?!緦嵗?-25】執行SQL語句,返回goods表中從第3條記錄開始,總條數為3的記錄,結果如下:mysql>SELECT*FROMgoodsLIMIT2,3;+----+--------+--------------+---------------+----------+-----------------------------+|id|type|name|price|num|add_time |+----+--------+--------------+---------------+----------+-----------------------------+|3|糖類|水果糖|2.50|100|2018-06-0911:20:55||4|服飾|休閑西服|800.00|10|2018-04-0413:40:40||5|飲品|果汁|2.50|70|2018-05-0513:40:40|+----+--------+--------------+---------------+----------+-----------------------------+3rowsinset(0.00sec)步驟1
進入NavicatforMySQL后,選擇要操作的數據庫,然后選中需要操作的表,此處為goods,單擊“打開表”按鈕。步驟2
單擊“篩選”按鈕,打開篩選編輯區,如圖7-1所示。圖7-1打開篩選編輯區步驟3
單擊篩選編輯區左上角的“添加”文字,編輯區會添加一條以表的第一個字段為主體的欄目,此處為id,單擊“id”文字,打開字段列表,用戶可根據實際需求選擇字段,如圖7-2所示。圖7-2添加篩選欄目步驟4
單擊篩選欄目中的“等于”文字,打開關鍵字列表,列表中包括where子句中常用的關鍵字,如不等于、小于和大于等,如圖7-3所示。圖7-3打開關鍵字列表步驟5
單擊篩選欄目中的“<?>”文字,打開輸入框,在輸入框中填寫關鍵字后的值,并單擊“確定”按鈕,如圖7-4所示。圖7-4填寫值步驟6
再次單擊“添加”按鈕,可添加另外的篩選條件,參照以上步驟設置第二個篩選條件,然后單擊“and”按鈕,選擇兩個篩選條件之間的關系,如圖7-5所示。圖7-5選擇篩選關系步驟7
單擊“上移”或“下移”按鈕可以調整篩選條件的順序,如圖7-6所示。圖7-6調整篩選條件的順序步驟8
設置完成所有的篩選條件后,單擊“應用”按鈕,即可執行查詢,查詢結果會在篩選編輯區下方顯示,如圖7-7所示。圖7-7執行查詢7.3聚合函數和分組數據記錄查詢在數據庫中,通常需要進行一些數據匯總操作。比如,要統計匯總商品種類或者統計整個公司的員工數等,此時就用到了聚合函數。MySQL所支持的聚合函數一共有以下5種。實際應用中,聚合函數通常與分組查詢一起使用。分組查詢就是按照某個字段對數據記錄進行分組,比如前面用到的goods表,可以按照商品類別對記錄進行分組,然后使用聚合函數統計每個類別下的商品數量。COUNT()函數:計算表中記錄的條數。SUM()函數:計算字段值的總和。AVG()函數:計算字段值的平均值。MAX()函數:查詢表中字段值的最大值。MIN()函數:查詢表中字段值的最小值。使用聚合函數查詢的基本語法形式如下:SELECTfunction(*|col_num)FROMtable_nameWHERECONDITION本節依然以db_shop數據庫中的goods表為例進行操作,在操作之前,先執行以下語句,向數據表中追加5條記錄。INSERTINTOgoods(id,type,name,price,num,add_time)VALUES(6,'書籍','論語',109,50,'2018-01-0313:40:40'),(7,'水果','西瓜',1.5,null,'2018-02-0513:40:40'),(8,'水果','蘋果',3,100,'2018-03-0513:40:40'),(9,'服飾','牛仔褲',120,10,'2018-05-0413:40:40'),(10,'書籍','紅樓夢',50.5,15,'2018-05-0613:40:40');COUNT()函數1COUNT()函數用于統計數據記錄條數,用于返回表中記錄的條數,或者符合特定條件的記錄條數。COUNT(*):計算表中總的記錄數,不管表字段中是否包含NULL值。COUNT(col_name):計算表中指定字段的記錄數,在具體統計時將忽略NULL值?!緦嵗?-26】執行SQL語句,查詢goods表中總的記錄條數,執行結果如下。mysql>SELECTCOUNT(*)ASgoods_numFROMgoods;+-------------------------+|goods_num |+-------------------------+|10 |+-------------------------+1rowinset(0.06sec)
提示上述語句中使用AS關鍵字為字段取別名為goods_num,使得查詢結果簡單明了,AS關鍵字可省略。使用AS關鍵字不僅可以為字段取別名,還可為表取別名,其使用非常靈活。COUNT()函數1【實例7-27】執行SQL語句,查詢goods表中有庫存(num值不為NULL)的記錄條數,執行結果如下。mysql>SELECTCOUNT(num)ASgoods_numFROMgoods;+----------------+|goods_num|+----------------+|9 |+----------------+1rowinset(0.01sec)SUM()函數2SUM()函數是一個求總和的函數,用于返回指定字段值的總和,或符合特定條件的指定字段值總和,在具體計算時將忽略NULL值。其使用方法如下:【實例7-28】執行SQL語句,查詢goods表中商品庫存的總和,執行結果如下。mysql>SELECTSUM(num)goods_numFROMgoods;+-----------------+|goods_num|+-----------------+|575 |+-----------------+1rowinset(0.04sec)SUM(col_name)AVG()函數3AVG()函數通過計算返回的行數和每一行數據的和,得到指定列數據的平均值,在具體計算時將忽略NULL值。AVG()函數與GROUPBY一起使用,可以計算每個分組的平均值。其使用方式如下:【實例7-29】執行SQL語句,查詢goods表中每個商品類別的平均價格,執行結果如下。mysql>SELECTtype,AVG(price)FROMgoodsGROUPBYtype;+------+---------------------+|type|AVG(price) |+------+---------------------+|書籍|69.966667 ||服飾|460.000000 ||水果|2.250000 ||糖類|5.000000 ||飲品|2.500000 |+------+---------------------+5rowsinset(0.03sec)AVG(col_name)MAX()函數和MIN()函數4MAX()函數和MIN()函數是用于求最大值和最小值的函數,可返回指定字段中的最大值和最小值,或者符合特定條件的指定字段值中的最大值和最小值。【實例7-30】執行SQL語句,查詢goods表中商品的最高價格和最低價格,執行結果如下。mysql>SELECTMAX(price)maxpri,MIN(price)minpriFROMgoods;+----------+-----------+|maxpri |minpri |+----------+-----------+|800.00 |1.50 |+----------+-----------+1rowinset(0.04sec)MAX(col_name):該方式可以實現計算指定字段值中的最大值,在具體計算時將忽略NULL值。MIN(col_name):該方式可以實現計算指定字段值中的最小值,在具體計算時將忽略NULL值。分組查詢是將查詢結果按照某個或多個字段進行分組,MySQL使用GROUPBY語句對數據進行分組。GROUPBY從字面上理解就是“根據(BY)一定的規則進行分組(GROUP)”。它的工作原理是按照一定的規則將一個數據集合劃分成若干個小的區域,然后針對這些區域的數據進行處理,語法形式如下:SELECT{*|col_list}aggregate_funcFROMtable_nameGROUPBYcol_namea[HAVINGcondition];簡單分組查詢1將GROUPBY關鍵字與聚合函數COUNT()一起使用,可以查詢每組的數量?!緦嵗?-31】執行SQL語句,將goods表中的記錄按照type字段(商品類別)進行分組,并統計每組的數量,結果如下:mysql>SELECTtype,count(*)FROMgoodsGROUPBYtype;+------+--------------+|type|count(*) |+------+--------------+|書籍|3 ||服飾|2 ||水果|2 ||糖類|2 ||飲品|1 |+------+--------------+5rowsinset(0.02sec)簡單分組查詢1如果需要將每種類型中包含的商品名稱顯示出來,可以使用group_concat()函數?!緦嵗?-32】執行SQL語句,將goods表中的記錄按照type字段進行分組,并顯示每組中的商品名稱,結果如下:mysql>SELECTtype,group_concat(name)FROMgoodsGROUPBYtype;+------+--------------------------------+|type|group_concat(name) |+------+--------------------------------+|書籍|西游記,論語,紅樓夢 ||服飾|休閑西服,牛仔褲 ||水果|西瓜,蘋果 ||糖類|牛奶糖,水果糖 ||飲品|果汁 |+------+--------------------------------+5rowsinset(0.00sec)使用HAVING過濾分組后數據2GROUPBY和HAVING一起使用,可以指定顯示記錄所需滿足的條件,只有滿足條件的分組才會被顯示?!緦嵗?-33】執行SQL語句,將goods表中的記錄按照type字段分組并統計每組的數量,然后只取商品數量大于1的分組,結果如下:mysql>SELECTtype,count(*)FROMgoodsGROUPBYtypeHAVINGCOUNT(*)>1;+------+------------------+|type|count(*) |+------+------------------+|書籍|3 ||服飾|2 ||水果|2 ||糖類|2 |+------+------------------+4rowsinset(0.06sec)使用HAVING過濾分組后數據2WHERE子句和HAVING子句都具有按照條件篩選數據的功能,兩者的區別主要有以下幾點:WHERE子句在進行分組操作之前用來選擇記錄,而HAVING子句在進行分組操作之后通過過濾來選擇分組。HAVING子句中的每個字段必須被包含在SELECT關鍵字后的字段列表中。HAVING子句可以包含聚合函數,但WHERE子句不能。使用多個字段進行分組3使用GROUPBY不止可以按照一個字段進行分組,還可以按多個字段進行分組。分組層次從左到右,即先按第1個字段進行分組,然后對第1個字段值相同的記錄,再根據第2個字段進行分組,依此類推?!緦嵗?-34】執行SQL語句,將goods表中的記錄按照type和num字段進行分組并統計,顯示每個分組中商品類別、庫存、商品名稱和商品數量,執行結果如下:mysql>SELECTtype,num,group_concat(name),count(name)FROMgoodsGROUPBYtype,num;+--------+--------+---------------------------+---------------------------+|type|num|group_concat(name)|count(name) |+--------+--------+---------------------------+---------------------------+|書籍|15 |紅樓夢 |1 ||書籍|20 |西游記 |1 ||書籍|50 |論語 |1 ||服飾|10 |休閑西服,牛仔褲 |2 ||水果|NULL|西瓜 |1 ||水果|100|蘋果 |1 ||糖類|100|水果糖 |1 ||糖類|200|牛奶糖 |1 ||飲品|70 |果汁 |1 |+--------+--------+---------------------------+---------------------------+9rowsinset(0.01sec)步驟1
進入NavicatforMySQL后,選擇db_shop數據庫,單擊“查詢”按鈕,然后單擊“新建查詢”按鈕,選擇“查詢創建工具”選項卡,如圖7-8所示。圖7-8打開“查詢創建工具”步驟2
單擊“查詢創建工具”右下方編輯區中的灰色文字“按這里添加表”,選擇需要查詢的db_shop.goods表,如圖7-9所示。圖7-9選擇表步驟3
單擊“按這里添加欄位”文字,可以在“列表”選項卡中選擇需要查詢的字段,也可以在“編輯”選項卡中直接填寫內容,此處輸入“type,count(*)”,如圖7-10所示。圖7-10選擇字段步驟4
單擊“按這里添加欄位”文字,可以在“列表”選項卡中選擇需要查詢的字段,也可以在“編輯”選項卡中直接填寫內容,此處輸入“type,count(*)”,如圖7-10所示。圖7-11添加篩選條件步驟5
參照上述方法添加其他參數,使查詢按照type字段分組,分組后去掉type值為“飲品”的組,如圖7-12所示。圖7-12多個關鍵字組合查詢步驟6
編輯完查詢語句后,單擊“查詢創建工具”選項卡上方的“運行”按鈕,查詢語句和結果會在“查詢編輯器”選項卡中顯示,如圖7-13所示。圖7-13查看查詢結果8多表數據記錄查詢第章8.1基本查詢語句在關系型數據庫管理系統中,通常一張表只會存儲一個實體的相關信息,如果用戶需要查詢多張表中不同實體的數據,可以使用關鍵字JOIN對表執行連接查詢操作,但前提條件是,這些表中必須存在具有相同意義的字段。連接查詢主要包括內連接查詢和外連接查詢,另外還可以在連接查詢中添加過濾條件,篩選符合條件的數據,這就是復合條件連接查詢。表8-1staff表結構字
段數據類型約
束注
釋staff_idINT(10)無符號、主鍵、自增、非空員工IDsection_idINT(10)無符號、非空部門IDpositions_idINT(10)非空職位IDnameVARCHAR(10)非空姓名sexENUM('男','女')非空性別phone_numberCHAR(11)非空手機號moneyDECIMAL(10,2)無符號、非空,默認值0薪資entry_dateDATETIME非空入職時間字
段數據類型約
束注
釋section_idINT(10)無符號、主鍵、自增、非空部門IDsection_titleVARCHAR(20)非空部門名稱表8-2section表結構【實例8-1】本例首先創建數據庫staff,然后參照表8-1和表8-2創建數據表staff和section,并在其中插入數據。CREATEDATABASEstaff;步驟1
登錄MySQL后執行以下語句,創建數據庫staff。CREATETABLEstaff(staff_idINT(10)UNSIGNEDNOTNULLAUTO_INCREMENT,section_idINT(10)UNSIGNEDNOTNULL,positions_idINT(10)NOTNULL,nameVARCHAR(10)NOTNULL,sexENUM('男','女')NOTNULL,phone_numberCHAR(11)NOTNULL,moneydecimal(10,2)UNSIGNEDNOTNULLDEFAULT'0.00',entry_dateDATETIMENOTNULL,PRIMARYKEY(staff_id));步驟2
選擇數據庫staff,并執行以下語句創建數據表staff。INSERTINTOstaff(staff_id,section_id,positions_id,name,sex,phone_number,money,entry_date)VALUES(1,'1','1','劉長生','男',,20000,'2018-04-0214:35:52'),(2,'1','2','趙霞','女',,10000,'2018-04-0314:40:52'),(3,'2','3','季慶奇','女',,15000,'2018-04-0314:43:52'),(4,'3','3','李星宇','男',,15000,'2018-04-0314:45:52'),(5,'4','3','張向陽','男',,15000,'2018-04-0314:47:24'),(6,'4','8','張旭','男',,10000,'2018-04-0314:50:52');步驟3
執行以下SQL語句,向staff表中插入數據。CREATETABLEsection(section_idINT(10)UNSIGNEDNOTNULLAUTO_INCREMENT,section_titleVARCHAR(20)NOTNULL,PRIMARYKEY(section_id));步驟4
執行以下SQL語句,創建數據表section。INSERTINTOsection(section_id,section_title)VALUES(1,'總經辦'),(2,'財務部'),(3,'銷售部'),(4,'研發部'),(5,'運營部'),(6,'人力資源部'),(7,'售后服務部');步驟5
執行以下SQL語句,向數據表section中插入數據。mysql>SELECTstaff_id,name,sex,section_title,phone_numberFROMstaffINNERJOINsection->ONstaff.section_id=section.section_id;+----------+------------+----------+-----------------+-----------------------+|staff_id|name|sex|section_title|phone_number|+----------+------------+----------+-----------------+-----------------------+|1|劉長生|男 |總經辦||2|趙霞|女 |總經辦||3|季慶奇|女 |財務部||4|李星宇|男|銷售部||5|張向陽|男 |研發部||6|張旭|男 |研發部|+----------+------------+----------+-----------------+-----------------------+6rowsinset(0.01sec)普通內連接查詢1SELECT{*|col_list}FROMtable_name1INNERJOINtable_name2ONcondition;【實例8-2】在staff表和section表之間使用內連接查詢,從staff表中查詢staff_id(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 關注行業發展熱點的2025年市場營銷理論考試試題及答案
- 2025年醫學專業執業考試試卷及答案
- 2025年心理測量與評估方法綜合考核試題及答案
- 2025年現代藝術與文化創新的考試試題及答案
- 2025年心理咨詢師資格考試試卷及答案
- 2025年水資源管理與保護課程考試卷及答案
- 2025年人工智能與機器學習基礎試卷及答案
- 北師大版(2024)七年級下冊英語期末復習:Unit1~6語法練習100題(含答案)
- 2025年建筑設計基礎知識測試卷及答案
- 2025年建筑經濟與管理綜合能力考試試卷及答案
- 云南省昆明市呈貢區2023-2024學年五年級下學期7月期末道德與法治試題
- 國開學習網《小企業管理基礎》形考任務1-4答案
- 2024年湖北武漢市法院系統雇員制審判輔助人員招聘245人歷年高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 2024年安徽省農業信貸融資擔保有限公司招聘筆試參考題庫附帶答案詳解
- 《新能源汽車動力電池及管理系統檢修》 課件 模塊1 新能源汽車動力電池及管理系統認知
- 地方病防治課件
- 住院醫師規范化培訓急診科出科理論考核A卷
- 供應商稽核查檢表
- 免疫檢驗 免疫應答之 非特異性免疫
- GB/T 20490-2023鋼管無損檢測無縫和焊接鋼管分層缺欠的自動超聲檢測
- 生活中的化學知識課件
評論
0/150
提交評論