SQL一次性查询一个字段不同条件下的统计结果

本文介绍了一种使用SQL查询特定字段不同值下记录数量的方法,并展示了如何通过单条SQL语句实现对多个条件的计数,适用于需要快速获取统计数据的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求有如下的界面
这里写图片描述

一次、两次、三次是同一个字段的不同值下的记录条数。

查询一个一列数据可以使用下面的SQL语句。

select 
COUNT(*)
from 
shuili_company a
where 
a.check_number_ = 1
and
a.is_delete = 0 
from shuili_company GROUP BY province_

如果想用一条SQL语句将一次两次三次的同时查出来,可以使用下面的方式:

select province_, 
ifnull(
(select 
COUNT(*)
from 
shuili_company a
where 
a.check_number_ = 1
and
a.is_delete = 0 
AND
a.province_ = shuili_company.province_
)
,0) as row1,
ifnull(
(select 
COUNT(*)
from 
shuili_company a
where 
a.check_number_ = 2
and
a.is_delete = 0 
AND
a.province_ = shuili_company.province_
),0
) as row2,
ifnull((
select 
COUNT(*)
from 
shuili_company a
where 
a.check_number_ = 3
and
a.is_delete = 0 
AND
a.province_ = shuili_company.province_
),0) as row3,
ifnull((select 
COUNT(*)
from 
shuili_company a
where 
a.sel_eval_number_ = 1
and
a.is_delete = 0 
AND
a.province_ = shuili_company.province_
),0) as row4
from shuili_company GROUP BY province_
<think>好的,用户现在想要查询MySQL中表的数据量,并且希望用一条SQL语句一次性查询多个表的数据量。之前的对话中,用户已经询问过CASE WHEN的用法,现在转向了信息模式(information_schema)的使用。 首先,我需要确认用户的需求。他们可能想要监控数据库中各表的大小,或者进行性能优化,了解数据分布情况。用户提到“一次性查询表数据量”,这意味着他们不想逐个表查询,而是希望一次获取所有表或指定表的记录数。 接下来,我应该回忆MySQL中用于获取元数据的系统数据库information_schema。特别是TABLES表,里面存储了关于各个表的信息,包括TABLE_ROWS这个字段,它记录了表的行数。不过需要注意,对于InnoDB引擎,TABLE_ROWS是近似值,因为InnoDB的MVCC机制可能导致准确计数困难,而MyISAM则会存储精确的行数。 然后,用户可能需要知道如何编写具体的SQL语句。基本的查询语句应该是从information_schema.TABLES中选择TABLE_NAME和TABLE_ROWS,同时指定数据库名。例如: SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = '数据库名'; 不过,用户可能还关心其他信息,比如数据大小、索引大小等,这时候可以添加DATA_LENGTH和INDEX_LENGTH字段。这样用户可以得到更全面的表信息。 另外,用户可能对性能有疑问,或者需要过滤特定的表。例如,只想查看特定前缀的表,或者排除某些系统表。这时候可以在WHERE子句中使用LIKE或NOT LIKE来过滤。 还需要提醒用户,TABLE_ROWS对于InnoDB可能不准确,如果需要精确的行数,可以使用SELECT COUNT(*),但这种方法对于大表会有性能问题,尤其是在一次性查询多个表的时候,可能会影响数据库性能。 用户可能的深层需求是监控数据库状态,或者进行容量规划。因此,除了提供SQL语句,还应给出使用建议,比如定期监控、结合其他指标等。 最后,确保回答结构清晰,分步骤说明,并提供示例和注意事项,确保用户能够正确理解并应用。</think>以下是使用 MySQL 的 `information_schema` 数据库一次性查询所有表数据量的 SQL 语句及详细说明: --- ### **1. 基本语法** ```sql SELECT TABLE_NAME AS '表名', TABLE_ROWS AS '数据行数', -- 可选:添加数据大小(单位:MB) ROUND(DATA_LENGTH / 1024 / 1024, 2) AS '数据大小(MB)', ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS '索引大小(MB)' FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' -- 替换为实际数据库名 ORDER BY TABLE_ROWS DESC; -- 按行数降序排列 ``` --- ### **2. 关键字段解释** - **`TABLE_NAME`**:表名。 - **`TABLE_ROWS`**:表的近似行数(注意:对 InnoDB 引擎可能不精确)。 - **`DATA_LENGTH`**:表数据占用的存储空间(单位:字节)。 - **`INDEX_LENGTH`**:表索引占用的存储空间(单位:字节)。 --- ### **3. 示例输出** 假设数据库名为 `mydb`,输出可能如下: | 表名 | 数据行数 | 数据大小(MB) | 索引大小(MB) | |----------|----------|--------------|--------------| | users | 100000 | 12.34 | 5.67 | | orders | 50000 | 8.90 | 3.21 | | products | 2000 | 1.23 | 0.45 | --- ### **4. 注意事项** 1. **精确性问题**: - **InnoDB 表**:`TABLE_ROWS` 是统计估算值(基于采样),可能与实际 `SELECT COUNT(*)` 结果有差异。 - **MyISAM 表**:`TABLE_ROWS` 是精确值。 - *如果需要精确行数*,需执行 `SELECT COUNT(*) FROM 表名`,但性能较差。 2. **过滤表**: ```sql -- 仅查询特定前缀的表(如以 `temp_` 开头) WHERE TABLE_NAME LIKE 'temp_%'; -- 排除系统表 WHERE TABLE_NAME NOT LIKE 'sys_%'; ``` --- ### **5. 应用场景** - **数据库监控**:快速评估表数据量和存储占用。 - **优化决策**:识别大表以优化查询或分区。 - **容量规划**:预估存储增长趋势。 如果有其他需求(如查询单个表或特定引擎),可以进一步调整查询条件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈振阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值