高级过滤数据

-- 高级数据过滤 关键词:WHERE子句 | NOT 和IN 操作符

-- 组合WHERE子句 (给出多个WHERE子句。有两种使用方式:以AND子句或OR子句的方式使用)

-- AND操作符(相当于给WHERE子句添加了附加条件)
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <=4;

-- 因为只有一个AND子句,最多有两个过滤条件,可以增加多个过滤条件,每个条件间都要使用AND关键字

-- OR操作符(检索匹配任一条件的行,在DBMS中,在第一个条件满足时,不管第二个条件是否满足,相应的行都被检索出来)
SELECT prod_name,prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

-- 求值顺序(AND和OR两者结合可以进行复杂高级的过滤)(WHERE子句中可以包含任意数目的AND和OR操作符)
SELECT prod_name,prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;

我们会发现输出的结果并非达到我们的预期,原因就是SQL在处理OR操作符的时候,优先处理AND操作符,导致操作符被错误的组合成价格在10美元以上的BRS01以及任意价格的DLL01,导致输出错误的结果。

解决方法是使用圆括号对操作符进行明确分组。

SELECT prod_name,prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;

-- IN操作符(用来指定条件范围,范围中的每个条件都可以进行匹配)(由一组逗号分隔、括在圆括号中的合法值)
SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRES01')
ORDER BY prod_name;

-----------------------
SELECT prod_name,prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;

在这里发现使用IN操作符和OR操作符输出的结果大致相当(书中两个表结果完全相同,可能是DBMS的不同导致的差异,也可能是表的外部连接的影响)。但是可以发现IN操作符的优点大概如下:

1.IN操作符的语法更清楚,更直观。

2.IN在与(AND/OR)操作符混合使用的时候,求值顺序更容易管理。

3.IN操作符一般比一组OR操作符执行得更快。

4.IN操作符最大的优点是可以包含其他SELECT语句,能够更动态地简历WHERE字句。

-- NOT操作符(特点:从不单独使用;用在过滤的条件前后都可以)(功能:WHERE子句中用来否定其后条件的关键字)
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;

等同于

SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;

在简单的WHERE子句中NOT优势并不明显,但是在更加复杂的子句中,NOT非常有用。比如和IN操作符联合使用,可以非常简单地找出与条件列表不匹配的行。

posted @ 2019-06-22 21:02  小宇啊  阅读(276)  评论(0编辑  收藏  举报