如何组合 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. mvc jQuery 点击按钮实现导出Excel功能 参数长短不限

    var exportSubmit=function(url, obj){ var form = $("<form>"); //定义一个form表单 form.attr( ...

  2. Educational Codeforces Round 80 (Rated for Div. 2)部分题解

    A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题 ...

  3. 浅谈C语言的数据存储(一)

    作者:冯老师,华清远见嵌入式学院讲师. 程序由指令和数据组成,C语言程序亦是如此.开发者在编写程序的时候往往需要根据不同数据的特点以及程序需求来选择不同的数据存储方式,那么在C语言中数据的存储分为哪些 ...

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

    目录 User Interface Text Guidelines 语法和风格 标点 编写工具提示tooltips 编写消息 UI文本大写 使用书本样式大写 使用句子样式大写 准备本地化 标记UI文本 ...

  5. Go语言标准库之net/http

    Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现. HTTP协议 超文本传输协 ...

  6. 关于在osgearth 中 出现 arial.ttf : file not handled 的问题

    这是由于配置osg时 freetype 插件没有配置到位. 我个人的解决方法 打开CMAKE,点击advance,不勾选OSG_TEXT_USE_FONTCONFIG. 同时将freetype路径设置 ...

  7. python学习(5)写一个二分算法的程序

    把之前学习的做一个小结.之前看二分查找法,只能是似而非地看懂大概.现在用这么多天的知识积累已经可以自己写了. 而且在算法书的基础上,把需要找的数字做一个人机互动操作. 另外,初步接触到了 __name ...

  8. Update、Insert注入技巧

    title: Update.Insert注入技巧 date: 2017-10-23 18:07:57 tags: ["注入"] 审计了不少代码,再看代码的时候最多出现的就是注入,很 ...

  9. 本地开发环境伪装成SSL连接的实现

    本地ssl开发测试实现1,在外网服务器上使用测试域名和t.test.cn,用let's encrypt申请 证书并正常运行2,修改本地服务器host文件,将t.kennylee.vip指向127.0. ...

  10. Oracle11G DG 搭建及管理

    一.准备工作 环境准备 主数据库Oracle Database安装 备服务器Oracle Database software 安装 二.正式配置 三.基本管理 -------------------- ...