如何组合 WHERE 子句以建立功能更强的更高级的搜索条件?如何使用 NOT 和 IN 操作符?

组合 WHERE 子句

第6章中介绍的所有 WHERE 子句在过滤数据时使用的都是单一的条
件。为了进行更强的过滤控制,MySQL允许给出多个 WHERE 子句。这些子
句可以两种方式使用:以 AND 子句的方式或 OR 子句的方式使用

操作符(operator) 用来联结或改变 WHERE 子句中的子句的关键
字。也称为逻辑操作符(logical operator)。

AND操作符

为了通过不止一个列进行过滤,可使用 AND 操作符给 WHERE 子句附加
条件。下面的代码给出了一个例子

此SQL语句检索由供应商 1003 制造且价格小于等于10美元的所
有产品的名称和价格。这条 SELECT 语句中的 WHERE 子句包含两
个条件,并且用 AND 关键字联结它们。 AND 指示DBMS只返回满足所有给
定条件的行。如果某个产品由供应商 1003 制造,但它的价格高于10美元,
则不检索它。类似,如果产品价格小于10美元,但不是由指定供应商制
造的也不被检索。

AND 用在 WHERE 子句中的关键字,用来指示检索满足所有给定
条件的行。
上述例子中使用了只包含一个关键字 AND 的语句,把两个过滤条件组
合在一起。还可以添加多个过滤条件,每添加一条就要使用一个 AND 。

OR 操作符

OR 操作符与 AND 操作符不同,它指示MySQL检索匹配任一条件的行。
请看如下的 SELECT 语句

此SQL语句检索由任一个指定供应商制造的所有产品的产品
名和价格。 OR 操作符告诉DBMS匹配任一条件而不是同时匹配
两个条件。

OR WHERE 子句中使用的关键字,用来表示检索匹配任一给定
条件的行

计算次序

WHERE 可包含任意数目的 AND 和 OR 操作符。允许两者结合以进行复杂
和高级的过滤

但是,组合 AND 和 OR 带来了一个有趣的问题。为了说明这个问题,来
看一个例子。假如需要列出价格为10美元(含)以上且由 1002 或 1003 制
造的所有产品。下面的 SELECT 语句使用 AND 和 OR 操作符的组合建立了一个
WHERE 子句

请看上面的结果。返回的行中有两行价格小于10美元,显然,
返回的行未按预期的进行过滤。为什么会这样呢?原因在于计
算的次序。SQL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操
作符。当SQL看到上述 WHERE 子句时,它理解为由供应商 1003 制造的任何
价格为10美元(含)以上的产品,或者由供应商 1002 制造的任何产品,
而不管其价格如何。换句话说,由于 AND 在计算次序中优先级更高,操作
符被错误地组合了

此问题的解决方法是使用圆括号明确地分组相应的操作符。请看下
面的 SELECT 语句

这条 SELECT 语句与前一条的唯一差别是,这条语句中,前两个
条件用圆括号括了起来。因为圆括号具有较 AND 或 OR 操作符高
的计算次序,DBMS首先过滤圆括号内的 OR 条件。这时,SQL语句变成了
选择由供应商 1002 或 1003 制造的且价格都在10美元(含)以上的任何产
品,这正是我们所希望的
在WHERE子句中使用圆括号 任何时候使用具有 AND 和 OR 操作
符的 WHERE 子句,都应该使用圆括号明确地分组操作符。不要
过分依赖默认计算次序,即使它确实是你想要的东西也是如
此。使用圆括号没有什么坏处,它能消除歧义。

IN 操作符

圆括号在 WHERE 子句中还有另外一种用法。 IN 操作符用来指定条件范
围,范围中的每个条件都可以进行匹配。 IN 取合法值的由逗号分隔的清
单,全都括在圆括号中。下面的例子说明了这个操作符

此 SELECT 语句检索供应商 1002 和 1003 制造的所有产品。 IN 操
作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号
中。

如果你认为 IN 操作符完成与 OR 相同的功能,那么你的这种猜测是对
的。下面的SQL语句完成与上面的例子相同的工作

为什么要使用 IN 操作符?其优点具体如下。

  • 在使用长的合法选项清单时, IN 操作符的语法更清楚且更直观。
  • 在使用 IN 时,计算的次序更容易管理(因为使用的操作符更少)。
  • IN 操作符一般比 OR 操作符清单执行更快。
  • IN 的最大优点是可以包含其他 SELECT 语句,使得能够更动态地建
    立 WHERE 子句。第14章将对此进行详细介绍

IN WHERE 子句中用来指定要匹配值的清单的关键字,功能与 OR
相当

NOT 操作符

WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定它之后所
跟的任何条件

NOT WHERE 子句中用来否定后跟条件的关键字。

为什么使用 NOT ?对于简单的 WHERE 子句,使用 NOT 确实没有什么优
势。但在更复杂的子句中, NOT 是非常有用的。例如,在与 IN 操作符联合
使用时, NOT 使找出与条件列表不匹配的行非常简单

MySQL中的NOT MySQL支持使用 NOT 对 IN 、 BETWEEN 和
EXISTS子句取反,这与多数其他 DBMS允许使用 NOT 对各种条件

本章讲授如何用 AND 和 OR 操作符组合成 WHERE 子句,而且还讲授了如
何明确地管理计算的次序,如何使用 IN 和 NOT 操作符
取反有很大的差别

mysql必知必会--数 据 过 滤的更多相关文章

  1. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

  2. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  3. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

  4. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  5. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  6. MySql必知必会实战练习(二)数据检索

    在上篇博客MySql必知必会实战练习(一)表创建和数据添加中完成了各表的创建和数据添加,下面进行数据检索和过滤操作. 1. Select子句使用顺序 select--->DISTINCT---& ...

  7. 读《MySQL必知必会》我学到了什么?

    前言 最近在写项目的时候发现自己的SQL基本功有些薄弱,遂上知乎查询MYSQL关键字,期望得到某些高赞答案的指点,于是乎发现了 https://www.zhihu.com/question/34840 ...

  8. MySQL必知必会1

    MySQL必知必会 ​ 了解SQL 什么是数据库:数据库(database)保存有阻止的数据的容器,可以把数据库想象成一个文件柜. 什么是表:表(table) 某种特定类型结构的结构化清单,数据库中的 ...

  9. MySQL必知必会(第4版)整理笔记

    参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...

  10. 《mysql 必知必会》 速查指南

    目录 增 添加一整行 插入多行 删 删除指定行 删除所有行 改 查 简单检索 结果筛选 结果排序 结果过滤 创建字段 处理函数 数据分组 其他高级用法 文章内容均出自 <MySQL 必知必会&g ...

随机推荐

  1. 解题笔记——NIT 遥远的村庄

    某个小镇有 N 个村庄,村庄编号1-N,给出 M 条单向道路,不存在环,即不存在 村庄A可以到达村庄B 且 村庄B也可以到达村庄A的情况.如果村庄A与村庄B之间存在一条单向道路,则说村庄A和村庄B之间 ...

  2. Leetcode | 刷题日记(1)

    本文记录个人刷题记录 推荐两个刷题网站: 地址:https://leetcode.com/ 另外一个地址:http://www.lintcode.com/ 1.Write a SQL query to ...

  3. vue2.x中使用三元表达式绑定class的时候遇到的坑

    这个确实是个坑,而且是来自文档的坑. 首先先看文档对这个的解释: 从实际的代码书写上,文档中的写法,vs code没报错,但是浏览器报了一堆的错. 我试了很多遍,发现类名必须是要用引号引起来,页面上语 ...

  4. linux --- 杀掉特定端口进程与启用SSH服务

    Linux下端口被占用解决 有时候关闭软件后,后台进程死掉,导致端口被占用.下面以JBoss端口8083被占用为例,列出详细解决过程. 解决方法: 1.查找被占用的端口 netstat -tln ne ...

  5. SDL多线程显示更新窗口

    //初始化SDL2和创建一个窗口,并且将屏幕绘制成大红色 #include <iostream> extern "C" { #include <SDL.h> ...

  6. 2019牛客多校2 F Partition problem(dfs)

    题意: n<=28个人,分成人数相同的两组,给你2*n*2*n的矩阵,如果(i,j)在不同的组里,竞争力增加v[i][j],问你怎么分配竞争力最 4s 思路: 枚举C(28,14)的状态,更新答 ...

  7. javascirpt获取随机数

    /* getran(min, max, n): 获取min与max之间的随机数 n: n保留浮点数数量 */ function getran(min, max, n){ return Number(( ...

  8. qt creator源码全方面分析(2-10-4)

    目录 Plugin Life Cycle Plugin Life Cycle 为了能够编写Qt Creator插件,您必须了解启动或关闭Qt Creator时,插件管理器所采取的步骤. 本节详细描述插 ...

  9. k8s系列---Worker节点扩容

    其他有关内容 安装:参考https://www.cnblogs.com/dribs/p/9082458.html 集群故障重置:参考https://www.cnblogs.com/dribs/p/10 ...

  10. k8s系列---k8s认证及serviceaccount、RBAC

    http://blog.itpub.net/28916011/viewspace-2215100/ 对作者文章有点改动 注意kubeadm创建的k8s集群里面的认证key是有有效期的,这是一个大坑!! ...