溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)庫中g(shù)roup by和having語法使用是什么樣的

發(fā)布時(shí)間:2021-12-01 09:35:38 來源:億速云 閱讀:192 作者:柒染 欄目:數(shù)據(jù)庫

本篇文章給大家分享的是有關(guān)數(shù)據(jù)庫中g(shù)roup by和having語法使用是什么樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

有個(gè)朋友問我一個(gè)返話費(fèi)的問題,大概意思是這樣的:只需把表deal中所有手機(jī)用戶某天充值兩次以上且總金額超過50的用戶充值記錄查詢出來,至于怎么進(jìn)行返話費(fèi)那不是重點(diǎn)。

先看看group by的語法:

SELECT column1, SUM(column2) FROM "list-of-tables" GROUP BY "column-list"; 

GROUP BY子句將集中所有的行在一起,它包含了指定列的數(shù)據(jù)以及允許合計(jì)函數(shù)來計(jì)算一個(gè)或者多個(gè)列。

假設(shè)我們將從員工表employee表中搜索每個(gè)部門中工資最高的薪水,可以使用以下的SQL語句:

SELECT max(salary), dept FROM employee GROUP BY dept; 

這條語句將在每一個(gè)單獨(dú)的部門中選擇工資最高的工資,結(jié)果將他們的salary和dept返回。

    group by 顧名思義就是按照xxx進(jìn)行分組,它必須有“聚合函數(shù)”來配合才能使用,使用時(shí)至少需要一個(gè)分組標(biāo)識(shí)字段。

    聚合函數(shù)有:sum()、count()、avg()等,使用group by目的就是要將數(shù)據(jù)分組進(jìn)行匯總操作。

    例如對(duì)員工表的操作:

select dept_id,count(emp_id),sum(salary) form employee  group by dept_id; 

    這樣的運(yùn)行結(jié)果就是以“dept_id”為分類標(biāo)志統(tǒng)計(jì)各單位的職工人數(shù)和工資總額。

再看看having的語法:

SELECT column1, SUM(column2) FROM “l(fā)ist-of-tables” GROUP BY “column-list” HAVING “condition”; 

這個(gè)HAVING子句的作用就是為每一個(gè)組指定條件,像where指定條件一樣,也就是說,可以根據(jù)你指定的條件來選擇行。如果你要使用HAVING子句的話,它必須處在GROUP BY子句之后。

    例如還是對(duì)員工表的操作:

SELECT dept_id, avg(sal) FROM employee GROUP BY dept_id HAVING avg(salary) >= 4000; 

    這樣的運(yùn)行結(jié)果就是以“dept_id”為分類標(biāo)志統(tǒng)計(jì)各單位的職工人數(shù)和工資平均數(shù)且工資平均數(shù)大于4000。

下面開始我們的返話費(fèi)查詢功能的實(shí)現(xiàn):

話費(fèi)表deal字段有這些:

sell_no:訂單編號(hào)

name:用戶名

phone:用戶手機(jī)號(hào)

amount:充值金額

date:充值日期

上邊就這些有效字段,假如數(shù)據(jù)(數(shù)據(jù)純屬虛構(gòu),如有*,純是巧合)如下:

sell_no             name         phone               amount      date 

00000000001         李曉紅       15822533496         50          2011-10-23 08:09:23 

00000000002         李曉紅       15822533496         60          2011-10-24 08:15:34 

00000000003         李曉紅       15822533496         30          2011-10-24 12:20:56 

00000000004         楊 軒        18200000000         100         2011-10-24 07:59:43 

00000000005         楊 軒        18200000000         200         2011-10-24 10:11:11 

00000000006         柳夢(mèng)璃       18211111111         50          2011-10-24 09:09:46 

00000000007         韓菱紗       18222222222         50          2011-10-24 08:09:45 

00000000008         云天河       18333333333         50          2011-10-24 08:09:25 

把以上數(shù)據(jù)當(dāng)天(2011-10-24)交過兩次話費(fèi),而且總金額大于50的數(shù)據(jù)取出來,要取的結(jié)果如下:

00000000002         李曉紅       15822533496         60          2011-10-24 08:15:34 

00000000003         李曉紅       15822533496         30          2011-10-24 12:20:56 

00000000004         楊 軒        18200000000         100         2011-10-24 07:59:43 

00000000005         楊 軒        18200000000         200         2011-10-24 10:11:11 

因?yàn)榻裉?2011-10-24)李曉紅和楊軒交過兩次以上話費(fèi),而且總金額大于50,所以有他們的數(shù)據(jù),而柳夢(mèng)璃,韓菱紗,云天河只交過一次,所以沒他們的數(shù)據(jù)。

我的處理思路大概是這樣的,先把當(dāng)天日期的記錄用group by進(jìn)行手機(jī)號(hào)分組即一個(gè)手機(jī)號(hào)為一組,接著用having子句進(jìn)行過濾,把交過兩次話費(fèi)且話費(fèi)總金額大于50的手機(jī)號(hào)查出來,最后用手機(jī)號(hào)和日期條件組合查詢就能完成數(shù)據(jù)的查詢,具體如下。

    注意日期處理細(xì)節(jié),要查詢的某一天(yyyy-MM-dd)的所有記錄是這樣處理的:

SELECT date_format(date,'%Y-%m-%d') from deal; 

    查詢出符合條件(交過兩次以上話費(fèi),而且總金額大于50)的手機(jī)號(hào):

select phone from deal where date_format(date,'%Y-%m-%d')="2011-10-24" group by phone having count(phone)>1 and sum(amount)>50; 

    結(jié)合手機(jī)號(hào)和日期查詢出最終記錄:

select * from deal where date_format(date,'%Y-%m-%d')="2011-10-24" and phone in  

  (select phone from deal where date_format(date,'%Y-%m-%d')="2011-10-24"  

   group by phone having count(phone)>1 and sum(amount)>50) order by phone; 

    里邊嵌套了一個(gè)select語句,感覺效率低點(diǎn)了,誰有更高效的方法不?

附數(shù)據(jù)建庫sql代碼:

create database if not exists `phone_deal`; 

USE `phone_deal`; 

DROP TABLE IF EXISTS `deal`; 

CREATE TABLE `deal` ( 

  `sell_no` varchar(100) NOT NULL, 

  `name` varchar(100) default NULL, 

  `phone` varchar(100) default NULL, 

  `amount` decimal(10,0) default NULL, 

  `date` datetime default NULL, 

  PRIMARY KEY  (`sell_no`) 

) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

insert  into `deal`(`sell_no`,`name`,`phone`,`amount`,`date`) values ('00001','李曉紅','15822533496','60','2011-10-23 08:09:23'),('00002','李曉紅','15822533496','50','2011-10-24 08:15:34'),('00003','李曉紅','15822533496','40','2011-10-24 12:20:56'),('00004','楊軒','18210607179','100','2011-10-24 07:59:43'),('00005','楊軒','18210607179','50','2011-10-24 10:11:11'),('00006','柳夢(mèng)璃','15822533492','1000','2011-10-24 09:09:46'),('00007','韓菱紗','15822533493','10000','2011-10-24 08:09:45'),('00008','云天河','15822533494','500','2011-10-24 08:09:25');   

以上就是數(shù)據(jù)庫中g(shù)roup by和having語法使用是什么樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI