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

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

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

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

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

比较运算符

在 SQL 中,我们可以使用 WHERE 子句对条件进行筛选,在此之前,你需要了解 WHERE 子句中的比较运算符。这些比较运算符的含义你可以参见下面这张表格:

实际上你能看到,同样的含义可能会有多种表达方式,比如小于等于,可以是(<=),也可以是不大于(!>)。同样不等于,可以用(<>),也可以用(!=),它们的含义都是相同的,但这些符号的顺序都不能颠倒,比如你不能写(=<)。需要注意的是,你需要查看使用的 DBMS 是否支持,不同的 DBMS 支持的运算符可能是不同的,比如 Access 不支持(!=),不等于应该使用(<>)。在 MySQL 中,不支持(!>)(!<)等。

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

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

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

SQL:SELECT name, hp_max FROM heros WHERE hp_max > 6000

运行结果(41 条记录):

想要查询所有最大生命值在 5399 到 6811 之间的英雄:

SQL:SELECT name, hp_max FROM heros WHERE hp_max BETWEEN 5399 AND 6811

运行结果:(41 条记录)

需要注意的是hp_max可以取值到最小值和最大值,即 5399 和 6811。

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

SQL:SELECT name, hp_max FROM heros WHERE hp_max IS NULL

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

逻辑运算符

我刚才介绍了比较运算符,如果我们存在多个 WHERE 条件子句,可以使用逻辑运算符:

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

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

SQL:SELECT 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 的英雄。

SQL:SELECT 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 两边的条件增加一个括号,结果会是怎样的呢?

SQL:SELECT 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 之间。

SQL:
SELECT 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 操作符。

如果我们想要匹配任意字符串出现的任意次数,需要使用(%)通配符。比如我们想要查找英雄名中包含“太”字的英雄都有哪些:

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

运行结果:(2 条记录)

需要说明的是不同 DBMS 对通配符的定义不同,在 Access 中使用的是(*)而不是(%)。另外关于字符串的搜索可能是需要区分大小写的,比如'liu%'就不能匹配上'LIU BEI'。具体是否区分大小写还需要考虑不同的 DBMS 以及它们的配置。

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

SQL: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 涉及到的列上增加索引。

你能说一下 WHERE 子句中比较运算符、逻辑运算符和通配符这三者各自的作用吗?以 heros 数据表为例,请你编写 SQL 语句,对英雄名称、主要定位、次要定位、最大生命和最大法力进行查询,筛选条件为:主要定位是坦克或者战士,并且次要定位不为空,同时满足最大生命值大于 8000 或者最大法力小于 1500 的英雄,并且按照最大生命和最大法力之和从高到底的顺序进行排序。

欢迎你在评论区写下你的思考,也欢迎点击请朋友读,把这篇文章分享给你的朋友或者同事。

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见。

数据过滤:SQL数据过滤都有哪些方法?相关推荐

  1. 将数据插入SQL Server的方法

    摘要 (Summary) There are a variety of ways of managing data to insert into SQL Server. How we generate ...

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

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

  3. php过滤提交数据 防止sql注入攻击

    php过滤提交数据 防止sql注入攻击 在SQL注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中.例如,假设有一个简单的登录数据库.这个数据库中的每个记录都有一个用户名字 ...

  4. SQL学习四、过滤、数据筛选

    数据过滤,即按照条件筛选数据,找出符合条件的数据.这可以说是SQL学习和使用时最核心的地方了. 1.使用简单WHERE 子句 WHERE 子句在表名(FROM 子句)之后给出 比如我们需要在 adju ...

  5. mysql怎么排序检索_MySQL 2 SQL数据使用(检索、排序、过滤:SELECT/FROM/LIMIT/ORDER BY/DESC/WHERE/AND/OR/IN/NOT)...

    .空格被忽略,可以用一或多个空格分开指令. 检索单个列: SELECT 列名  FROM 表名: 检索多个列: 当心逗号 SELECT 列1,列2,列3  FROM 表: 检索所有列:(*)通配符 S ...

  6. asp sql查询过滤空格_对比Excel,轻松学习SQL数据分析数据笔记02

    本文主要梳理<对比Excel,轻松学习SQL数据分析>对于自己有用的sql知识.这本书中的所有代码和函数均适用于my sql 8.0版本. SQL的基本功能数据定义(DDL)--对数据库, ...

  7. 管道过滤模式 大数据_大数据管道配方

    管道过滤模式 大数据 介绍 (Introduction) If you are starting with Big Data it is common to feel overwhelmed by t ...

  8. mysql 如何对表排序_学习MySQL:对表中的数据进行排序和过滤

    mysql 如何对表排序 In this article, we will learn how we can sort and filter data using the WHERE clause a ...

  9. oracle 查的数据去重复数据,Oracle查询和过滤重复数据

    对数据库某些意外情况,引起的重复数据,如何处理呢? ----------------查重复: select * from satisfaction_survey s where s.as_side = ...

最新文章

  1. 《智慧书》格言241-250
  2. Redis---持久化
  3. java:final,finally,finalize区别
  4. 基于NVIDIA显卡的硬编解码的一点心得 (完结)
  5. PHP的uniqid
  6. 钢材规格解读的软件_万维软件ERP五金建材行业解决方案
  7. CSS样式之内容居中方法
  8. matelab中simulink报错改正方法
  9. 怎样Interlocked.Increment一个反射得到的field?
  10. mysql 39 t.id 39_ERROR 2003 (HY000): Can#39;t connect to MySQL server on #39;10.16.115.101#39; (1...
  11. hbase常识及habse适合什么场景
  12. 机械工程专业英语复习
  13. 模拟电路和数字电路的学习笔记(精华总结55条)
  14. Python爬虫之起点中文网完本小说
  15. 2021年N1叉车司机考试总结及N1叉车司机操作证考试
  16. 车载多媒体 android play,先锋推新款车载多媒体设备 支持Android Auto
  17. 引用vue-baidu-map 做一个签到打卡功能
  18. mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)
  19. Python Selenium库的使用
  20. 内部和外部聚类算法评价指标

热门文章

  1. 23丨MySQL:数据库级监控及常用计数器解析(下)
  2. 用手机画画什么触控笔比较好?触控笔四大品牌推荐
  3. Aspose实现word、excel、ppt转pdf
  4. 安全电子签章密码技术规范_首个国家标准历时3年诞生,电子签章越来越安全...
  5. 计算机软件大赛作品,2015年大赛软件服务外包作品决赛入围作品公示
  6. ArduinoUNO+ESP8266实现MQTT简单发布(不烧录ESP8266)
  7. php ip获取邮政编码,地理位置-如何从IP地址确定邮政编码和城市?
  8. @Temporal标签的作用
  9. STM32系列后缀的意思
  10. 2019年最值得关注的五大区块链游戏, 了解DAPP看这一篇就够了