mysql必知必会 - 过滤数据(单字段过滤)

    已经学习完查询某个字段的数据,但是这些数据是所有行的数据;在所有行的数据的基础上,学习了排序,学习了限制返回个数,学习了返回不同的数据;上面这些情况都是在不加行过滤的查询,所以查询的结果都是所有行的数据,而不是特定行的数据!比如我们查询所有的商品名称,给商品名称排序,限制商品返回行数,我们查询的结果都是所有的行。

    之前我们所有的查询都没有做过滤,好比查看公司的所有员工名称。现在呢?比如查看公司户籍是北京的员工。


    1.WHERE子句

    情景类比:飞鹰小学5年2班的同学年龄是13岁的学生去操场上;比如公司职工中找出北京的同事!现在已经不再找全部数据了,我们只找到我们想要数据。

    如何实现呢?使用WHERE(where)字句,WEHEW所在的位置,表名的后面。

    查询情景:查询出价格等于3.49的商品名称。

    查询SQL:SELECT prod_name FROM Products WHERE prod_price = 3.49;

    mysql必知必会 - 过滤数据(单字段过滤)_第1张图片   

    结果说明:1.where字句在表名后面;2.过滤条件是个相等性比较,即商品价格等于3.49;

   

    2.SQL过滤和应用程序过滤

    在过滤数据时,可以在数据库层面进行SQL过滤;当SQL查询数据超过实际需要的数据,需要在应用程序中对数据进行过滤。

    在SQL过滤时,需要对数据库进行优化,以便快速有效地对数据进行过滤;

    在应用程序过滤时,处理数据库工作将影响应用程序性能,同时不具备伸缩性,发送多余的数据浪费带宽。

    所以推荐使用SQL过滤,这就涉及到SQL优化问题。


    3.WHEER字句位置

    前面说过ORDER BY和LIMIT的位置,排队之后取前面几个。

    那么WHERE和ORDER BY的顺序呢?

    类比现实:SQL过滤是不断缩小数据范围,比如查询全部人口、查询中国人口、查询北京人口、查询海淀人口。WHERE才是真正缩小查询范围的所在,其他的操作都是在WHERE基础上进行的操作。

    顺序如下:

    WHERE字句  ->  ORDER BY字句 -> LIMIT

    mysql必知必会 - 过滤数据(单字段过滤)_第2张图片

   

    4.单字段过滤

    是否有如此认识,开始查询数据,从单个字段开始,然后查询多个字段,最后查询全部字段;使用字段进行排序,从单个字段开始,然后使用多个字段排序;现在过滤条件也是,使用单个字段进行过滤,然后再使用多个字段进行过滤;现在我们使用单个表进行查询,然后我们使用多个表进行查询;学习都是从0开始,然后是1,然后是多个,然后全部,循序渐进地进行,然而根本原因在于处理问题的条件越来越复杂!学习就是从简单到逐步复杂的过程。

   

    5.WEHWE字句操作符

    WHERWE操作符

    操作符      说明

    =           等于

    <>          不等于

    !=          不等于

    <           小于

    <=          小于等于

    >           大于

    >=          大于等于

    BETWEEN     在指定的两个值之间

    操作符说明:操作符类似于数学上的四则混合运算符号。有过编程经验可能对等于=有点费解,因为编程中=是负赋值操作符,容易混淆;<>和!=作用相同,都是不等于的意思;BETWEEN呢,是查询数据的范围,需要和and联合使用,比如数值在3到10之间,时间查询2016年1月到2016年6月等等。


    6.WHERE字句操作符运用

    测试场景:查询商品ID等于br01的商品数据。

    测试SQL:SELECT * FROM Products WHERE prod_id = 'br01';

    mysql必知必会 - 过滤数据(单字段过滤)_第3张图片   

    说明:

    1.默认而言,mysql数据存储是不区分大小写的,所以查询br01,返回出来的BR01都可以。

    2.为什么对br01使用引号呢,因为br01是字符串数据类型,只要是字符串数据类型都需要使用'';


    测试场景:查询商品价格小于等于8.99元的商品内容。

    测试SQL:SELECT * FROM Products WHERE prod_price <= 8.99;

    mysql必知必会 - 过滤数据(单字段过滤)_第4张图片

   

    测试场景:查询商品价格大于5元,小于10元的商品。

    测试SQL:SELECT * FROM Products WHERE prod_price BETWEEN 5 AND 10;

    mysql必知必会 - 过滤数据(单字段过滤)_第5张图片   

    说明:

    1.在查询范围的时候,使用BETWEEN..AND操作。

    2.BETEEN small AND big,第一个数值是开始值,第二个值是结束值;

    3.查询范围包括small和big,即相当于大于等于small,小于等于big。


    7.空值检测

   

    7.1什么是空值

    首先明确什么是空值呢?

    类比现实:使用excel记录员工信息,有的信息是非必要的,例如星座信息,那么当录入新用户信息,这个星座信息就可以不填写数据。

    数据库:创建表时可以指定其中哪些字段可以不包含值,那么该列不包含值时称之为包含空值NULL。类似上面的星座信息,可以不填写,所以就成为包含空值。

    查看客户表设计:

    mysql必知必会 - 过滤数据(单字段过滤)_第6张图片

    说明:

    1.根据表定义,Null项表示是否允许为空值Null,即插入数据时是否可以该列是否可以不写数据;


    7.2空值区别

    空值Null,表示的含义是没有值,即该字段一条记录中可以没有数据!

    它和0、空字符串、空格有什么不同呢?空值Null表示没有值,而0,空格和空字符串表示的是有值,只是值的有些特殊而已。

    类比现实:一对夫妻还没有孩子呢,所以称之为空值NUll;而有一对夫妻有孩子了,孩子名字特殊一点,可能叫0,空格或者空字符串。


    7.3如何检测某个字段是NULL值

    思考分析:特殊问题一定有特殊处理方式,是不是使用=进行比较呢?答案为否!

    检测NUll值的方法:column IS NULL

    测试场景:查询邮件为空值的客户名称。

    测试SQL:SELECT cust_name, cust_email FROM Customers WHEREcust_email IS NULL;

    mysql必知必会 - 过滤数据(单字段过滤)_第7张图片

    错误SQL:SELECT cust_name, cust_email FROM Customers WHERE cust_email = NULL;

   

   

    简答说明:查看某个字段值等于Null,使用IS NULL;如果查看某个字段不等于Null呢,使用IS NOT NULL;


    7.4Null和不匹配

    测试场景:查询邮箱不等于[email protected]的客户Id、姓名和邮箱信息

    思考:邮箱不等于[email protected]是否包含邮箱IS NULL的数据呢?

    测试SQL1:

SELECT cust_id, cust_name, cust_email FROM Customers WHERE cust_email <> '[email protected]';
    测试结果:

    mysql必知必会 - 过滤数据(单字段过滤)_第8张图片

    测试SQL2:

SELECT cust_id, cust_name, cust_email FROM Customers;
    测试结果:

    mysql必知必会 - 过滤数据(单字段过滤)_第9张图片

    通过对比可知,SQL1和SQL2比较,不匹配是不包含NULL值的。


    如何匹配呢,这个要涉及到多字段比较,而本篇主要是单字段比较,简单说明如下。

    测试SQL3:

SELECT cust_id, cust_name, cust_email FROM Customers WHERE cust_email <> '[email protected]' OR cust_email IS NULL;
  

    测试结果:

    mysql必知必会 - 过滤数据(单字段过滤)_第10张图片

    NULL和不匹配说明

    在进行选择过滤特定值的行时,希望通过不匹配返回NUll值的行。但是为什么不行呢?不匹配的前提表示有值,而NULL值根本就没有值,所以不会在有值的范围内,因此需要对无值进行单独处理。

    类比现实:村里叫哪些孩子数不等于1个的家庭去领红包,那么只要孩子数大于1的都可以去领,然而根本没有孩子的呢,要不要去呢?这就涉及到有无的划分。如果说没有孩子等于有0个孩子,那么就可以。如果说领红包的前提必须有孩子,那么没有孩子的就无法去领。

   

 

你可能感兴趣的:(MySQL)