海兴县做网站,好看的网站首页图片,个人开发app最简单方法,服务器 免费5-高级数据过滤
通过组合WHERE子句#xff0c;建立功能更强的检索语句。
5.1-组合WHERE子句
前面写的都是单一条件下的WHERE子句#xff0c;SQL语句允许给出多个WHERE子句来组合检索#xff0c;这些WHERE子句通过AND子句或者OR子句进行连接。
操作符#xff08;operato…5-高级数据过滤
通过组合WHERE子句建立功能更强的检索语句。
5.1-组合WHERE子句
前面写的都是单一条件下的WHERE子句SQL语句允许给出多个WHERE子句来组合检索这些WHERE子句通过AND子句或者OR子句进行连接。
操作符operator 用来联结或改变WHERE子句中的子句的关键字也称为逻辑操作符logical operator。
5.1.1 AND操作符
要通过不止一个列进行过滤可以通过AND操作符进行连接。
select prod_id,prod_price,prod_name
from products
where vend_id DLL01 AND prod_price 4;
上述SQL语句用于检索由DLL01供应商提供的价格小于等于4元的所有产品的价格和名称。该条语句包含两个查询条件一个是供应商id为DLL01另一个条件为价格小于等于4使用AND进行连接。 上述语句使用了一个AND连接符因此只有两个过滤条件。可以增加多个过滤条件每个条件之间都要使用AND连接符进行连接。
5.1.2 OR连接符
OR操作符与AND操作符正好相反它指示DBMS检索匹配任一条件的行。事实上许多DBMS在OR WHERE子句的第一个条件得到满足的情况下就不再计算第二个条件了在第一个条件满足时不管第二个条件是否满足相应的行都将被检索出来。
select prod_id,prod_price,prod_name
from products
where vend_id DLL01 OR vend_id BRS01; 上述SQL语句通过OR连接符进行检索只要满足任意一个条件就会将数据纳入检索范围。
5.1.3 求值顺序
WHERE子句可以包含很多的AND和OR操作符。但是这么做可能会有一些小问题。
例如想要列出价格为10元以上且有DLL01或者BRS01制造的所有产品
select prod_id,prod_price,prod_name
from products
where vend_id DLL01 or vend_id BRS01 and prod_price 10; 可以看到价格低于十元的产品也被输出了出来。
原因 在于求值顺序SQL在处理OR操作符前会优先处理AND操作符。当SQL看到上述语句时会理解为由供应商BRS01提供的10元以上的产品以及由供应商DLL01提供的所有产品而不管其价格如何。BRS01和价格大于等于10优先组合在一起。
解决办法是使用圆括号对操作符进行分组
select prod_id,prod_price,prod_name
from products
where (vend_id DLL01 OR vend_id BRS01) AND prod_price 10; 圆括号具有比AND或OR操作符更高的优先级所以DBMS首先过滤圆括号内的OR条件。
注意任何时候使用具有AND和OR操作符的WHERE子句都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序即使它确实如你希望的那样。使用圆括号没有什么坏处它能消除歧义。
5.2-IN操作符
IN操作符用来指定条件范围范围中的每个条件都可以进行匹配。
select prod_name,prod_price
from products
where vend_id IN (DLL01,BRS01)
order by prod_name; 上述语句检索由供应商DLL01和供应商BRS01所提供的产品。
IN操作符完成的功能与OR操作符完成的功能类似。
select prod_name,prod_price
from products
where vend_id DLL01 OR vend_id BRS01
order by prod_name; 两个语句输出的内容相同。 使用IN操作符的优点 有很多合法选项时IN操作符更为清晰明了。 在与其他AND和OR操作符组合使用IN时求值顺序更容易理解。 IN操作符一般比一组OR操作符执行速度更快。 IN最大的优点是可以包含其他select语句能够更动态的建立where子句。 5.3-NOT操作符
WHERE子句中的NOT操作符有且只有一个作用否定其后跟随的任何条件。
NOT从不单独使用总是与其他操作符一起使用。
select prod_name
from products
where NOT vend_id DLL01
order by prod_name;
检索所有vend_id不是DLL01的行。
上面的语句也可以使用或者!来实现。
select prod_name
from products
where vend_id DLL01
order by prod_name;select prod_name
from products
where vend_id ! DLL01
order by prod_name;
对于简单的where语句来说使用NOT操作符确实没有多少优势但是如果SQL语句比较复杂的话NOT就非常有用。
例如在与IN操作符联合使用时NOT可以非常简单地找出与条件列表不匹配的行。