1. 程式人生 > 資料庫 >資料庫命令詳解——資料表的排序/聚合命令/分組

資料庫命令詳解——資料表的排序/聚合命令/分組

1. 排序子句 order by

使用order by子句,對查詢結果進行排序,預設是升序

//語法
order by 指定排序的列 asc 升序、desc 降序
//舉例
select * from order_table where user_id in (1,4) 
order by price; //升序排列

在這裡插入圖片描述

select * from order_table where user_id in (1,4) 
order by price desc;  //降序排列

在這裡插入圖片描述

說明:order by子句一般位於select語句的結尾

2. 常用聚合函式

2.1 DISTINCT 對某一列資料去重(包含Null)

//語法
SELECT DISTINCT 列名 FROM 表名  //顯示此列不重複的資料
//舉例
select distinct user_nick from user_info_table;

在這裡插入圖片描述

2.2 COUNT 統計總行數

型別說明
count(*)包括所有列,返回表中的總行數,在統計結果的時候,不會忽略列值為null的行數
count(1)包括所有列,1表示一個固定值,沒有實際含義,在統計結果的時候,不會忽略列值為null的行數,和count(*)的區別是執行效率不同
count(列名)只包括列名指定列,返回指定列的行數,在統計結果的時候,不統計列值為null的行數
count(distinct 列名)返回指定列的不重複的行數,在統計結果的時候,會忽略列值為null的行數(不包括空字串和0)

在這裡插入圖片描述

select count(distinct user_nick) 
from user_info_table; //返回指定列的不重複的行數,不統計列值為null的行數

在這裡插入圖片描述

  • count(*) count(1) count(列名)執行效率比較

(1)如果列是主鍵,count(主鍵列名)優於conut(1),如果列不是主鍵,則相反
(2) 如果表中存在主鍵,count(主鍵列名)效率最優
(3)如果表中只有一列,則count()效率最優
(4)如果表有多列,且不存在主鍵,則count(1)效率優於count(
)

備註:資料量特別大時才會體現出來

2.3 MAX/MIN最大值、最小值

Max/min函式返回滿足where條件的一列的最大/最小值

SELECT MAX(列名) FROM 表名;  //最大值語法

select max(price) from order_table;  //舉例

在這裡插入圖片描述

SELECT MIN(列名) FROM 表名;  //最小值語法

select min(price) from order_table;  //舉例

在這裡插入圖片描述

2.4 AVG 平均值

AVG函式返回滿足where條件的一列的平均值

SELECT AVG(列名) FROM 表名;  //平均值語法

select avg(price) from order_table;  //舉例

在這裡插入圖片描述

2.5 SUM 求和

SUM函式返回滿足where條件的一列求和

SELECT SUM(列名) FROM 表名; //求和語法

select sum(price) from order_table;  //舉例

在這裡插入圖片描述

2.6 聚合函式使用方法

(1)結合where使用

select sum(price) from order_table where user_id=1; //結合where使用

在這裡插入圖片描述
(2)多個聚合函式同時使用

select sum(price),avg(price),max(price),min(price) 
from order_table where user_id=1;  //多個聚合函式同時使用

在這裡插入圖片描述
(3)結合count使用

select sum(price),avg(price),max(price),min(price),count(1) 
from order_table where user_id=1; //結合count使用

在這裡插入圖片描述

3. limit的用法(一般跟在最後面)

//語法
select * from 表名 limit m,n  //m是指從哪行開始,m從0取值,0表示第一行;n指從第m+1條開始,取n條

//舉例
select * from 表名 limit 0,2;  //表示從第1行開始,顯示2行結果
select * from order_table limit 2,3; //從第3行開始,顯示3行資料

在這裡插入圖片描述

如果只給定一個引數,它表示返回最大的行數目:

select * from order_table limit 5;  //表示查詢前5行

在這裡插入圖片描述

4. group by 分組(面試可能會問)

使用group by子句對列進行分組,還可使用having進行二次過濾,having通常跟在group by後面

(1)不分組時

select max(price) from order_table group by user_id; 
//正常不分組時,顯示最大價格

在這裡插入圖片描述
(2)分組時

select max(price),user_id from order_table 
group by user_id; //按照user_id分組,顯示最大價格(按照user_id分組,一人一組,顯示每組最大價格)

在這裡插入圖片描述

使用user_id分組,前面user_id就不能單獨出現,可以使用聚合運算,如果二者不相同,則會報錯

select sum(price),user_id from order_table 
group by product_id; //此處按照product_id分組,前面user_id就不能單獨出現,會報錯

在這裡插入圖片描述

select sum(price),count(user_id),product_id from 
order_table group by product_id; //4個人買1001商品,總價19.96;4個人買1002商品,總價59.96

在這裡插入圖片描述

(3) 不加having

select filed,聚合函式 from 表名 where 子句 group by field; //不加having

(4) 加having

Select filed,聚合函式 from 表名 where 子句 
group by filed having 聚合函式 過濾條件;//加having進行二次過濾,filed表示列名,聚合函式指count/sum等

select sum(price),count(user_id),product_id from 
order_table group by product_id having count(user_id)>2;

在這裡插入圖片描述

  • 說明
    使用group by後只能展示分組的列名+聚合函式結果,因為其餘列已經基於分組這一列合併