文章目录
第四课:过滤数据
4.1 使用where子句
数据库表中通常会包含大量的数据,很少需要查所有的行,也要避免全表扫描。我们就需要用限制条件来找我们需要的数据,也就是过滤。
搜索条件(search criteria) 过滤条件(filter condition) 都是一码事儿。
select语句中使用where子句来过滤。
SELECT prod_id,prod_price,prod_name from products
where prod_price=3.49
;
这里只是简单的用了相等检验。SQL还能做更多事情,且看后边分解。
数据也可以在应用层过滤,但是我们一般不那么做,如果在客户端过滤,服务器就不得不发送多余的数据,客户端处理数据库的工作也会变大,影响应用的性能,浪费网络的带宽。我们一般选择优化数据库来高效的过滤数据。
4.2 where子句操作符
SELECT prod_name,prod_price FROM Products
WHERE prod_price BETWEEN 5 AND 10;
4.3 小结
这—课介绍了如何用SELECT语句的WHERE子句过滤返回的数据。我们学习了如何检验相等、不相等、大于、小于、值的范围以及NULL值等。
第五课:高级数据过滤
5.1 组合where子句
操作符(operator) : 用来联结或改变where子句中的子句的关键字,也成为逻辑操作符(logical operator)。通常and,or;
5.1.1 and操作符
表示且,两个条件都满足才行,而且and是就近原则,下面细说。
SELECT prod_id,prod_name,prod_price FROM Products
WHERE vend_id = 'DLL01' and prod_price <= 4;
5.1.2 or操作符
任意一个条件满足都行。
SELECT prod_id,prod_name,prod_price FROM Products
WHERE vend_id = 'DLL01' or prod_price <= 4;
5.1.13 求值顺序
之所以说and是就近原则,其实是先执行and在执行or。
SELECT prod_name,prod_price FROM Products
WHERE vend_id = 'DLL01'OR vend_id = 'BRS01'
AND prod_price != 10;
当然了,要是加了括号 那就不一样了。括号的优先级高。
5.2 in操作符
标识条件范围。
SELECT prod_name,prod_price FROM Products
wHERE vend_id IN ( 'DLLO1','BRS01')
ORDER BY prod_name;
注意和between and的区别,between and是两个数值范围。
in和or的效果基本一样。为啥要用in呢?
- 在有很多合法选项时,IN操作符的语法更清楚,更直观。
- 在与其他AND 和OR操作符组合使用IN时,求值顺序更容易管理。IN操作符一般比一组OR操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。
- IN 的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。第11课会对此进行详细介绍。
5.3 NOT操作符
否定的意思,取反;
SELECT prod_name FROM Products
WHERE NOT vend_id = 'DLLO1'ORDER BY prod_name;
也可以用<> 或!=代替
第六课:通配符过滤
6.1 like操作符
前面介绍的所有操作符都是针对已知值进行过滤的。不管是匹配一个值还是多个值,检验大于还是小于已知值,或者检查某个范围的值,其共同点是过滤中使用的值都是已知的。但满足不了现实的需求,必须找学生里边,所有姓吴的同学,操作符就无法满足。
通配符(wildcard):用来匹配值的一部分特殊字符。
搜索模式(search pattern): 有字面值、通配符或两者组合构成的搜索条件。
要使用通配符,就必须使用like
!!!
谓词(predicate): 操作符何时不是操作符?答案是,它作为谓词时。从技术上说,LIKE是谓词而不是操作符。虽然最终的结果是相同的,但应该对此术语有所了解,以免在SQL文献或手册中遇到此术语时不知所云。
通配符搜索只能用于文本字段(字符串);
6.1.1 百分号%通配符
% 可以表示任意字符及个数。
SELECT prod_id,prod_name FROM Products
WHERE prod_name LIKE 'Fish%';
查找Fish开头的,
注意: 请注意 NULL
通配符%看起来像是可以匹配任何东西,但有个例外,这就是 NULL。子句WHERE prod_name LIKE '%'不会匹配产品名称为 NULL 的行。
6.1.2 下划线
与%作用差不多,_表示匹配单个字符,而不是多个。
而且也不能是0个。只能是1个不能多也不能少。
6.1.3 方括号[ ]
方括号[ ] 通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。
SELECT cust_contact
FROM customers
WHERE cust_contact
LIKE '[JM]%'
ORDER BY cust_contact;
这里很正常的遇到坑了,被坑了好久,5555~
上边的语句,别的DBMS也许可以,而我是使用的MySQL,正好不适用!!!下边看看MySQL是咋用的吧!!
select cust_contact
from customers
where cust_contact
rlike '^[JM]';
-- where cust_contact regexp '^[JM]';
跟上边的区别就是多了个r
和^
,这是为啥呢?
哎嘿,[ ] 在sql中其实是借鉴正则表达式的用法,在MySQL中不支持[ ],只能用正则表达式~~~ 所以。
使用通配符的技巧
通配符虽好,不要贪杯哦!
通配符相比来说更加的耗费性能。这里给出几点使用技巧:
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
总之,通配符是一种极其重要和有用的搜索工具,以后我们经常会用到它。
小结
这次讲了啥是通配符,以及怎么用还说了:
天下之事皆然,过则非惟无益,反害之。
樯橹灰飞烟灭,谈笑间 hhh