SQL之select count()

select count(*) 和select count(1)比较

count(1),其实就是计算一共有多少符合条件的行。

1并不是表示第一个字段,而是表示一个固定值。其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1。

同理,count(2),也可以,得到的值完全一样,count(‘x’),count(‘y’)都是可以的。一样的理解方式。在你这个语句理都可以使用,返回的值完全是一样的。就是计数。

count(),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。
select count(
)和select count(1)的区别:

一般情况下,Select Count ()和Select Count(1)两着返回结果是一样的,假如表没有主键(Primary key), 那么count(1)比count()快,如果有主键的话,那主键作为count的条件时候count(主键)最快,如果你的表只有一个字段的话那count(*)就是最快的。

count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column) 是不包括NULL的统计。

1、select 1 与 select *的区别

selelct 常量 from … 对应所有行,返回的永远只有一个值,即常量 。所以正常只会用来判断是否有还是没有(比如e69da5e6ba907a686964616f31333365633864exists子句)。而select * from … 是返回所有行的所有列。

性能上的差异,关键看你的from和where子句。比如说如果你的where条件中可以通过索引,那显然 select 1 from … 的性能比 select * from … 好。

2、select sum(1)的使用

select count(*)返回所有满足条件的记录数,此时同select sum(1)

但是sum()可以传任意数字,负数、浮点数都可以,返回的值是传入值n*满足条件记录数m

### 如何在SQL中正确使用SELECT COUNT与WHERE组合查询 #### 使用COUNT和WHERE进行基本计数操作 当需要统计满足特定条件的数据行数时,可以在`SELECT COUNT(*)`语句中加入`WHERE`子句来限定范围。例如,要计算来自广东省的城市总数: ```sql SELECT COUNT(*) AS city_count FROM 客户信息.地址表 WHERE 省份 = '广东'; ``` 此命令会返回符合条件记录的数量[^2]。 #### 统计唯一值并应用条件筛选 对于去除重复项后的数据量统计,则需结合`DISTINCT`关键字。假设想要知道不同省份内的独特城市数目,并且只关心那些至少有两个城市的省分: ```sql SELECT 省份, COUNT(DISTINCT 城市) AS unique_cities FROM 客户信息.地址表 GROUP BY 省份 HAVING COUNT(DISTINCT 城市) >= 2; ``` 这里不仅实现了去重计数,还通过`HAVING`子句进一步过滤了结果集。 #### 避免错误地将聚合函数置于WHERE之后 需要注意的是,在标准SQL语法里不允许直接把像`COUNT()`这样的聚集函数放在`WHERE`后面作为条件表达式的组成部分。这是因为`WHERE`用于初步筛选输入给后续处理阶段(如分组、汇总)之前的原始行;而聚集运算发生在这些步骤完成之后。因此下面这种写法是非法的并且会引起解析失败: ```sql -- 错误示范:不可如此编写 SELECT name FROM `subject` WHERE COUNT(name) > 1; ``` 正确的做法是在`HAVING`子句内指定基于聚合计数的结果来进行二次筛选,因为此时已经形成了按某些列分组后的中间结果表[^3]。 #### 正确利用子查询实现复杂逻辑 如果确实有必要依据某一字段上的计数值来做判断,那么应该考虑采用子查询的方式。比如找出所有出现次数超过一次的名字列表: ```sql SELECT s.name FROM ( SELECT name, COUNT(*) as cnt FROM `subject` GROUP BY name ) s WHERE s.cnt > 1; ``` 上述例子展示了如何先构建一个临时视图以获取每种名字对应的频次分布情况,再对外层查询施加必要的约束条件[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值