劲头好像没有前几天那么抢先,说不出来的疲惫。窗外是春暖花开,不知道什么时候能够拿到笔记本电脑,又什么时候武汉人民能够完全痊愈,只能尽自己的努力,把当下能做的事情做好。
今天的笔记关键词是:WHERE、BETWEEN AND 、NULL
目录
4.1 使用WHERE子句
只检索所需数据需要指定搜索条件(searchcriteria),搜索条件也称为过滤条件(filtercondition)。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出:
相等校验:
SELECT prod_name,prod_price FROM Products WHERE prod_price = 3.49;
位数问题:有多少个0?练习示例时,可能发现显示结果有3.49、3.490、3.4900等。出现这样的情况,往往是因为DBMS指定了所使用的数据类型及其默认行为。所以,输出不同,不必焦虑,毕竟从数学角度讲,3.49和3.4900是一样的。
过滤问题:分为SQL过滤 | 应用过滤数据。也可以在应用层过滤。这样理解,使用SQL语句或者客户端代码来过滤,前者是对在数据库中检索结果的过滤,后者通过应用代码或者编程手段来完成过滤,后者可能会影响自身性能,并且不具备伸缩性,如果联网查询的话,还会造成带宽浪费。
位置问题:WHERE子句和ORDER BY的位置
4.2 WHERE子句操作符
WHERE子句中使用的操作符可以理解成,对于一些数学性语言可以符号化。大于小于就不说了,在指定两值间,属于范围,空值的判断。属于边界条件判定。
兼容性问题:针对不同的DBMS支持不同的操作符,具体参考对应文档。
① 单个值检查
用例子说话(列出所有价格小于10美元的产品):
SELECT prod_name,prod_price FROM Products WHERE prod_price < 10;
小于以后,再加个等号的,经过测试,没有恰好10美元的产品,所以,使用了一个表中的值5.99:
SELECT prod_name,prod_price FROM Products WHERE prod_price >= 5.99;
可以看到结果包括产品价格5.99及以上的结果。
② 不匹配检查
列出所有非供应商DLL01制造的产品记录:
SELECT vend_id, prod_name FROM Products WHERE vend_id <>'DLL01';
引号问题:单引号用来先定字符串,在值和字符串类型的列进行比较时候记得添加引号限定,数值列比较不需要引号限定。
不等于有两种表达,还有一种“ != ”,也可以来试试:
SELECT vend_id,prod_name FROM PRoducts WHERE vend_id != 'DLL01';
互换问题:这两种不等于操作符,通常是可以互换的,但是考虑到不同的DBMS不一定都支持,所以具体参看DBMS文档。
③ 范围值检查
要检查某个范围的值,可以使用BETWEEN操作符。
例子说明用法,检索价格在5美元和10美元之间的所有产品:
SELECT prod_name,prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;
用法说明:[m,n]是一个范围,同样的,在本例中,BETWEEN一个关键字不行,加上AND,中间放较小值n,后面放较大值m。为了验证较大值在前会出现什么类型错误,语法还是结果,验证了一下,发现只是出现空集,但最好不要这样用。
④ 空值检查
在创建表时,设计表时可以指定其中列能否不包含值。在一个列不包含值时,称其包含空值NULL。
NULL :无值(no value),与字段包含0、空字符串或仅仅包含空格不同。
我们的操作符中IS NULL,终于要派上用场。
先拿产品价格试个水,试着返回所有没有价格(空prod_price字段,不是价格为0)的产品:
发现没有结果,所以换个有NULL值的表来检索一下~
SELECT cust_name FROM Customers WHERE cust_email IS NULL;
果然出来空值的结果。这里插入一个小技巧,因为一直敲命令,一直到最后满屏都是结果,有些头晕,可以输入clear命令后回车完成清屏操作;
扩展问题:这里学到的都是基本的操作符,很多DBMS扩展了标准的操作符集,更加高档的过滤选择,用啥可以熟悉啥。
区别问题(NULL 和 非匹配):通过过滤选择不包含指定值的所有行时,可能希望含NULL值的行也一起包含进去,实际上不能完成这样的操作、因为未知(unknown)有特殊的含义,数据库不知道它们是否匹配,所以在进行匹配过滤或非匹配过滤时,不会返回这些结果。过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回的数据中。
说实话这段话我有点不太懂这段,但大概表达的意思可能是,需要加一层验证,通过非匹配的方式不能得到不包含指定值也含有NULL的行记录,所以这里贴出这段话。
刚好这部分结束了。主要学习到检验结果的方式,其中包括操作符和匹配问题。
喊一句~刻意练习,每日精进。接着开始后面的工作~