美文网首页数据库
SQL必知必会(数据过滤)

SQL必知必会(数据过滤)

作者: 羋学僧 | 来源:发表于2021-08-04 09:32 被阅读0次

一、比较运算符

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

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

查询所有最大生命值大于 6000 的英雄:

SELECT name, hp_max FROM heros WHERE hp_max > 6000;

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

SELECT name, hp_max FROM heros WHERE hp_max BETWEEN 5399 AND 6811;

对 heros 表中的hp_max字段进行空值检查

SELECT name, hp_max FROM heros WHERE hp_max IS NULL;

二、逻辑运算符

存在多个 WHERE 条件子句,可以使用逻辑运算符:


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

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

查询最大生命值加最大法力值大于 8000 的英雄,或者最大生命值大于 6000 并且最大法力值大于 1700 的英雄

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;

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

如果我们对这条查询语句 OR 两边的条件增加一个括号

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 之间

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 转化为日期类型再进行比较。


三、使用通配符进行过滤

如果我们想要匹配任意字符串出现的任意次数,需要使用(%)通配符。

查找英雄名中包含“太”字的英雄都有哪些:

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

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

如果我们想要匹配单个字符,就需要使用下划线 _通配符。%_的区别在于,%代表一个或多个字符,而_只代表一个字符。

查找英雄名除了第一个字以外,包含“太”字的英雄有哪些。

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

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

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

相关文章

  • SQL 学习笔记

    SQL基础 参考书籍: 《SQL必知必会》 检索数据 过滤数据 函数 分组数据 子查询 简单联结 法一: 法二: ...

  • SQL必知必会(数据过滤)

    一、比较运算符 在 SQL 中,我们可以使用 WHERE 子句对条件进行筛选,在此之前,你需要了解 WHERE 子...

  • SQL必知必会

    《SQL必知必会》SQL是使用 广泛的数据库语言,几乎所有重要的DBMS都支持SQL。《SQL必知必会(第4版)》...

  • SQL必知必会----第四版(一)

    记录自己学习这本书的过程此篇文章包括检索、排序检索数据和过滤数据 通往其他文章的入口:SQL必知必会----第四版...

  • 《SQL必知必会》笔记(MySQL实现)---数据过滤

    这篇文章主要是学习一下SELECT语句的WHERE子句的使用和一些需要注意的问题。 在�大部分情况下,我们只需要检...

  • 《SQL必知必会》第4课 过滤数据

    这一课将讲授如何使用 SELECT 语句的 WHERE 子句指定搜索条件。 4.1 使用WHERE 子句 4.2 ...

  • 第二周学习总结

    本周继续学习了SQL必知必会这本书,从第2科开始,已学到第7课。本周主要学习了数据的检索和过滤。主要有如下收获: ...

  • 《SQL必知必会 第4版》PDF高清完整版-免费下载

    《SQL必知必会 第4版》PDF高清完整版-免费下载 《SQL必知必会 第4版》PDF高清完整版-免费下载 下载地...

  • 数据库笔记-SQL查询&过滤

    基础查询 查询排序 查询过滤 基础查询 以极客时间专栏《SQL必知必会》的王者荣耀表格为例。 SELECT语句 检...

  • 基础-SQL操作,MySQL为主

    内容来自《SQL必知必会》(4th)、 基础SQL语法,以MySQL为主 1.基本数据库名词 数据库:存放数据的容...

网友评论

    本文标题:SQL必知必会(数据过滤)

    本文链接:https://www.haomeiwen.com/subject/rawevltx.html