search
HomeDatabaseMysql Tutorial数据库中group by和having语法使用详解_MySQL

bitsCN.com

 

   有个朋友问我一个返话费的问题,大概意思是这样的:只需把表deal中所有手机用户某天充值两次以上且总金额超过50的用户充值记录查询出来,至于怎么进行返话费那不是重点。

 

先看看group by的语法:

 

   

 

 

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

 

GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。

 

假设我们将从员工表employee表中搜索每个部门中工资最高的薪水,可以使用以下的SQL语句:

 

 

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

 

这条语句将在每一个单独的部门中选择工资最高的工资,结果将他们的salary和dept返回。

    group by 顾名思义就是按照xxx进行分组,它必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标识字段。

 

    聚合函数有:sum()、count()、avg()等,使用group by目的就是要将数据分组进行汇总操作。

 

    例如对员工表的操作:

 

   

 

 

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

 

 

    这样的运行结果就是以“dept_id”为分类标志统计各单位的职工人数和工资总额。

 

 

 

 

再看看having的语法:

 

   

 

 

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

 

 

这个HAVING子句的作用就是为每一个组指定条件,像where指定条件一样,也就是说,可以根据你指定的条件来选择行。如果你要使用HAVING子句的话,它必须处在GROUP BY子句之后。

    例如还是对员工表的操作:

 

   

 

 

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

 

 

    这样的运行结果就是以“dept_id”为分类标志统计各单位的职工人数和工资平均数且工资平均数大于4000。

 

 

 

下面开始我们的返话费查询功能的实现:

话费表deal字段有这些:

sell_no:订单编号

name:用户名

phone:用户手机号

amount:充值金额

date:充值日期

 

上边就这些有效字段,假如数据(数据纯属虚构,如有*,纯是巧合)如下:

 

 

 

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 

 

把以上数据当天(2011-10-24)交过两次话费,而且总金额大于50的数据取出来,要取的结果如下:

 

 

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 

 

因为今天(2011-10-24)李晓红和杨轩交过两次以上话费,而且总金额大于50,所以有他们的数据,而柳梦璃,韩菱纱,云天河只交过一次,所以没他们的数据。

 

 

 

我的处理思路大概是这样的,先把当天日期的记录用group by进行手机号分组即一个手机号为一组,接着用having子句进行过滤,把交过两次话费且话费总金额大于50的手机号查出来,最后用手机号和日期条件组合查询就能完成数据的查询,具体如下。

 

 

 

    注意日期处理细节,要查询的某一天(yyyy-MM-dd)的所有记录mysql是这样处理的:

 

 

 

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

 

    查询出符合条件(交过两次以上话费,而且总金额大于50)的手机号:

 

 

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; 

 

    结合手机号和日期查询出最终记录:

 

 

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; 

 

    里边嵌套了一个select语句,感觉效率低点了,谁有更高效的方法不?

 

 

 

附数据建库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');   

bitsCN.com
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Windows 11 上缺少本地用户和组:如何添加它Windows 11 上缺少本地用户和组:如何添加它Sep 22, 2023 am 08:41 AM

“本地用户和组”实用程序内置于“计算机管理”中,可以从控制台访问,也可以独立访问。但是,一些用户发现Windows11中缺少本地用户和组。对于可以访问它的一些人来说,该消息显示,此管理单元可能不适用于此版本的Windows10。若要管理此计算机的用户帐户,请使用“控制面板”中的“用户帐户”工具。该问题已在上一次迭代Windows10中报告,并且通常是由于用户端的问题或疏忽引起的。为什么Windows11中缺少本地用户和组?您运行的是Windows家庭版,本地用户和组在专业版及更高版本上可用。活动

探索Windows 11指南:如何访问旧硬盘驱动器上的用户文件夹探索Windows 11指南:如何访问旧硬盘驱动器上的用户文件夹Sep 27, 2023 am 10:17 AM

由于权限,并不总是可以访问某些文件夹,在今天的指南中,我们将向您展示如何在Windows11上的旧硬盘驱动器上访问用户文件夹。此过程很简单,但可能需要一段时间,有时甚至数小时,具体取决于驱动器的大小,因此请格外耐心并严格按照本指南中的说明进行操作。为什么我无法访问旧硬盘上的用户文件夹?用户文件夹的所有权属于另一台电脑,因此您无法对其进行修改。除了所有权之外,您对该文件夹没有任何权限。如何打开旧硬盘上的用户文件?1.取得文件夹的所有权并更改权限找到旧的用户目录,右键单击它,然后选择属性。导航到“安

Windows 11 KB5031455无法安装,导致某些用户出现其他问题Windows 11 KB5031455无法安装,导致某些用户出现其他问题Nov 01, 2023 am 08:17 AM

Microsoft开始推出作为Windows503145511H22或更高版本的可选更新向公众KB2。这是第一个默认启用Windows11Moment4功能的更新,包括受支持区域中的WindowsCopilot、对“开始”菜单中项目的预览支持、任务栏的取消分组等。此外,它还修复了Windows11的几个错误,包括导致内存泄漏的潜在性能问题。但具有讽刺意味的是,2023年<>月的可选更新对于尝试安装更新的用户甚至已经安装更新的用户来说都是一场灾难。许多用户不会安装此Wi

网易云音乐怎么充值_网易云音乐充值步骤网易云音乐怎么充值_网易云音乐充值步骤Mar 25, 2024 pm 09:20 PM

1、在手机桌面选择并打开【网易云音乐】应用程序,如图所示。2、点击左上角的【菜单zhuan】按钮,呼出侧面导航栏,如图所示。3、点击并打开【我的会员】,如图所示。4、选择需要充值的方式(黑胶VIP或者音乐包),如图所示。5、选择立即支付即可完成充值,如图所示。

Win11 新版画图:一键移除背景实现抠图功能Win11 新版画图:一键移除背景实现抠图功能Sep 15, 2023 pm 10:53 PM

微软邀请Canary和Dev频道的WindowsInsider项目成员,测试和体验新版画图(Paint)应用,最新版本号为11.2306.30.0。本次版本更新最值得关注的新功能是一键抠图功能,用户只需要点击一下,就能自动消除背景,凸显画面主体,便于用户后续操作。整个步骤非常简单,用户在新版画图应用中导入图片,然后点击工具栏上“移除背景”(removebackground)按钮,就可以删除图片中的背景,用户也可以使用矩形来选择要消除背景的区域。

TranslucentTB不起作用:如何解决TranslucentTB不起作用:如何解决Jun 06, 2023 am 08:21 AM

TranslucentTB是寻求时尚简约桌面外观的Windows11爱好者广泛使用的工具,遇到了障碍。自从发布以来Windows11内部版本22621.1344(22H2)28年2023月日,TranslucentTB对大多数用户不起作用。此错误使用户努力应对其任务栏的有限自定义选项。用户在寻求克服这一挫折的解决方案时,挫败感显而易见。在最近的Windows11更新之后,TranslucentTB无法正常工作的问题已在多个在线平台上广泛报道,包括论坛和社交媒体。用户一直在分享他们的经验,拼命寻找

steam钱包怎么充值任意金额steam钱包怎么充值任意金额Feb 23, 2024 pm 03:00 PM

steam钱包里是能够充值不同的金额的,那么怎么充值任意金额呢?玩家们需要点击账户明细,点击为钱包充值,选择需要的金额,然后支付就可以了。这篇钱包充值任意金额方法介绍就能够告诉大家具体的方法,下面就是详细的介绍,赶紧来看看吧!《steam使用教程》steam钱包怎么充值任意金额答:在明细里点击为钱包充值,就能选择充值金额具体方法:1、首先点击steam上的自己头像,点击里面的账户明细。2、进入之后点击为steam钱包充值。3、选择一个需要充值的金额,点击充值。4、选择一种支付方式,就能够完成支付

晋江小说阅读晋江币怎么充值晋江小说阅读晋江币怎么充值Feb 29, 2024 pm 02:31 PM

晋江小说阅读这款脍炙人口的小说阅读软件,以其卓越的用户体验和丰富的资源库,为用户提供了一个无与伦比的阅读平台。在这里,用户们可以轻松地探索并找到各种类型的小说资源,那么有些时候想要打赏或者订阅都需要用到晋江币,那么在晋江小说阅读中晋江币究竟该如何充值呢,想要了解的小伙伴们就快来跟着本文一起一探究竟吧!晋江小说阅读怎么充值?1、首先打开晋江小说阅读,选择财务。2、然后在新页面选择充值。3、再选择需要充值的金额。4、最后支付成功即可!

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment