【字节跳动】数据挖掘面试题0014:SQL中count(1), count(*), count(列)区别

文章大纲

    • SQL 中 `count(1)`、`count(*)`、`count(某列)` 的区别
      • 一、核心定义与行为差异
      • 二、示例说明差异
      • 三、性能差异与优化
      • 四、适用场景建议
      • 五、面试应答要点
      • 六、索引扫描与全表扫描
        • 1. 索引扫描的触发条件
        • 2. 全表扫描的适用场景
        • 3. 常见面试问题点
          • Q1:索引扫描一定比全表扫描快吗?
          • `Q2:如何判断数据库是否选择索引扫描?`
          • Q3:索引选择性对扫描方式的影响?
          • Q4:如何优化索引扫描?
          • Q5:数据库如何选择扫描方式?
        • 4. 示例对比分析
          • 总结

SQL 中 count(1)count(*)count(某列) 的区别

在 SQL 中,count() 是常用的聚合函数,但 count(1)count(*)count(某列) 的语义和性能存在细微差异,这也是面试中的高频考点。以下从定义、行为、性能和适用场景四个维度详细解析:
在这里插入图片描述

一、核心定义与行为差异

语法定义是否忽略 NULL
count(*)统计 所有行 的数量,无论列值是否为 NULL
count(1)对每行插入一个常量值 1,然后统计 1 的数量,本质与 count(*) 相同。
count(某列)统计指定列中非 NULL 值的数量。

二、示例说明差异

假设有表 students 如下:

idnameage
1Alice20
2BobNULL
3NULL22
4NULLNULL
  • SELECT count(*):结果为 4(统计所有行)。
  • SELECT count(1):结果为 4(统计所有行)。
  • SELECT count(name):结果为 2(仅统计 name 列非 NULL 的行)。
  • SELECT count(age):结果为 2(仅统计 age 列非 NULL 的行)。

在这里插入图片描述

三、性能差异与优化

  1. count(*)count(1)

    • 多数数据库(如 MySQL、PostgreSQL):二者执行效率完全相同,优化器会将 count(1) 视为 count(*)
    • 少数数据库(如 Oracle)count(1) 在特定索引扫描时可能略快,但差异可忽略不计。
  2. count(某列)

    • 无索引:需逐行扫描,检查列值是否为 NULL,效率较低。
    • 有索引若统计的列存在索引,数据库可能直接通过索引树快速统计非 NULL 值(无需扫描全量数据行)

四、适用场景建议

  1. 统计总行数
    推荐使用 count(*),语义清晰且性能最优。

  2. 统计非空值数量
    使用 count(某列),例如统计用户表中填写了邮箱的用户数:

    SELECT count(email) FROM users;
    
  3. 性能优化场景

    • 若需频繁统计非空值,可为该列添加索引。
    • 避免在 count() 中使用表达式(如 count(column+1)),会强制全表扫描。
  4. 关键区别总结

    函数统计范围是否包含 NULL性能建议
    COUNT(*)所有行✅ 是⭐️ 最优
    COUNT(1)所有行(同 COUNT(*)✅ 是等同 COUNT(*)
    COUNT(列)指定列的非 NULL❌ 否需检查列值

五、面试应答要点

  1. 行为差异

    • count(*)count(1) 统计所有行,count(某列) 仅统计非 NULL 值。
  2. 性能考量

    • count(*)count(1) 性能无显著差异。
    • count(某列) 若有索引则可能更快,否则可能慢于 count(*)
  3. 数据库特定优化

    • MySQL 对 count(*) 有特殊优化,即使表无索引也可能快速返回结果(依赖存储引擎)。
    • Oracle 在大表上 count(1) 可能略优于 count(*)(需结合执行计划分析)。

示例场景
假设用户表 users 有 100 万行数据,其中 email 列有 20% 的 NULL 值:

  • SELECT count(*):返回 100 万。
  • SELECT count(email):返回 80 万。
  • email 列有索引,count(email) 可能比 count(*) 更快(索引扫描比全表扫描高效)。

六、索引扫描与全表扫描

在数据库中,索引扫描(Index Scan)比全表扫描(Table Scan)更高效的核心场景是:当查询只需访问少量数据时。以下是详细分析和常见面试考点:
在这里插入图片描述

1. 索引扫描的触发条件

索引扫描通常在以下情况触发:

  • 过滤条件有效:查询的WHERE子句包含索引列(如WHERE age > 30),且过滤后的数据量较小(通常认为占全量数据的5-10%以下)
  • 覆盖索引查询所需的字段(如SELECT id, age)全部包含在索引中,无需回表查询
  • 索引有序性:查询需要排序(如ORDER BY age),且索引本身有序(避免额外排序操作)。
2. 全表扫描的适用场景

全表扫描通常在以下情况更优:

  • 过滤条件不高效:例如WHERE name LIKE '%张%'左模糊无法利用索引)。
  • 查询大部分数据:例如WHERE age > 10若大部分数据满足条件,全表扫描可能更快)。
  • 无合适索引:查询字段未建立索引,或索引选择性低(如性别字段)。
3. 常见面试问题点
Q1:索引扫描一定比全表扫描快吗?

A:不一定。

  • 反例:当查询需要返回大部分数据(如WHERE age > 10),全表扫描可能更快。因为索引扫描需先访问索引,再回表查询数据,若数据量过大,IO成本反而更高
Q2:如何判断数据库是否选择索引扫描?

A:通过执行计划(如MySQL的EXPLAIN)查看:

  • type字段为indexrange表示使用索引扫描。
  • type字段为ALL表示全表扫描。
Q3:索引选择性对扫描方式的影响?

A:索引选择性(Unique Ratio)指索引列中不同值的数量与总行数的比例。

  • 高选择性(如用户ID):索引扫描效率高。
  • 低选择性(如性别):可能导致优化器放弃索引,选择全表扫描。
Q4:如何优化索引扫描?

A

  • 创建复合索引(如(age, gender))覆盖常用查询。
  • 避免索引冗余(如已有(a, b)索引,无需单独创建(a)索引)。
  • 使用覆盖索引减少回表。
Q5:数据库如何选择扫描方式?

A:优化器基于以下因素估算成本:

  • 索引选择性和统计信息。
  • 表数据量和分布。
  • 内存和IO性能。
4. 示例对比分析

假设表users有100万行数据,age列有索引:

查询场景扫描方式原因
WHERE age = 20(1万行)索引扫描过滤后数据量小,索引扫描效率高。
WHERE age > 10(90万行)全表扫描过滤后数据量大,全表扫描避免多次IO。
SELECT id, age WHERE age=20索引扫描(覆盖)索引包含所有所需字段,无需回表。
SELECT * WHERE name LIKE '%张%'全表扫描左模糊无法利用索引。
总结
  • 索引扫描优势过滤少量数据、覆盖索引、利用有序性
  • 全表扫描优势:查询大量数据、无合适索引、过滤条件低效。
  • 核心原则索引是为了减少IO,若索引扫描的IO成本反而更高,优化器会选择全表扫描

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88399.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux面试问题-软件测试

1、你在上一家公司常用的Linux命令有哪些?答:使用vim/vi编辑文件,使用cat,more,less,head查看文件,使用grep过滤日志中的error,使用ps查看进程,使用top查看实时进程,netstat查看端口…

时序数据库的存储之道:从数据特性看技术要点

时序数据的独特挑战时序数据(Time-Series Data)是指按时间顺序记录的一系列数据点,在物联网、金融、工业监控等领域无处不在。与传统数据相比,时序数据具有几个鲜明特点:时间导向性:每个数据点都带有精确的时间戳高写入量&#xf…

【vim中替换】

vim中替换1 : s/在Vim中经常高频使用到的命令:1 : s/ :s 命令的基本语法是 :[range]s/{pattern}/{string}/[flags],其中: • [range] 是可选的范围,用于指定替换的行范围。例如,% 表示全文,10,…

Qt实战:使用QSqlDatabase连接MySQL,并实现增删改查

文章目录一、创建数据表二、连接MySQL数据库三、封装成一个完整的轻量级 ORM 风格类四、实现派生具体模型类五、支持多线程连接池 ORM 事务封装一、创建数据表 数据库名: 我们先创建一个数据库,名字叫 game_db: CREATE DATABASE IF NOT E…

Python脚本保护工具库之pyarmor使用详解

概要 PyArmor是一个专门为Python代码提供加密保护的第三方库,旨在解决Python源代码易被反编译和泄露的安全问题。作为一种动态代码保护工具,PyArmor能够对Python脚本进行混淆和加密处理,有效防止源代码被恶意获取、分析或篡改。该库特别适用于商业软件开发、知识产权保护和…

仓颉编程语言:从入门到精通

为啥要瞅瞅仓颉这玩意儿? 有一说一,现在的编程语言多得跟米一样,对吧?那一门新语言想火,没点绝活儿肯定不行。仓颉(Cangjie)这哥们儿,是华为搞出来的新玩意儿,静态编译的…

线性探针是什么:是一种用于探测神经网络中特定特征的工具

线性探针是什么 线性探针是一种在机器学习和相关领域广泛应用的技术,用于评估预训练模型特征、检测数据中的特定序列等。在不同的应用场景下,线性探针有着不同的实现方式和作用: 评估预训练模型特征:在机器学习中,线性探针是一种评估预训练模型“特征迁移能力”的标准化方…

【论文阅读】Few-Shot PPG Signal Generation via Guided Diffusion Models

从少量样本数据选择到后处理的整体框架。首先,扩散模型在N样本数据集和指导下的训练。接着,模型生成一个增强的数据集,并进一步优化以提高保真度。最后,这些合成数据与少量样本训练数据集结合,用于基准模型的训练和评估。数据分布从最初的红色变为保真度增强的蓝色,这表明…

CentOS-7的“ifupdown“与Debian的“ifupdown“对比 笔记250706

CentOS-7的"ifupdown"与Debian的"ifupdown"对比 笔记250706 CentOS 7 和 Debian 的 ifupdown 工具名称相同,但在实现机制、配置文件语法和系统集成上存在显著差异。以下是核心对比分析: ⚙️ 一、核心差异概览 对比维度CentOS 7De…

架构如传承:技术长河中的可持续乐章

代码结构:协作基石 在软件开发的世界里,代码结构就如同建筑的框架,支撑着整个项目的运行。想象一下,你加入了一个新的开发团队,接手一个已经有一定规模的项目。当你打开代码库,看到的是一团乱麻般的代码&a…

Ubuntu22.04更新Openssh至9.9p2无法正常连接,报错解决

Ubuntu22.04更新Openssh至9.9p2无法正常连接,报错解决 1.报错信息如下所示ExecStart/usr/sbin/sshd -D $SSHD_OPTS (codeexited, status255/EXCEPTION)2.这通常说明 SSH 配置文件存在语法错误、缺失关键文件,或者端口被占用等问题。 3.检查配置文件是否有…

基于小程序的智能停车管理系统设计与开发

项目介绍 本课程演示的是一款基于小程序的智能停车管理系统设计与开发,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3…

多模态大语言模型arxiv论文略读(155)

Panther: Illuminate the Sight of Multimodal LLMs with Instruction-Guided Visual Prompts ➡️ 论文标题:Panther: Illuminate the Sight of Multimodal LLMs with Instruction-Guided Visual Prompts ➡️ 论文作者:Honglin Li, Yuting Gao, Chengl…

SAP ERP与Oracle EBS对比,两个ERP系统有什么区别?

据统计,2024年中国ERP软件市场规模预计突破210亿元,其中SAP和Oracle占据第一梯队,共占国内ERP市场45%以上的份额,在高端市场尤其显著。SAP和Oracle作为ERP行业的两大巨头,具体有什么区别呢?SAP是什么&#…

网络安全之RCE分析与利用详情

Gogs背景介绍Gogs(Go Git Service)是一款用Go语言编写的轻量级、开源的Git仓库托管系统。它的设计目标是让搭建和维护Git服务变得简单、快速,同时提供类似GitHub的功能,但对资源消耗更少,适合个人或者小型团队使用&…

OpenCV图片操作100例:从入门到精通指南(2)

接上篇,本文将继续分享OpenCV实用技巧,涵盖图像处理、目标检测、3D视觉等进阶领域!六、图像变换进阶17. 图像金字塔# 高斯金字塔下采样 smaller cv2.pyrDown(img)# 高斯金字塔上采样 larger cv2.pyrUp(img)用于多尺度图像处理,构…

2、Connecting to Kafka

KafkaAdmin-请参阅配置主题ProducerFactory-请参阅发送消息ConsumerFactory-请参阅接收消息从2.5版本开始&#xff0c;每个版本都扩展了KafkaResourceFactory。这允许在运行时通过向引导服务器的配置中添加Supplier<String>来更改引导服务器&#xff1a;setBootstrapServ…

二进制部署CentOS8.5+Kubernetes1.33.2+Docker28.3.1高可用集群

Kubernetes 集群部署202507 本实验主要软件环境及资源如下&#xff1a; 二进制部署CentOS8.5Kubernetes1.33.2Docker28.3.1高可用集群 一、系统要求 ​Kubermetes 系统由一组可执行程序组成&#xff0c;用户可以通过Kubernetes在GitHub 的项目网站下载编译好的二进制文件或…

127. Java 泛型 - 泛型类与子类型

文章目录127. Java 泛型 - 泛型类与子类型1. 泛型类和接口的子类型化示例&#xff1a;ArrayList 和 List2. 自定义泛型接口的子类型化示例&#xff1a;泛型接口的子类型解释3. 泛型类和接口的类型参数4. 总结127. Java 泛型 - 泛型类与子类型 1. 泛型类和接口的子类型化 在 J…

内网服务器怎么设置公网远程访问? windows桌面连接和Linux自带SSH外网异地跨网用完整步骤教程

没有公网IP的本地主机跨网访问是经常需要用到的网络场景。要设置内网服务器在公网进行异地远程访问&#xff0c;需依次完成确保网络连接正常、配置防火墙、启用远程访问服务、和利用类似nat123内网映射外网打通等一系列步骤&#xff0c;以保障不同内网的远程访问的顺利进行。一…