已经学习完查询某个字段的数据,但是这些数据是所有行的数据;在所有行的数据的基础上,学习了排序,学习了限制返回个数,学习了返回不同的数据;上面这些情况都是在不加行过滤的查询,所以查询的结果都是所有行的数据,而不是特定行的数据!比如我们查询所有的商品名称,给商品名称排序,限制商品返回行数,我们查询的结果都是所有的行。
之前我们所有的查询都没有做过滤,好比查看公司的所有员工名称。现在呢?比如查看公司户籍是北京的员工。
情景类比:飞鹰小学5年2班的同学年龄是13岁的学生去操场上;比如公司职工中找出北京的同事!现在已经不再找全部数据了,我们只找到我们想要数据。
如何实现呢?使用WHERE(where)字句,WEHEW所在的位置,表名的后面。
查询情景:查询出价格等于3.49的商品名称。
查询SQL:SELECT prod_name FROM Products WHERE prod_price = 3.49;
结果说明:1.where字句在表名后面;2.过滤条件是个相等性比较,即商品价格等于3.49;
在过滤数据时,可以在数据库层面进行SQL过滤;当SQL查询数据超过实际需要的数据,需要在应用程序中对数据进行过滤。
在SQL过滤时,需要对数据库进行优化,以便快速有效地对数据进行过滤;
在应用程序过滤时,处理数据库工作将影响应用程序性能,同时不具备伸缩性,发送多余的数据浪费带宽。
所以推荐使用SQL过滤,这就涉及到SQL优化问题。
前面说过ORDER BY和LIMIT的位置,排队之后取前面几个。
那么WHERE和ORDER BY的顺序呢?
类比现实:SQL过滤是不断缩小数据范围,比如查询全部人口、查询中国人口、查询北京人口、查询海淀人口。WHERE才是真正缩小查询范围的所在,其他的操作都是在WHERE基础上进行的操作。
顺序如下:
WHERE字句 -> ORDER BY字句 -> LIMIT
是否有如此认识,开始查询数据,从单个字段开始,然后查询多个字段,最后查询全部字段;使用字段进行排序,从单个字段开始,然后使用多个字段排序;现在过滤条件也是,使用单个字段进行过滤,然后再使用多个字段进行过滤;现在我们使用单个表进行查询,然后我们使用多个表进行查询;学习都是从0开始,然后是1,然后是多个,然后全部,循序渐进地进行,然而根本原因在于处理问题的条件越来越复杂!学习就是从简单到逐步复杂的过程。
WHERWE操作符
操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的两个值之间
操作符说明:操作符类似于数学上的四则混合运算符号。有过编程经验可能对等于=有点费解,因为编程中=是负赋值操作符,容易混淆;<>和!=作用相同,都是不等于的意思;BETWEEN呢,是查询数据的范围,需要和and联合使用,比如数值在3到10之间,时间查询2016年1月到2016年6月等等。
测试场景:查询商品ID等于br01的商品数据。
测试SQL:SELECT * FROM Products WHERE prod_id = 'br01';
说明:
1.默认而言,mysql数据存储是不区分大小写的,所以查询br01,返回出来的BR01都可以。
2.为什么对br01使用引号呢,因为br01是字符串数据类型,只要是字符串数据类型都需要使用'';
测试场景:查询商品价格小于等于8.99元的商品内容。
测试SQL:SELECT * FROM Products WHERE prod_price <= 8.99;
测试场景:查询商品价格大于5元,小于10元的商品。
测试SQL:SELECT * FROM Products WHERE prod_price BETWEEN 5 AND 10;
说明:
1.在查询范围的时候,使用BETWEEN..AND操作。
2.BETEEN small AND big,第一个数值是开始值,第二个值是结束值;
3.查询范围包括small和big,即相当于大于等于small,小于等于big。
首先明确什么是空值呢?
类比现实:使用excel记录员工信息,有的信息是非必要的,例如星座信息,那么当录入新用户信息,这个星座信息就可以不填写数据。
数据库:创建表时可以指定其中哪些字段可以不包含值,那么该列不包含值时称之为包含空值NULL。类似上面的星座信息,可以不填写,所以就成为包含空值。
查看客户表设计:
说明:
1.根据表定义,Null项表示是否允许为空值Null,即插入数据时是否可以该列是否可以不写数据;
空值Null,表示的含义是没有值,即该字段一条记录中可以没有数据!
它和0、空字符串、空格有什么不同呢?空值Null表示没有值,而0,空格和空字符串表示的是有值,只是值的有些特殊而已。
类比现实:一对夫妻还没有孩子呢,所以称之为空值NUll;而有一对夫妻有孩子了,孩子名字特殊一点,可能叫0,空格或者空字符串。
思考分析:特殊问题一定有特殊处理方式,是不是使用=进行比较呢?答案为否!
检测NUll值的方法:column IS NULL
测试场景:查询邮件为空值的客户名称。
测试SQL:SELECT cust_name, cust_email FROM Customers WHEREcust_email IS NULL;
错误SQL:SELECT cust_name, cust_email FROM Customers WHERE cust_email = NULL;
简答说明:查看某个字段值等于Null,使用IS NULL;如果查看某个字段不等于Null呢,使用IS NOT NULL;
测试场景:查询邮箱不等于[email protected]的客户Id、姓名和邮箱信息
思考:邮箱不等于[email protected]是否包含邮箱IS NULL的数据呢?
测试SQL1:
SELECT cust_id, cust_name, cust_email FROM Customers WHERE cust_email <> '[email protected]';
测试结果:
测试SQL2:
SELECT cust_id, cust_name, cust_email FROM Customers;
测试结果:
通过对比可知,SQL1和SQL2比较,不匹配是不包含NULL值的。
如何匹配呢,这个要涉及到多字段比较,而本篇主要是单字段比较,简单说明如下。
测试SQL3:
SELECT cust_id, cust_name, cust_email FROM Customers WHERE cust_email <> '[email protected]' OR cust_email IS NULL;
测试结果:
NULL和不匹配说明
在进行选择过滤特定值的行时,希望通过不匹配返回NUll值的行。但是为什么不行呢?不匹配的前提表示有值,而NULL值根本就没有值,所以不会在有值的范围内,因此需要对无值进行单独处理。
类比现实:村里叫哪些孩子数不等于1个的家庭去领红包,那么只要孩子数大于1的都可以去领,然而根本没有孩子的呢,要不要去呢?这就涉及到有无的划分。如果说没有孩子等于有0个孩子,那么就可以。如果说领红包的前提必须有孩子,那么没有孩子的就无法去领。