1. 程式人生 > >mysql_資料記錄的查詢

mysql_資料記錄的查詢

在這裡插入圖片描述

1.濾重
查詢排重:select distinct 列名 from 表名 [where 條件];
distinct: 去重複。顯示distinct後面列的內容,並且慮重。

在這裡插入圖片描述
在這裡插入圖片描述

2.列運算

在這裡插入圖片描述

3.order by
語法:select * from 表名 order by 列名 asc|desc ;
asc是升序排列,desc是降序排列

注意 : 可以有多個排序條件, 首先按照第一列進行排序,如果第一列相同,按照第二列在進行排序。
在這裡插入圖片描述
在這裡插入圖片描述
關於null的問題
如果使用null來進行表示式運算,那麼計算的結果也會是null.
在這裡插入圖片描述
mysql中,提供了一個函式 :ifnull(列名,預設值)
判斷該列是否為null,如果為null,返回預設值,如果不為null,返回實際的值

在這裡插入圖片描述

4.聚合函式
聚集函式:多個數據進行運算,運算出一個結果。例如,求和,平均值,最大值,最小值。
在這裡插入圖片描述

在這裡插入圖片描述
4.1 count函式
注意: count在根據指定的列統計的時候,如果這一列中有null 不會被統計在其中。

select count(*) from exam;     --返回7
select count(math) from exam;  --返回6

4.2 sum求和函式
sum 也可排除null

select sum(math) from exam;  --返回422

注意點:
在這裡插入圖片描述
例2
在這裡插入圖片描述
需求 : 這個結果好像不太完美,因為小數點後保留了多位小數,因此需要擷取小數?語法:round(數值, 小數的位數);
實現四捨五入的結果

在這裡插入圖片描述

4.3 avg函式
avg(列名) ----求該列的平均值----avg裡面的null不作為統計

select avg(math) from exam;  

結果:
在這裡插入圖片描述
以上由於劉阿斗的math是null,因此,在平均的時候平均的是6個人的成績,劉阿斗不算在內,而這樣的平均方式顯然是錯誤的,因此在算平均分的時候,要先進行ifnull的判斷,在進行avg的運算。sql語句修改如下:

select avg(IFNULL(math,0)) from exam;

結果:
在這裡插入圖片描述

例:求一個班級總分的平均分

select avg(sum(chinese) + sum(math) + sum(english)) from exam;  --錯誤

注意:不能和sum一起使用,並且要對每一列先進行ifnull的判斷,如果不進行ifnull的判斷的話會缺少劉阿斗的那一行的成績,結果會變成總共7個人,結果只把除劉阿斗以外的所有人的成績進行相加然後除以6。而準確結果應該是所有人的成績相加除以7才對。

select avg(IFNULL(chinese,0) + IFNULL(math,0) + IFNULL(english,0)) as 平均分 from exam;

4.4 max/min 最大值/最小值
統計該列的最大值或者最小值,null 排除在外。
同樣不能跟sum一起用

統計總分的最高分和最低分
在這裡插入圖片描述

5.group by
分組: 按照某一列或者某幾列。把相同的資料,進行合併輸出。
說明:其實就是按列進行分類,然後可以對分類完的資料使用聚集函式進行運算。

注意事項:
1、聚合函式:分組之後進行計算;
2、通常 select的內容:a 被分組的列,b 聚合函式。
3、如果遇到這種情況 按照每種,每個。 類似的這些語句的時候,通常會使用分組。
4、如果使用group by對資料進行分組之後還要過濾。這時一般不能使用where,因為where關鍵字的後面不能跟上面講解的這些函式。如果需要在過濾的條件中加上述的函式,只能使用having關鍵字。
5、where 後不能跟 聚合函式,having中可以跟 聚合函式。

在這裡插入圖片描述

select product,sum(price) from orders group by product;

在這裡插入圖片描述
在這裡插入圖片描述

例2:查詢每一種商品的總價大於30的商品,並顯示總價
如果分組之後,需要一些條件。則使用having 條件.,表示分組之後的條件。可以書寫聚集函式。

select product,sum(price) as 總價 from orders group by product having sum(price) > 30;

在這裡插入圖片描述
在這裡插入圖片描述

where 和 having 的區別。
1、having 通常與group by 分組結合使用。 where 和分組無關。
2、where 後面的條件可以寫在having 中,但是 having中的條件不一定能寫在where中。having 可以書寫聚合函式 (聚集函數出現的位置: select 之後,group by … having 之後) 例如having中的 聚集函式(count,sum,avg,max,min),是不可以出現where條件中。
3、where 是在分組之前進行過濾的。having 是在分組之後進行過濾的。

說明 : select … from … where 條件1 … gropu by … having 條件2 order by
條件1 會先執行過濾
而後進行分組
條件2進行過濾