上一节,第三课 排序检索数据
数据库表中通常会包含大量的数据,很少需要查所有的行,也要避免全表扫描。我们就需要用限制条件来找我们需要的数据,也就是过滤。
搜索条件(search criteria) 过滤条件(filter condition) 都是一码事儿。
select语句中使用where子句来过滤。
SELECT prod_id,prod_price,prod_name from products
where prod_price=3.49
;
这里只是简单的用了相等检验。SQL还能做更多事情,且看后边分解。
数据也可以在应用层过滤,但是我们一般不那么做,如果在客户端过滤,服务器就不得不发送多余的数据,客户端处理数据库的工作也会变大,影响应用的性能,浪费网络的带宽。我们一般选择优化数据库来高效的过滤数据。
SELECT prod_name,prod_price FROM Products
WHERE prod_price BETWEEN 5 AND 10;
这—课介绍了如何用SELECT语句的WHERE子句过滤返回的数据。我们学习了如何检验相等、不相等、大于、小于、值的范围以及NULL值等。
操作符(operator) : 用来联结或改变where子句中的子句的关键字,也成为逻辑操作符(logical operator)。通常and,or;
表示且,两个条件都满足才行,而且and是就近原则,下面细说。
SELECT prod_id,prod_name,prod_price FROM Products
WHERE vend_id = 'DLL01' and prod_price <= 4;
任意一个条件满足都行。
SELECT prod_id,prod_name,prod_price FROM Products
WHERE vend_id = 'DLL01' or prod_price <= 4;
之所以说and是就近原则,其实是先执行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 IN ( 'DLLO1','BRS01')
ORDER BY prod_name;
注意和between and的区别,between and是两个数值范围。
in和or的效果基本一样。为啥要用in呢?
否定的意思,取反;
SELECT prod_name FROM Products
WHERE NOT vend_id = 'DLLO1'ORDER BY prod_name;
前面介绍的所有操作符都是针对已知值进行过滤的。不管是匹配一个值还是多个值,检验大于还是小于已知值,或者检查某个范围的值,其共同点是过滤中使用的值都是已知的。但满足不了现实的需求,必须找学生里边,所有姓吴的同学,操作符就无法满足。
通配符(wildcard):用来匹配值的一部分特殊字符。
搜索模式(search pattern): 有字面值、通配符或两者组合构成的搜索条件。
要使用通配符,就必须使用like
!!!
谓词(predicate): 操作符何时不是操作符?答案是,它作为谓词时。从技术上说,LIKE是谓词而不是操作符。虽然最终的结果是相同的,但应该对此术语有所了解,以免在SQL文献或手册中遇到此术语时不知所云。
通配符搜索只能用于文本字段(字符串);
% 可以表示任意字符及个数。
SELECT prod_id,prod_name FROM Products
WHERE prod_name LIKE 'Fish%';
注意: 请注意 NULL
通配符%看起来像是可以匹配任何东西,但有个例外,这就是 NULL。子句WHERE prod_name LIKE '%'不会匹配产品名称为 NULL 的行。
与%作用差不多,_表示匹配单个字符,而不是多个。
而且也不能是0个。只能是1个不能多也不能少。
方括号[ ] 通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。
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