【SQL语法基础】数据过滤:SQL数据过滤都有哪些方法?

article/2025/10/31 10:03:48

我在上篇文章中讲到过,提升查询效率的一个很重要的方式,就是约束返回结果的数量,还有一个很有效的方式,就是指定筛选条件,进行过滤。过滤可以筛选符合条件的结果,并进行返回,减少不必要的数据行。

那么在今天的内容里,我们来学习如何对 SQL 数据进行过滤,这里主要使用的就是 WHERE 子句。

你可能已经使用过 WHERE 子句,说起来 SQL 其实很简单,只要能把满足条件的内容筛选出来即可,但在实际使用过程中,不同人写出来的 WHERE 子句存在很大差别,比如执行效率的高低,有没有遇到莫名的报错等。

在今天的学习中,你重点需要掌握以下几方面的内容:

  1. 学会使用 WHERE 子句,如何使用比较运算符对字段的数值进行比较筛选;
  2. 如何使用逻辑运算符,进行多条件的过滤;
  3. 学会使用通配符对数据条件进行复杂过滤。

比较运算符

在 SQL 中,我们可以使用 WHERE 子句对条件进行筛选,在此之前,你需要了解 WHERE 子句中的比较运算符。这些比较运算符的含义你可以参见下面这张表格:
在这里插入图片描述
实际上你能看到,同样的含义可能会有多种表达方式,比如小于等于,可以是(<=),也可以是不大于(!>)。同样不等于,可以用(<>),也可以用(!=),它们的含义都是相同的,但这些符号的顺序都不能颠倒,比如你不能写(=<)。需要注意的是,你需要查看使用的 DBMS 是否支持,不同的 DBMS 支持的运算符可能是不同的,比如Access 不支持(!=),不等于应该使用(<>)。在MySQL 中,不支持(!>)(!<)等。

我在上一篇文章中使用了 heros 数据表,今天还是以这张表格做练习。下面我们通过比较运算符对王者荣耀的英雄属性进行条件筛选。

WHERE 子句的基本格式是:SELECT ……(列名) FROM ……(表名) WHERE ……(子句条件)

比如我们想要查询所有最大生命值大于 6000 的英雄:

SQLSELECT name, hp_max FROM heros WHERE hp_max > 6000

运行结果(41 条记录):
在这里插入图片描述
想要查询所有最大生命值在 5399 到 6811 之间的英雄:

SQLSELECT name, hp_max FROM heros WHERE hp_max BETWEEN 5399 AND 6811

运行结果:(41 条记录)
在这里插入图片描述
需要注意的是hp_max可以取值到最小值和最大值,即 5399和 6811。

我们也可以对 heros 表中的hp_max字段进行空值检查。

SQLSELECT name, hp_max FROM heros WHERE hp_max IS NULL

运行结果为空,说明 heros 表中的hp_max字段没有存在空值的数据行。

逻辑运算符

我刚才介绍了比较运算符,如果我们存在多个 WHERE 条件子句,可以使用逻辑运算符:
在这里插入图片描述

我们还是通过例子来看下这些逻辑运算符的使用,同样采用heros 这张表的数据查询。

假设想要筛选最大生命值大于 6000,最大法力大于 1700的英雄,然后按照最大生命值和最大法力值之和从高到低进行排序。

SQLSELECT name, hp_max, mp_max FROM heros WHERE hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC

运行结果:(23 条记录)
在这里插入图片描述
如果 AND 和 OR 同时存在 WHERE 子句中会是怎样的呢?假设我们想要查询最大生命值加最大法力值大于 8000 的英雄,或者最大生命值大于 6000 并且最大法力值大于 1700的英雄。

SQLSELECT name, hp_max, mp_max FROM heros WHERE (hp_max+mp_max) > 8000 OR hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC

运行结果:(33 条记录)
在这里插入图片描述
你能看出来相比于上一个条件查询,这次的条件查询多出来了 10 个英雄,这是因为我们放宽了条件,允许最大生命值+ 最大法力值大于 8000 的英雄显示出来。另外你需要注意到,当 WHERE 子句中同时存在 OR 和 AND 的时候,AND 执行的优先级会更高,也就是说 SQL 会优先处理AND 操作符,然后再处理 OR 操作符。

如果我们对这条查询语句 OR 两边的条件增加一个括号,结果会是怎样的呢?

SQLSELECT name, hp_max, mp_max FROM heros WHERE ((hp_max+mp_max) > 8000 OR hp_max > 6000) AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC

运行结果:
在这里插入图片描述
所以当 WHERE 子句中同时出现 AND 和 OR 操作符的时候,你需要考虑到执行的先后顺序,也就是两个操作符执行
的优先级。一般来说 () 优先级最高,其次优先级是 AND,然后是 OR。

如果我想要查询主要定位或者次要定位是法师或是射手的英雄,同时英雄的上线时间不在 2016-01-01 到 2017-01-01之间。

SQLSELECT name, role_main, role_assist, hp_max, mp_max, birthdate
FROM heros 
WHERE (role_main IN ('法师', '射手') OR role_assist IN ('法师', '射手')) 
AND DATE(birthdate) NOT BETWEEN '2016-01-01' AND '2017-01-01'
ORDER BY (hp_max + mp_max) DESC

你能看到我把 WHERE 子句分成了两个部分。第一部分是关于主要定位和次要定位的条件过滤,使用的是role_main in (‘法师’, ‘射手’) OR role_assist in (‘法师’, ‘射手’)。这里用到了 IN 逻辑运算符,同时role_main和role_assist是 OR(或)的关系。

第二部分是关于上线时间的条件过滤。NOT 代表否,因为我们要找到不在 2016-01-01 到 2017-01-01 之间的日期,因此用到了NOT BETWEEN ‘2016-01-01’ AND ‘2017-01-01’。同时我们是在对日期类型数据进行检索,所以使用到了 DATE 函数,将字段 birthdate 转化为日期类型再进行比较。关于日期的操作,我会在下一篇文章中再作具体介绍。

这是运行结果(6 条记录):
在这里插入图片描述

使用通配符进行过滤

刚才讲解的条件过滤都是对已知值进行的过滤,还有一种情况是我们要检索文本中包含某个词的所有数据,这里就需要使用通配符。通配符就是我们用来匹配值的一部分的特殊字符。这里我们需要使用到 LIKE 操作符。如果我们想要匹配任意字符串出现的任意次数,需要使用(%)通配符。比如我们想要查找英雄名中包含“太”字的英雄都有哪些:

SQLSELECT name FROM heros WHERE name LIKE '%太%'

运行结果:(2 条记录)
在这里插入图片描述
需要说明的是不同 DBMS 对通配符的定义不同,在 Access中使用的是(*)而不是(%)。另外关于字符串的搜索可能是需要区分大小写的,比如’liu%‘就不能匹配上’LIUBEI’。具体是否区分大小写还需要考虑不同的 DBMS 以及它们的配置。

如果我们想要匹配单个字符,就需要使用下划线 (_) 通配符。(%)(_)的区别在于,(%)代表一个或多个字符,而(_)只代表一个字符。比如我们想要查找英雄名除了第一个字以外,包含“太”字的英雄有哪些。

SELECT name FROM heros WHERE name LIKE '% 太 %'

运行结果(1 条记录):
在这里插入图片描述
因为太乙真人的太是第一个字符,而_%太%中的太不是在第一个字符,所以匹配不到“太乙真人”,只可以匹配上“东皇太一”。

同样需要说明的是,在 Access 中使用(?)来代替(_),而且在 DB2 中是不支持通配符(_)的,因此你需要在使用的时候查阅相关的 DBMS 文档。

你能看出来通配符还是很有用的,尤其是在进行字符串匹配的时候。不过在实际操作过程中,我还是建议你尽量少用通配符,因为它需要消耗数据库更长的时间来进行匹配。即使你对 LIKE 检索的字段进行了索引,索引的价值也可能会失效。如果要让索引生效,那么 LIKE 后面就不能以(%)开头,比如使用LIKE '%太%'或LIKE '%太’的时候就会对全表进行扫描。如果使用LIKE ‘太%’,同时检索的字段进行了索引的时候,则不会进行全表扫描。

总结

今天我对 SQL 语句中的 WHERE 子句进行了讲解,你可以使用比较运算符、逻辑运算符和通配符这三种方式对检索条件进行过滤。

比较运算符是对数值进行比较,不同的 DBMS 支持的比较运算符可能不同,你需要事先查阅相应的 DBMS 文档。逻辑运算符可以让我们同时使用多个 WHERE 子句,你需要注意的是 AND 和 OR 运算符的执行顺序。通配符可以让我们对文本类型的字段进行模糊查询,不过检索的代价也是很高的,通常都需要用到全表扫描,所以效率很低。只有当 LIKE语句后面不用通配符,并且对字段进行索引的时候才不会对全表进行扫描。

你可能认为学习 SQL 并不难,掌握这些语法就可以对数据进行筛选查询。但实际工作中不同人写的 SQL 语句的查询效率差别很大,保持高效率的一个很重要的原因,就是要避免全表扫描,所以我们会考虑在 WHERE 及 ORDER BY 涉及到的列上增加索引。

在这里插入图片描述

常见问题1

就是要避免全表扫描,所以我们会考虑在 WHERE 及 ORDER BY 涉及到的列上增加索引

where 条件字段上加索引是可以明白的,但是为什么 order by 字段上还要加索引呢?这个时候已经通过 where条件过滤得到了数据,已经不需要在筛选过滤数据了,只需要在排序的时候根据字段排序就好了。

答:关于ORDER BY字段是否增加索引:
在MySQL中,支持两种排序方式:FileSort和Index排序。Index排序的效率更高,
Index排序:索引可以保证数据的有序性,因此不需要再进行排序。
FileSort排序:一般在内存中进行排序,占用CPU较多。如果待排结果较大,会产生临时文件I/O到磁盘进行排序,效率较低。

所以使用ORDER BY子句时,应该尽量使用Index排序,避免使用FileSort排序。
当然具体优化器是否采用索引进行排序,你可以使用explain来进行执行计划的查看。

优化建议:
1、SQL中,可以在WHERE子句和ORDER BY子句中使用索引,目的是在WHERE子句中避免全表扫描,ORDER BY子句避免使用FileSort排序。当然,某些情况下全表扫描,或者FileSort排序不一定比索引慢。但总的来说,我们还是要避免,以提高查询效率。一般情况下,优化器会帮我们进行更好的选择,当然我们也需要建立合理的索引。
2、尽量Using Index完成ORDER BY排序。如果WHERE和ORDER BY相同列就使用单索引列;如果不同使用联合索引。
3、无法Using Index时,对FileSort方式进行调优。

常见问题2

对where语句建索引是什么意思,通过sql语句怎么实现?

答:如果你使用了WHERE子句,对于某个字段进行了条件筛选,那么这个字段你可以通过建立索引的方式进行SQL优化。
因为我们在进行SQL优化的时候,应该尽量避免全表扫描。
所以当我们使用WHERE子句对某个字段进行了条件筛选时,如果我们没有对这个字段建立索引,就会进入到全表扫描,因此可以考虑对这个字段建立索引。

当然你也需要注意 索引是否会失效。因此除了考虑建立字段索引以外,你还需要考虑:
1、不要在WHERE子句后面对字段做函数处理,同时也避免对索引字段进行数据类型转换
2、避免在索引字段上使用<>,!=,以及对字段进行NULL判断(包括 IS NULL, IS NOT NULL)
3、在索引字段后,慎用IN和NOT IN,如果是连续的数值,可以考虑用BETWEEN进行替换
因为在WHERE子句中,如果对索引字段进行了函数处理,或者使用了<>,!=或NULL判断等,都会造成索引失效。


http://chatgpt.dhexx.cn/article/VFUJJx9b.shtml

相关文章

若依ruoyiAOP切面用于数据过滤和权限处理实例

目录 1.什么是AOP 简介 2.若依的AOP实现 2.1若依数据过滤AOP 定义注解 实现切面类 2.2数据源AOP 1.什么是AOP 简介 AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期间动态代理实现程序功能的统一…

FineReport-数据过滤权限设置

目的本省份的人只能看到某表单属于该省份的数据 安徽只能看到安徽的数据 一、在数据库中建立一张权限对应表&#xff0c;该表字段包含帆软登录用户名、省份名称即可 二、在帆软报表模板数据集中设置过滤 select * from table1 t1 left join table2 t2 on t1.MZt2.USERNAME w…

布隆过滤器(亿级数据过滤算法)

介绍 我们以演进的方式来逐渐认识布隆过滤器。先抛出一个问题爬虫系统中URL是怎么判重的&#xff1f;你可能最先想到的是将URL放到一个set中&#xff0c;但是当数据很多的时候&#xff0c;放在set中是不现实的。 这时你就可能想到用数组hash函数来实现了。 index hash(URL)…

Pandas的数据过滤

作者|Amanda Iglesias Moreno 编译|VK 来源|Towards Datas Science 从数据帧中过滤数据是清理数据时最常见的操作之一。Pandas提供了一系列根据行和列的位置和标签选择数据的方法。此外,Pandas还允许你根据列类型获取数据子集,并使用布尔索引筛选行。 在本文中,我们将介绍…

数据过滤:SQL数据过滤都有哪些方法?

我在上篇文章中讲到过&#xff0c;提升查询效率的一个很重要的方式&#xff0c;就是约束返回结果的数量&#xff0c;还有一个很有效的方式&#xff0c;就是指定筛选条件&#xff0c;进行过滤。过滤可以筛选符合条件的结果&#xff0c;并进行返回&#xff0c;减少不必要的数据行…

数据过滤(MySQL)

数据过滤 数据过滤用在WHERE表达式里&#xff0c;常用的有基本查询过滤、条件查询过滤、模糊查询过滤、字段查询过滤以及正则表达式查询过滤。 一、基本查询过滤 基本查询过滤可以查询所有字段数据或指定一个字段或者多个字段的数据。 附带建表 mysql> create table use…

掌握这些数据过滤的技巧,再复杂的业务数据也能高效处理!

随着互联网的飞速发展&#xff0c;呈爆炸式增长的数据使用户逐渐迷失在了信息的海洋之中&#xff0c;在进行数据分析时&#xff0c;海量的业务数据往往会带来一些问题&#xff1a; 准确性差&#xff1a;无效数据以及无需进行分析的数据混杂在其中&#xff0c;导致分析结果与实际…

阿里云服务器初始化

初始化阿里云服务器 进入阿里云服务器&#xff0c;然后在 配置信息 点击 重新初始化磁盘 接着会出现一个提示框&#xff0c;点击 确认 即可 进入实例云盘中&#xff0c;点击 重新初始化磁盘 然后设置密码 完成这一步后&#xff0c;输入手机验证码。这时阿里云服务器就被初始…

腾讯云服务器如何开启虚拟化,腾讯云服务器虚拟化驱动是什么

腾讯云服务器虚拟化驱动是什么&#xff1f; 云服务器虚拟化驱动&#xff0c;为腾讯自研开发&#xff0c;专门用于虚拟化效率提升的驱动程序&#xff0c;云服务器虚拟化驱动在linux系统中驱动文件名是pvdriver&#xff0c;安装路径:/usr/local/qcloud/pvdriver/bin&#xff0c;在…

金山办公CEO章庆元:数字化、云化、订阅化趋势下,组织数字办公走向纵深

关注ITValue&#xff0c;看企业级最新鲜、最价值报道&#xff01; 企业办公行业今年有3个关键词——数字化、云化、订阅化。 从数字化来说&#xff0c;国家十四五规划明确提出了“加快建设数字经济、数字社会、数字政府&#xff0c;以数字化转型整体驱动生产方式、生活方式和治…

物联网端-云一体化应用管理解决方案

近年来&#xff0c;随着云计算的发展&#xff0c;“云边端一体化”、“云端协同”等词也频繁出现在大众眼。 什么是“端-云一体化”&#xff1f; 这里我们拆开来解释&#xff1a; 云&#xff1a;云计算、云数据中心&#xff1b; 端&#xff1a;指的是终端。 合起来的意思就是…

CloudCore引领核心网云化转型

文/刘皓 2015年7月&#xff0c;全球著名咨询公司IHS Infonetics发布最新NFV&#xff08;Network Functions Virtualization&#xff0c;网络功能虚拟化&#xff09;市场调研报告。报告显示&#xff0c;NFV市场空间将从2014年的9.5亿美元增长到2019年的116亿美元&#xff0c;年…

全面推进云化,使能数字化转型 ——徐直军在2016华为全球分析师大会上的发言

文/徐直军 女士们、先生们&#xff0c;各位老朋友、新朋友&#xff0c;大家上午好&#xff01;非常高兴在同样的地点跟各位老朋友再相会&#xff0c;也非常欢迎各位新朋友来参加华为2016年的分析师大会。 这次大会的组委会给我定的主题是《全面推进云化&#xff0c;使能数字化转…

阿里云人物动漫化

简介 使用阿里云人物动漫化功能制作一款属于自己的专属头像(该功能收费) 功能描述 人物动漫化能力可以将一张人物图像进行转换处理&#xff0c;生成二次元卡通形象&#xff0c;并返回动漫化后的结果图像。效果示例如下。 原图&#xff1a; 日漫风结果图&#xff1a; 3D特效结…

服务器虚拟化与云平台,虚拟服务器和云有哪些区别

原标题&#xff1a;虚拟服务器和云有哪些区别 虚拟服务器和云有哪些区别&#xff1f;如果不是专业的人员&#xff0c;其实对于服务器是搞不懂的&#xff0c;其实虚拟服务器和云都是对硬件的抽象&#xff0c;两者都有很多好处和使用的理由&#xff0c;那么服务器虚拟化和云的区别…

腾云忆想构建云化IT生态,助力我国“双循环经济”数字化升级

新冠肺炎疫情全球蔓延,世界经济与国际局势瞬息万变。时局变化之中展望“十四五”,我国逐步形成了以国内大循环为主体、国内国际双循环相互促进的新发展格局。在新时局中,数字经济是重要的支撑力量,产业的数字化转型成为不可逆的趋势。 面对时代变局,腾云忆想紧抓历史机遇,与腾…

欢迎参与2020年云栖大会——引领企业基础设施云化

**简介&#xff1a;**2020年9月18日&#xff0c;阿里云邀您参加2020年云栖大会——引领企业基础设施云化分会场。 2020年9月18日&#xff0c;阿里云邀您参加2020年云栖大会——引领企业基础设施云化分会场。 在数字新基建时代&#xff0c;IT基础设施成为企业数字化转型的一个瓶…

何朝曦:构建云化安全能力的三个建议

11月12日&#xff0c;深信服智安全创新峰会在云端拉开帷幕&#xff0c;深信服创始人&CEO何朝曦在《构建云化时代的安全能力》主题演讲中指出&#xff0c;业务云化已成为用户实现数字化转型与变革的重要方式&#xff0c;这种跨时代的变迁对用户的安全能力提出了更高的要求&a…

英特尔TCI技术落地,锐捷网络发布OCS终端云化新品

编辑 | 宋慧 出品 | CSDN 云计算 2021 年 6 月&#xff0c;国内一直深耕桌面虚拟化的厂商锐捷正式发布了新一代云桌面解决方案——锐捷三擎云桌面解决方案&#xff08; “精耕细作”桌面云市场的锐捷&#xff0c;重磅发布三擎云桌面 &#xff09;&#xff0c;其中三擎指的是终端…

云服务器虚拟化搭建,虚拟化搭建云服务器

虚拟化搭建云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接M…