4.高级数据过滤 ---SQL

一、AND操作符



要通过不止一个列进行过滤,可以使用A ND操作符给WHERE子句附加条件.

SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = ‘DLL01‘ AND prod_price <= 4;

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

*可以增加多个过滤条件,每个条件间都要使用A ND关键字。

二、OR操作符



OR操作符与A ND操作符正好相反,它指示DBMS检索匹配任一条件的行。事实上,许多DBMS在OR WHERE子句的第一个条件得到满足的情况
下,就不再计算第二个条件了(在第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来)

SELECT prod_name, prod_price
FROM Products
WHERE vend_id = ‘DLL01‘ OR vend_id = ‘BRS01’;

分析▼
此SQL语句检索由任一个指定供应商制造的所有产品的产品名和价格。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。如果这里
使用的是A ND操作符,则没有数据返回(因为会创建没有匹配行的WHERE子句)。

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

三、求值顺序


SELECT prod_name, prod_price
FROM Products
WHERE vend_id = ‘DLL01‘ OR vend_id = ‘BRS01’
AND prod_price >= 10;
输出▼
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900
Rabbit bean bag toy 3.4900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900

分析▼
请看上面的结果。返回的行中有4行价格小于10美元,显然,返回的行未按预期的进行过滤。为什么会这样呢?原因在于求值的顺序。
SQL(像多数语言一样)在处理OR操作符前,优先处理A ND操作符。当SQL看到上述WHERE子句时,它理解为:由供应商BRS01制造的价格
为10美元以上的所有产品,以及由供应商DLL01制造的所有产品,而不管其价格如何。换句话说,由于A ND在求值过程中优先级更高,操作符
被错误地组合了。

此问题的解决方法是使用圆括号对操作符进行明确分组。请看下面的SELECT语句及输出:

SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = ‘DLL01‘ OR vend_id = ‘BRS01’)
AND prod_price >= 10;
输出▼
prod_name prod_price
------------------- ----------
18 inch teddy bear 11.9900

分析▼
这条SELECT语句与前一条的唯一差别是,将前两个条件用圆括号括了起来。因为圆括号具有比A ND或OR操作符更高的求值顺序,所以DBMS
首先过滤圆括号内的OR条件。这时,SQL语句变成了选择由供应商DLL01或BRS01制造的且价格在10美元及以上的所有产品,这正是我们希望
的结果。

提示:在WHERE子句中使用圆括号
任何时候使用具有A ND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希
望的那样。使用圆括号没有什么坏处,它能消除歧义。

四、IN操作符



IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

IN取一组由逗号分隔、括在圆括号中的合法值

SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( ‘DLL01‘, ‘BRS01‘ )
ORDER BY prod_name;
输出▼
prod_name prod_price
------------------- ----------
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
8 inch teddy bear 5.9900
Bird bean bag toy 3.4900
Fish bean bag toy 3.4900
Rabbit bean bag toy 3.4900
Raggedy Ann 4.9900

分析▼
此SELECT语句检索由供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。

你可能会猜测IN操作符完成了与OR相同的功能,恭喜你猜对了!

为什么要使用IN操作符?其优点为:
*在有很多合法选项时,IN操作符的语法更清楚,更直观。
*在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
*IN操作符一般比一组OR操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。
*IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。
IN
WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

五、NOT操作符



WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为NOT从不单独使用(它总是与其他操作符一起使用),

所以它的语法与其他操作符有所不同。NOT关键字可以用在要过滤的列前,而不仅是在其后。

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

分析▼
为什么使用NOT?对于这里的这种简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。例如,在
与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行。
说明:MariaDB中的NOT
MariaDB支持使用NOT否定IN、BETWEEN和EXISTS子句。大多数DBMS允许使用NOT否定任何条件。

时间: 2024-10-16 06:02:55

4.高级数据过滤 ---SQL的相关文章

高级数据过滤(like)

单字符过滤 '_' select * from T_Employee where FName like  '_erry' 多字符过滤 '%' select * from T_Employee where FName like  'T%' 集合匹配过滤 [jt] :第一个字母为J 或t的信息                   [^jt] 反集合: 第一个字母不为J 或T 的信息 select * from T_Employee where FName like'[jt]%' select * f

SQL中的高级数据操作

一.新增数据 1. 主键冲突:更新和替换 ① insert into 表名 [(字段列表)] values (值列表) on duplicate key update 字段 = 新值, 字段 = 值, ...; -- 更新 ② replace into 表名 [(字段列表)] values (值列表); -- 替换 2. 蠕虫复制 create table 表名A like 数据库.表名B; -- 从已有表中复制表结构(不复制数据), 如表B与表A在同一数据库,可活力数据库名; insert i

&lt;&lt;ABP框架&gt;&gt; 数据过滤

文档目录 本节内容: 简介 预定义过滤 ISoftDelete 何时可用? IMustHaveTenant 何时可用? IMayHaveTenant 何时可用? 禁用过滤 关于using声明 关于多租户 启用过滤 设置过滤参数 SetTenantId 方法 自定义过滤 EntityFramework.DynamicFilters 文档 其它 ORM 简介 通常都会用到软删除模式(不把一个实体从数据库中删除,只是给它做个标志“deleted“),如果一个实体被软删除,它不应被应用意外地获取,为了提

MySQL基础(四):数据过滤

数据过滤 WHERE子句组合NOT和IN操作符以建立功能更强的更高级的搜索条件. AND操作符 为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件.下面的代码给出了一个例子: 输入 SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10; 输出 分析 此SQL语句检索由供应商1003制造且价格小于等于10美元的所有产品的名称和价格.这条SELEC

高级数据持久化 CoreData

一.ios3.0以后推出的  优点:不用写SQL语句 简化代码    以对象形式存储数据 更符合面向对象思想 CoreData允许按照 实体-属性-值 模型组织数据 以XML,二进制,SQLite 实体描述类:NSEntituDescripion创建对象 不用alloc init 数据连接器类(核心):NSPersistentStoreCoodinator 助理 数据管理器类(实际操作的临时数据库):NSManagedObjectContext(被管理对象的上下文) 数据模型器类(相当于数据库的

【MySQL比知必会】第七章 数据过滤

1.组合WHERE子句 操作符(operator):用来联结或改变WHERE子句中的子句的关键字. 2.AND操作符 输入:SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10; 分析:显示三列--prod_id,prod_price,prod_name,过滤条件是,供应商id是1003,价格小于10.AND就是需要同时满足的过滤条件. 3.OR操作符 输入:SELE

php经常用到的数据过滤的方法

<?php /** * global.func.php 公共函数库 */ /** * 返回经addslashes处理过的字符串或数组 * @param $string 需要处理的字符串或数组 * @return mixed */ function new_addslashes($string){ if(!is_array($string)) return addslashes($string); foreach($string as $key => $val) $string[$key] =

C#实现通用数据过滤窗体

最近一直在做WINFORM项目,所以经常有些新的想法或尝试与大家分享,之前与大家分享了通用窗体遮罩层.通用可附加数据绑定的DataGridView.窗体渐显,今天来分享一个大家在其它软件中常见的功能:数据过滤查询. 先看一下我实现的的整体效果: 过滤之后: 说一下实现上述功能的思路: 首先说一下界面的设计> 1.创建一个窗体(在此称作:过滤窗体FrmFilter),然后在窗体上部放一个DataGridView控件.下面放一个Panel,然后Panel中放两个按钮,至于如何更好的布局或是否需要适应

以慕课网日志分析为例 进入大数据 Spark SQL 的世界

详情请交流  QQ  709639943 01.以慕课网日志分析为例 进入大数据 Spark SQL 的世界 02.漫谈spring cloud分布式服务架构 03.Spring Cloud微服务实战视频课程 04.漫谈spring cloud 与 spring boot 基础架构 05.Java秒杀系统方案优化 高性能高并发实战 06.Java深入微服务原理改造房产销售平台 07.快速上手Linux 玩转典型应用 08.快速上手Ionic3 多平台开发企业级问答社区 09.Java Sprin