SQL必知必会-笔记(三)数据库基本操作(中)
高级数据过滤
AND
- 问题:检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格
- 解:
select prod_name,prod_price from Products where vend_id = 'DLL01' and prod_price <= 4;
OR
- 问题:检索由指定供应商制造的所有产品的产品名和价格
- 解:
select prod_name,prod_price from Products where vend_id = 'DLL01' or vend_id = 'BRS01';
求值顺序
- 问题:检索出价格为10美元及以上,且由DLL01或BRS01制造的所有产品
- 解:
select prod_name,prod_price from Products where prod_price >= 10 and vend_id = 'DLL01' or vend_id = 'BRS01';
乍一看,似乎没有问题,where prod_price >= 10 and vend_id = 'DLL01' or vend_id = 'BRS01'
很符合题目,但是看一下结果:
为什么会出现价格低于10美元的产品??
原因在于求值顺序,也就是AND
在求值过程中优先级更高,操作符被错误的组合。
- 正解:
select prod_name,prod_price from Products where prod_price >= 10 and (vend_id = 'DLL01' or vend_id = 'BRS01');
提示:任何时候使用具有AND
和OR
操作符的WHERE
子句,都应该使用圆括号明确的分组操作符。
IN
- 问题:检索由供应商DLL01和BRS01制造的所有产品
- 解:
select prod_name,prod_price from Products where vend_id in ('DLL01','BRS01');
可以看到IN
完成了OR
相同的功能,但是:
IN
操作符比OR
操作符执行的更快IN
操作符更加直观IN
最大的优点是可以包含其他SELECT
语句,后续会介绍
NOT
WHERE
子句中的NOT
操作符有且只有一个功能,那就是否定其后所跟的任何条件
- 问题:列出除DLL01之外的所有供应商制造的产品
- 解:
select prod_name, prod_price from Products where not vend_id = 'DLL01';
也可以用<>
完成
select prod_name,prod_price from Products where vend_id <> 'DLL01';
用通配符进行过滤
LIKE
%
通配符
- 问题:找出所有以Fish起头的产品
- 解:
select prod_id, prod_name, prod_price from Products where prod_name like 'Fish%';
_
通配符
_
只匹配单个字符
select prod_id,prod_name,prod_price from Products where prod_name like '__ inch teddy bear';
[ ]
通配符
[ ]
用来匹配指定位置的一个字符
- 问题:找出所有名字以J或M起头的联系人
- 解:
select cust_contact from Customers where cust_contact like '[JM]%' order by cust_contact;
MySQL中不可用