zoukankan      html  css  js  c++  java
  • 【MySQL】使用WHERE子句

    第6章 过滤数据

    简单记录 - MySQL必知必会 - [英]Ben Forta

    学习如何使用SELECT语句的WHERE子句指定搜索条件

    select ...from ... where ...

    1、使用WHERE子句

    在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句要写在表名(FROM子句)之后,

    例子,如下所示:

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_price=2.50;
    +---------------+------------+
    | prod_name     | prod_price |
    +---------------+------------+
    | Carrots       |       2.50 |
    | TNT (1 stick) |       2.50 |
    +---------------+------------+
    2 rows in set (0.01 sec)
    
    mysql>
    

    分析:从products表中检索prod_name,prod_price两个列,但不返回所有行,只返回prod_price值为2.50的行。选特定的值。

    注意 WHERE子句的位置 在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_price<100  ORDER BY prod_price DESC;
    +----------------+------------+
    | prod_name      | prod_price |
    +----------------+------------+
    | JetPack 2000   |      55.00 |
    | Safe           |      50.00 |
    | JetPack 1000   |      35.00 |
    | 2 ton anvil    |      14.99 |
    | Detonator      |      13.00 |
    | Bird seed      |      10.00 |
    | TNT (5 sticks) |      10.00 |
    | 1 ton anvil    |       9.99 |
    | Oil can        |       8.99 |
    | .5 ton anvil   |       5.99 |
    | Sling          |       4.49 |
    | Fuses          |       3.42 |
    | Carrots        |       2.50 |
    | TNT (1 stick)  |       2.50 |
    +----------------+------------+
    14 rows in set (0.00 sec)
    
    mysql> SELECT prod_name,prod_price FROM products ORDER BY prod_price DESC WHERE prod_price<100;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE prod_price<100' at line 1
    mysql>
    

    2、WHERE子句操作符

    操作符

    操作符	  		  说明
    =			    等于
    <>				不等于
    !=				等于
    <				小于
    <=				小于等于
    >				大于
    >=				大于等于
    BETWEEN			在指定的两个值之间
    

    在这里插入图片描述

    2.1、检查单个值

    测试相等

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_name='fuses';
    +-----------+------------+
    | prod_name | prod_price |
    +-----------+------------+
    | Fuses     |       3.42 |
    +-----------+------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    检查WHERE prod_name=‘fuses’语句,它返回prod_name的值为Fuses的一行。MySQL在执行匹配时默认不区分大小写,所以fuses与Fuses匹配。

    几个使用其他操作符的例子。

    列出价格小于10美元的所有产品

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_price<10;
    +---------------+------------+
    | prod_name     | prod_price |
    +---------------+------------+
    | .5 ton anvil  |       5.99 |
    | 1 ton anvil   |       9.99 |
    | Carrots       |       2.50 |
    | Fuses         |       3.42 |
    | Oil can       |       8.99 |
    | Sling         |       4.49 |
    | TNT (1 stick) |       2.50 |
    +---------------+------------+
    7 rows in set (0.00 sec)
    
    mysql>
    

    检索价格小于等于10美元的所有产品(输出的结果比价格小于10美元输出的结果多两种产品)

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_price<=10;
    +----------------+------------+
    | prod_name      | prod_price |
    +----------------+------------+
    | .5 ton anvil   |       5.99 |
    | 1 ton anvil    |       9.99 |
    | Bird seed      |      10.00 |
    | Carrots        |       2.50 |
    | Fuses          |       3.42 |
    | Oil can        |       8.99 |
    | Sling          |       4.49 |
    | TNT (1 stick)  |       2.50 |
    | TNT (5 sticks) |      10.00 |
    +----------------+------------+
    9 rows in set (0.00 sec)
    
    
    

    检索价格小于等于10美元的所有产品,价格倒序排序

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_price<=10 ORDER BY prod_price DESC;
    +----------------+------------+
    | prod_name      | prod_price |
    +----------------+------------+
    | Bird seed      |      10.00 |
    | TNT (5 sticks) |      10.00 |
    | 1 ton anvil    |       9.99 |
    | Oil can        |       8.99 |
    | .5 ton anvil   |       5.99 |
    | Sling          |       4.49 |
    | Fuses          |       3.42 |
    | Carrots        |       2.50 |
    | TNT (1 stick)  |       2.50 |
    +----------------+------------+
    9 rows in set (0.00 sec)
    
    mysql>
    

    2.2、不匹配检查

    列出不是由供应商1003制造的所有产品:

    1. <> 不等于
    mysql> SELECT vend_id,prod_name FROM products WHERE vend_id<>1003 ;
    +---------+--------------+
    | vend_id | prod_name    |
    +---------+--------------+
    |    1001 | .5 ton anvil |
    |    1001 | 1 ton anvil  |
    |    1001 | 2 ton anvil  |
    |    1002 | Fuses        |
    |    1005 | JetPack 1000 |
    |    1005 | JetPack 2000 |
    |    1002 | Oil can      |
    +---------+--------------+
    7 rows in set (0.00 sec)
    
    mysql>
    
    1. 使用!=而不是<>操作符
    mysql> SELECT vend_id,prod_name FROM products WHERE vend_id!=1003 ;
    +---------+--------------+
    | vend_id | prod_name    |
    +---------+--------------+
    |    1001 | .5 ton anvil |
    |    1001 | 1 ton anvil  |
    |    1001 | 2 ton anvil  |
    |    1002 | Fuses        |
    |    1005 | JetPack 1000 |
    |    1005 | JetPack 2000 |
    |    1002 | Oil can      |
    +---------+--------------+
    7 rows in set (0.00 sec)
    
    mysql>
    

    2.3、范围值检查

    BETWEEN操作符 between

    因为它需要两个值,即范围的开始值和结束值。

    例子:说明如何使用BETWEEN操作符,它检索价格在5美元和10美元之间的所有产品。

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10 ;
    +----------------+------------+
    | prod_name      | prod_price |
    +----------------+------------+
    | .5 ton anvil   |       5.99 |
    | 1 ton anvil    |       9.99 |
    | Bird seed      |      10.00 |
    | Oil can        |       8.99 |
    | TNT (5 sticks) |      10.00 |
    +----------------+------------+
    5 rows in set (0.00 sec)
    
    mysql>
    

    分析:从这个例子中可以看到,在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。

    价格在5美元和10美元之间的所有产品,价格由高到低排列。

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10 ORDER BY prod_price DESC;
    +----------------+------------+
    | prod_name      | prod_price |
    +----------------+------------+
    | Bird seed      |      10.00 |
    | TNT (5 sticks) |      10.00 |
    | 1 ton anvil    |       9.99 |
    | Oil can        |       8.99 |
    | .5 ton anvil   |       5.99 |
    +----------------+------------+
    5 rows in set (0.00 sec)
    
    mysql>
    

    2.4、空值检查

    在创建表时,表设计人员可以指定其中的列是否可以不包含值。在一个列不包含值时,称其为包含空值NULL。

    概念:NULL 无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。 null与0、 、 空格不同的

    SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。其语法如下:

    mysql> SELECT prod_name,prod_price FROM products WHERE prod_price IS NULL;
    Empty set (0.00 sec)
    
    mysql>
    

    这条语句返回没有价格(空prod_price字段,不是价格为0)的所有产品,由于表中没有这样的行,所以没有返回数据。但是,customers表确实包含有具有空值的列,如果在文件中没有某位顾客的电子邮件地址,则cust_email列将包含NULL值:

    mysql> select cust_id from customers where cust_email IS NULL;
    +---------+
    | cust_id |
    +---------+
    |   10002 |
    |   10005 |
    +---------+
    2 rows in set (0.00 sec)
    
    mysql> select cust_id from customers where cust_email is null;
    +---------+
    | cust_id |
    +---------+
    |   10002 |
    |   10005 |
    +---------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT cust_id FROM customers WHERE cust_email IS NULL;
    +---------+
    | cust_id |
    +---------+
    |   10002 |
    |   10005 |
    +---------+
    2 rows in set (0.00 sec)
    
    mysql>
    

    注意:NULL与不匹配

    在通过过滤选择出不具有特定值的行时,可能希望返回具有NULL值的行。在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行。

    SELECT * FROM customers WHERE cust_email IS NULL;

    在这里插入图片描述

    3、小结

    介绍了如何用SELECT语句的WHERE子句过滤返回的数据。学习了如何对相等、不相等、大于、小于、值的范围以及NULL值等进行测试,过滤数据。

    注意 WHERE子句的位置 :

    WHERE子句要写在表名(FROM子句)之后,在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。

    WHERE子句操作符

    操作符	  		  说明
    =			    等于
    <>				不等于
    !=				等于
    <				小于
    <=				小于等于
    >				大于
    >=				大于等于
    BETWEEN			在指定的两个值之间
    

    null值例子:select cust_id from customers where cust_email is null;

  • 相关阅读:
    web端常见兼容性问题整理
    浏览器初始化样式
    html5特效库
    csshack
    进程与线程,并发、并行、异步、多线程
    js复制粘贴事件
    dom range相关
    vue和react在使用上的对比
    ListView往TreView里面拖拽
    ListView添加项目带序列
  • 原文地址:https://www.cnblogs.com/liuawen/p/12854056.html
Copyright © 2011-2022 走看看