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進行過濾