共計(jì) 3340 個(gè)字符,預(yù)計(jì)需要花費(fèi) 9 分鐘才能閱讀完成。
本篇文章給大家分享的是有關(guān)數(shù)據(jù)庫中 group by 和 having 語法使用是什么樣的,丸趣 TV 小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。
有個(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)行匯總操作。
例如對員工表的操作:
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 子句之后。
例如還是對員工表的操作:
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: 訂單編號
name: 用戶名
phone: 用戶手機(jī)號
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 柳夢璃 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ù),而柳夢璃,韓菱紗,云天河只交過一次,所以沒他們的數(shù)據(jù)。
我的處理思路大概是這樣的,先把當(dāng)天日期的記錄用 group by 進(jìn)行手機(jī)號分組即一個(gè)手機(jī)號為一組,接著用 having 子句進(jìn)行過濾,把交過兩次話費(fèi)且話費(fèi)總金額大于 50 的手機(jī)號查出來,最后用手機(jī)號和日期條件組合查詢就能完成數(shù)據(jù)的查詢,具體如下。
注意日期處理細(xì)節(jié),要查詢的某一天 (yyyy-MM-dd) 的所有記錄是這樣處理的:
SELECT date_format(date, %Y-%m-%d) from deal;
查詢出符合條件(交過兩次以上話費(fèi),而且總金額大于 50)的手機(jī)號:
select phone from deal where date_format(date, %Y-%m-%d)= 2011-10-24 group by phone having count(phone) 1 and sum(amount)
結(jié)合手機(jī)號和日期查詢出最終記錄:
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 , 柳夢璃 , 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ù)庫中 group by 和 having 語法使用是什么樣的,丸趣 TV 小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請關(guān)注丸趣 TV 行業(yè)資訊頻道。