mysql基础7——where与having的差异

embedded/2024/9/24 20:52:36/

where直接对表中的字段进行限定 筛选结果

having需要根据分组关键字group by一起使用,通过对分组字段和分组计算函数限定 筛选结果

distinct 字段 , 返回字段中所有不同的值

distinct 字段;

where

如果需要对关联表进行查询,where字段执行时先对where条件进行筛选 用筛选后较小的数据集进行连接 这样连接过程中占用的资源较少,执行效率较高

select distinct b.goodsname from demo.transactiondetails as a join demo.membermaster as b on (a.itemnum=b.itemnum) where a.salevalues>50;

a.首先使用where条件进行查询

select * from demo.transactiondetails as a  where a.salevalues>50;

b.然后关联查询

select a.*, b.goodsname from demo.transactiondetails as a join demo.membermaster as b on (a.itemnum=b.itemnum) where a.salevalues>50;

c.然后查询商品名称 (去重)

select distinct b.goodsname from demo.transactiondetails as a join demo.membermaster as b on (a.itemnum=b.itemnum) where a.salevalues>50;

group by 对数据分组 方便对组内的数据进行统计计算

查询每天每个收银员的销售数量和销售金额

select a.transdate,c.operatorname,d.goodsname,b.quantity,b.price,b.salesvalue 
from demo.transactionhead as a 
join demo.transactiondetails as b on (a.transactionid=b.transactionid) 
join demo.operator as c on (a.operatorid=c.operatorid) 
join demo.goodsmaster as d on (b.itemnum=d.itemnum);

查询每天的销售数量和销售金额  (按照日期“transdate”字段进行分组)

select a.transdate,sum(b.quantity),sum(b.salesvalue) 
from demo.transactionhead as a 
join demo.transactiondetails as b on (a.transactionid=b.transactionid) 
group by a.transdate;

查询每天每个收银员的销售数量和销售金额,可以按照2个字段进行分组和统计 分别是 "transdate"字段和"operatorname"字段

select a.transdate,c.operatorname,sum(b.quantity),sum(b.salevalues)
from demo.transactionhead as a
join demo.transactiondetails as b on (a.transactionid=b.transactionid)
join demo.operator as c on (a.operatorid=c.operatorid)
group by a.transdate,c.operatorname;

having

要把所有信息都准备好,包括从关联表中获取的数据,对数据集进行分组,然后通过having条件筛选

查询单笔销售金额超过50元的商品

select b.goodsname
from demo.transactiondetails as a
join demo.goodsmaster as b on (a.itemnum=b.itemnum)
group by b.goodsname;
having max(a.salesvalue)>50;

分四步

a.将两表连接获取数据

select a.*,b.*
from demo.transactiondetails as a
join demo.goodsmaster as b on (a.itemnum=b.itemnum);

b.将上述结果集按照商品名称分组

select a.*, b.*
from demo.transactiondetails as a
join demo.goodsmaster as b on (a.itemnum=b.itemnum)
group by b.goodsname;

c.对分组后的结果集进行筛选 即筛选出salesvalue最大值大于50的组

select a.*, b.*
from demo.transactiondetails as a
join demo.goodsmaster as b on (a.itemnum=b.itemnum)
group by b.goodsname;
having max(a.salesvalue)>50;

d.返回商品名称

select b.goodsname
from demo.transactiondetails as a
join demo.goodsmaster as b on (a.itemnum=b.itemnum)
group by b.goodsname;
having max(a.salesvalue)>50;

where与having的区别

1)如果需要通过连接从关联表中获取所需要的数据时,where先筛选后连接,having先连接后筛选   where比having更高效 

2)where可以直接使用表中的字段作为筛选条件,但是不能使用分组中的计算函数作为筛选条件;having 必须要与group by配合使用,可以把分组计算的函数和字段作为筛选条件

例如 查询哪个收银员在哪天卖了2单商品 必须先分组才能筛选查询

select a.transdate,c.operatorname
from demo.transactionhead as a
join demo.transactiondetails as b on (a.transactionid=b.transactionid)
join demo.operator as c on (a.operatorid=b.operatorid)
group by a.transdate,c.operatorname
having count(*)=2;

where与having不是互相排斥的 可以在一个查询里面同时使用where和having


http://www.ppmy.cn/embedded/9680.html

相关文章

MyBatis 面试题(六)

1. MyBatis 有几种分页方式? MyBatis 的分页方式主要可以分为两大类:逻辑分页和物理分页。 逻辑分页是一次性把全部数据查询加载进内存,然后再进行分页。这种方式减少了IO次数,适合频繁访问、数据量少的情况,但不适合…

“EDM邮件营销”如何构建企业获客增长新赛道

在这个瞬息万变的数字时代,企业的营销策略不断进化,以求在激烈的市场竞争中脱颖而出。其中,“EDM(Electronic Direct Mail)邮件营销”作为一项经典且高效的营销手段,正借助先进的技术力量,重新焕…

CSS布局 Flex 和 Grid

在 CSS 中,理解 flex 和 Grid 布局非常重要,今天把这两个重要知识点回顾一下。 Flexbox 弹性盒子布局 弹性布局支持 flex、inline-flex,支持块和内联。 容器 轴的概念,在 Flexbox,有主轴和侧轴的概念,轴…

HarmonyOS ArkUI实战开发-窗口模块(Window)

窗口模块用于在同一物理屏幕上,提供多个应用界面显示、交互的机制。 对应用开发者而言,窗口模块提供了界面显示和交互能力。对于终端用户而言,窗口模块提供了控制应用界面的方式。对于操作系统而言,窗口模块提供了不同应用界面的…

【Interconnection Networks 互连网络】Torus 网络拓扑

1. Torus 网络拓扑2. Torus 网络拓扑结构References 1. Torus 网络拓扑 Torus 和 Mesh 网络拓扑,又可以称为 k-ary n-cubes,在规则的 n 维网格中包裹着 N k^n 个节点,每个维度都有 k 个节点,并且最近邻居之间有通道。k-ary n-c…

Linux 目录操作函数

目录操作函数 ls -l 可以查看目录中文件的信息,比如: petriXX:~/lesson01/05_io/目录操作函数$ ls -l a.txt -rw-r--r-- 1 petri petri 0 Apr 22 18:51 a.txtLinux系统中的目录操作函数: int rename(const char *oldpath, const char *new…

通过Docker新建并使用MySQL数据库

1. 安装Docker 确保您的系统上已经安装了Docker。可以通过以下命令检查Docker是否安装并运行: systemctl status docker如果没有安装或运行,请按照官方文档进行安装和启动。 2. 拉取MySQL镜像 从Docker Hub拉取MySQL官方镜像。这里以MySQL 5.7版本为…

一个typescript 5 + rollup 4 打包lib模板仓库实现

前言 昨天在写点什么东西的时候,发现有些逻辑可以搞成一个 npm 模块。 找了下看看,有没有什么好用现成模板用于开发。。发现并没有; 那有需求就解决需求。。 需求 基于当前的流行技术栈选型(rollup 4.x typescript 5.x)提供一个最小化模…