如何组合 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. halfcheetch win10

    HalfCheetah win10配置 1.使用Anaconda Prompt切到程序目录,执行pip install -r requirements.txt 补充说明: 使用pip与conda命令都 ...

  2. mybatis generator cmd 终端命令 生成dao model mapper

    mybatis generator cmd 终端命令 生成dao model mapper 文件包下载 mybatis-generator-core-1.3.2.jar 下载地址:https://gi ...

  3. php--->把json传来的stdClass Object类型转array

    php把json传来的stdClass Object类型转array 1.Php中stdClass.object.array的概念 stdClass是PHP的一个基类,即一个空白的类,所有的类几乎都继 ...

  4. CTF--HTTP服务--命令执行

    开门见山 1. 扫描靶机ip,发现PCS 172.18.5.1 2. 用nmap扫描靶机开放服务和服务版本 3. 再扫描靶机全部信息 4. 用nikto工具扫描http服务的敏感信息 5. 打开浏览器 ...

  5. Linux vi & bash使用笔记

    f 1.vi入门级命令 打开或新建 vi filename 有三种模式,刚开始进去的是一般模式,在一般模式下按 I 之后进入编辑模式 ,按Esc进入命令模式 在命令模式下按 :wq 保存退出 多个窗口 ...

  6. Tiny Linux -- tce-load

    Tiny Linux which has its own package manager called "tce-load". There's a list of packages ...

  7. C#系列之占位符的使用方法(二)

    今天,我将简单记录下占位符的使用方法 首先,我们来看不使用占位符的方法来代码输出 int number = 10; int number_1 = 20; int number_2 = 30; Cons ...

  8. Qt 中 this->size() this->rect() event->size() 三者差异

    测试代码: void OsgEarthGraphicsView::resizeEvent(QResizeEvent* event) { //if (scene()) //{ // scene()-&g ...

  9. Visual Studio 2015 配置 Python 环境

    Visual Studio 2015可以在安装时选择安装Python环境,首次使用VS2015执行python时需要配置环境变量: 配置VS2015的环境前需要先下载Python并安装: https: ...

  10. node基础 day1

    js为什么能在浏览器中运行 浏览器内部存在一个js解析器,解析ECMAscript 把引擎从浏览器中抽离出来,不再依赖浏览器,作为一个软件安装在电脑上,在命令行里面, 这个软件就是node node ...