SQL必知必会笔记五(高级数据过滤)

组合WHERE子句建立更高级的搜索条件,使用NOT和IN操作符
一、组合WHERE子句
为了进行更强的过滤控制,SQL允许给出多个WHERE子句。这些子句有两种使用方式,即以AND子句或OR子句的方式使用。
操作符(operator)
用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符(logical operator)。
AND操作符
要通过不只一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。
例如:
SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = ‘DLL01’ AND prod_price <= 4;
这条sql检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。
AND:用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
OR操作符
OR操作符与AND操作符正好相反,它指示DBMS检索匹配任一条件的行。
例如:
SELECT prod_name, prod_price FROM Products WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’;
SQL语句检索由任一个指定供应商制造的所有产品的产品名和价格。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。如果这里使用的是AND操作符,则没有数据返回(因为会创建没有匹配行的WHERE子句)。
OR:WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。
求值顺序
WHERE子句可以包含任意数目的AND和OR操作符。允许两者结合以进行复杂、高级的过滤。
SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。如果需要将OR的优先级提高,可以使用圆括号对操作符进行明确分组
例如:
SELECT prod_name, prod_price FROM Products WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’ AND prod_price >= 10;
SELECT prod_name, prod_price FROM Products WHERE (vend_id = ‘DLL01’ OR vend_id = ‘BRS01’) AND prod_price >= 10;
这两条sql的唯一差别是,后一条sql将前两个条件用圆括号括了起来。你会发现两者的检索结果完全不同。这是因为圆括号具有比AND或OR操作符更高的求值顺序,所以上面一条DBMS首先过滤的是AND条件而后一条则是先过滤的圆括号内的OR条件。
提示:在WHERE子句中使用圆括号
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。

二、IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。
例如:
SELECT prod_name, prod_price FROM Products WHERE vend_id IN ( ‘DLL01’, ‘BRS01’ ) ORDER BY prod_name;
这条SELECT语句检索由供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。
SELECT prod_name, prod_price FROM Products WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’ ORDER BY prod_name;
这里的OR操作符实现了同样的功能
那为什么要使用IN操作符?其优点为:
• 在有很多合法选项时,IN操作符的语法更清楚,更直观。
• 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
• IN操作符一般比一组OR操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。
• IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。
IN:WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

三、NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为NOT从不单独使用(它总是与其他操作符一起使用),所以它的语法与其他操作符有所不同。NOT关键字可以用在要过滤的列前,而不仅是在其后。
NOT:WHERE子句中用来否定其后条件的关键字。
例如:
SELECT prod_name FROM Products WHERE NOT vend_id = ‘DLL01’ ORDER BY prod_name;
这里的NOT否定跟在其后的条件,因此,DBMS不是匹配vend_id为DLL01,而是匹配非DLL01之外的所有东西。
上面的例子也可以使用<>操作符来完成,例如:
SELECT prod_name FROM Products WHERE vend_id <> ‘DLL01’ ORDER BY prod_name;
使用NOT的优点:对于这里的这种简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。例如,在与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行。
注意:MariaDB中的NOT
MariaDB支持使用NOT否定IN、BETWEEN和EXISTS子句。大多数DBMS允许使用NOT否定任何条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值