MySQL資料庫查詢之聚合查詢
好的寶寶們
今天我們來分享
聚合查詢
首先對我們上次分享的表單查詢
進行一些補充
關鍵字
distinct
去重,在結果中去除重複的行。
語法:
select distinct column_names from 表名;
我打開的是一個訂單詳情表
作用於單列:
select distinct(order_id) from order_detail where id
我們看一下效果
作用於多列:
select distinct order_id, buy_number from order_detail where id
看來只有一條是重複的
count
統計數量!
select count(id) from order_detail;
統計表中有多少條記錄
select count(distinct(order_id)) from order_detail;
去掉重複的內容進行統計
concat(str1, str2, ...)
連接函數,可以聯合多列,構成一個總的字元串。
select contact(order_id, "-", product_id) from order_detail where id
concat_ws(separator, str1, str2, ...);
第一個參數(separator)是其他參數的分隔符。
select concat_ws("-", order_id, product_id) from order_detail where id
註:mysql 的 concat 函數在連接字元的時候,只要其中有某一個欄位為 null,那麼則整個返回 null.
聚合查詢
group by
分組查詢,對結果進行分組。通過 group by 子句可以將數據劃分到不同的組裡,實現對記錄的分組查詢。
語法:
select column_name, aggregate_function(column_name) from table_name
where condition group by column_name;
我們來打開員工表
看到了我們的表中存在一個 office_id
我們打開這個 office 表看一下
每個office_id代表著一個公司
select * from employee group by office_id;
這樣我們就把員工按照公司分成了不同的組
單獨使用 group by 時,沒什麼實際意義!在與 avg() , sum(), count() 聚合函數一起使用時,作用最大。
聚合函數
聚合函數的最大特點是它們根據一組數據求出一個值。
聚合函數的結果值只根據選定行中非null的值進行計算,null被忽略。
count()
統計個數
select count(employee_id), office_id from employee group by office_id;
這樣就統計出了公司的員工的數量了
select count(employee_id),gender from employee group by gender;
我們還可以統計公司男女員工的數量!
max()
求表中某個欄位最大值(數值類型)
select max(price) from order_detail;
在所有訂單中單價最高的商品!
select max(price),order_id from order_detail where id>1800 group by order_id;
這句語句的意思是我們把所有的訂單按照訂單號進行分組
然後取每組訂單中單價最大的那一條
我們來查看一下一號訂單
在一號訂單中 單價最大的就是這個了!
min()
求表中某個欄位最小值
select min(price) from order_detail;
單價最小的商品
select min(price),order_id from order_detail group by order_id;
sum()
求表中某個欄位的總和
select sum(total_money),order_id from order_detail where id > 1800 group by order_id;
我們就可以看到我們訂單的總金額了
我們來一個複雜的
select sum(total_money) as nu, order_id from order_detail group by order_id order by nu desc limit 10;
這樣我們就取出了所有訂單中總價前十的訂單號和他們的金額!
avg()
求表中某個欄位平均值
select avg(total_money),order_id from order_detail group by order_id;
select avg(total_money) as nu, order_id from order_detail group by order_id order by nu desc limit 10;
having 和 where 的區別?
我們都知道 having 和 where 都可以用來篩選數據
「Where」 是一個約束聲明,Where 是在結果返回之前起作用的, where 子句在聚合前先篩選記錄.也就是說作用在 group by 子句和 having 子句前
「Having」是一個過濾聲明,是在查詢返回結果集以後對查詢結果進行的過濾操作,在Having 中可以使用聚合函數。
select count(employee_id), office_id from employee group by office_id;
select count(employee_id), office_id from employee group by office_id having count(employee_id) > 10;
我們可以利用 having 篩選員工數大於10個的公司的 ID 但是不能使用 where 來篩選
因為原表中沒有 count(employee——id)這個欄位
TAG:java學習吧 |