Chapter 5 ~ 6 (高级数据过滤 及 用通配符进行过滤)

依旧是SELECT语句的 WHERE 子句:

高级数据过滤:



组合WHERE子句:用来联结或改变WHERE子句中的子句的关键字, 也称为逻辑操作符

AND操作符:

mysql> SELECT prod_id, prod_price, prod_name
    -> FROM products
    -> WHERE vend_id = 'DLL01' AND prod_price <= 4;
+---------+------------+---------------------+
| prod_id | prod_price | prod_name           |
+---------+------------+---------------------+
| BNBG01  |       3.49 | Fish bean bag toy   |
| BNBG02  |       3.49 | Bird bean bag toy   |
| BNBG03  |       3.49 | Rabbit bean bag toy |
+---------+------------+---------------------+
3 rows in set (0.06 sec)

‍‍    此SQL语句检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。 

 这条SELECT语句中的WHERE子句包含两个条件,AND关键字联结在一起。 AND指示DBMS只返回满足所有给定条件的行。 如果某个产品由供应商DLL01制造, 但价格高于4美元, 则不检索它。 类似地, 如果产品价格小于4美元, 但不是由指定供应商制造的也不被检索。

进行排序的:

mysql> SELECT prod_id, prod_price, prod_name
    -> FROM products
    -> WHERE vend_id = 'DLL01' AND prod_price <= 4
    -> ORDER BY prod_name;
+---------+------------+---------------------+
| prod_id | prod_price | prod_name           |
+---------+------------+---------------------+
| BNBG02  |       3.49 | Bird bean bag toy   |
| BNBG01  |       3.49 | Fish bean bag toy   |
| BNBG03  |       3.49 | Rabbit bean bag toy |
+---------+------------+---------------------+
3 rows in set (0.10 sec)



OR操作符:

   OR操作符与AND操作符正好相反, 它指示DBMS检索匹配任一条件的行。 事实上, 许多DBMSOR WHERE子句的第一个条件得到满足的情况下, 就不再计算第二个条件了( 在第一个条件满足时, 不管第二个条件是否满足, 相应的行都将被检索出来)。当第一条件不满足时才执行第二条件 。

mysql> SELECT vend_id, prod_name, prod_price
    -> FROM products
    -> WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
+---------+---------------------+------------+
| vend_id | prod_name           | prod_price |
+---------+---------------------+------------+
| DLL01   | Fish bean bag toy   |       3.49 |
| DLL01   | Bird bean bag toy   |       3.49 |
| DLL01   | Rabbit bean bag toy |       3.49 |
| BRS01   | 8 inch teddy bear   |       5.99 |
| BRS01   | 12 inch teddy bear  |       8.99 |
| BRS01   | 18 inch teddy bear  |      11.99 |
| DLL01   | Raggedy Ann         |       4.99 |
+---------+---------------------+------------+
7 rows in set (0.00 sec)

OR:  WHERE子句中使用的关键字, 用来表示检索匹配任一给定条件的行。


求值顺序:

在SQL语言中也有优先级顺序,其中()优先级高于AND操作符,而AND操作符的优先级高于OR操作符的优先级(在WHERE子句中使用圆括号。任何时候使用具有AND和OR操作符的WHERE子句, 都应该使用圆括号明确地分组操作符。


IN操作符:

IN操作符用来指定条件范围, 范围中的每个条件都可以进行匹配。 IN取一组由逗号分隔、 括在圆括号中的合法值。 

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE vend_id IN ( 'DLL01', 'BRS01' )
    -> ORDER BY prod_name;
+---------------------+------------+
| prod_name           | prod_price |
+---------------------+------------+
| 12 inch teddy bear  |       8.99 |
| 18 inch teddy bear  |      11.99 |
| 8 inch teddy bear   |       5.99 |
| Bird bean bag toy   |       3.49 |
| Fish bean bag toy   |       3.49 |
| Rabbit bean bag toy |       3.49 |
| Raggedy Ann         |       4.99 |
+---------------------+------------+
7 rows in set (0.63 sec)

‍‍SELECT语句检索由供应商DLL01和BRS01制造的所有产品。 IN操作符后跟由逗号分隔的合法值, 这些值必须括在圆括号中。这里IN操作符完成了与OR相同的功能。

下面的代码等同于上面的代码:

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
    -> ORDER BY prod_name;
+---------------------+------------+
| prod_name           | prod_price |
+---------------------+------------+
| 12 inch teddy bear  |       8.99 |
| 18 inch teddy bear  |      11.99 |
| 8 inch teddy bear   |       5.99 |
| Bird bean bag toy   |       3.49 |
| Fish bean bag toy   |       3.49 |
| Rabbit bean bag toy |       3.49 |
| Raggedy Ann         |       4.99 |
+---------------------+------------+
7 rows in set (0.00 sec)


NOT操作符:

    WHERE子句中的NOT操作符有且只有一个功能, 那就是否定其后所跟的任何条件。 因为NOT从不单独使用( 它总是与其他操作符一起使用),所以它的语法与其他操作符有所不同。 NOT关键字可以用在要过滤的列前, 而不仅是在其后。‍‍

mysql> SELECT vend_id, prod_name
    -> FROM products
    -> WHERE NOT vend_id = 'DLL01'
    -> ORDER BY vend_id, prod_name;
+---------+--------------------+
| vend_id | prod_name          |
+---------+--------------------+
| BRS01   | 12 inch teddy bear |
| BRS01   | 18 inch teddy bear |
| BRS01   | 8 inch teddy bear  |
| FNG01   | King doll          |
| FNG01   | Queen doll         |
+---------+--------------------+
5 rows in set (0.00 sec)

‍‍‍‍‍‍‍    这里的NOT否定跟在其后的条件,因此,DBMS不是匹配vend_id为DLL01, 而是匹配非DLL01之外的所有东西。
‍‍‍‍‍‍

上述的例子也可以使用<>操作符来完成:

mysql> SELECT vend_id, prod_name
    -> FROM products
    -> WHERE vend_id <> 'DLL01'
    -> ORDER BY vend_id, prod_name;
+---------+--------------------+
| vend_id | prod_name          |
+---------+--------------------+
| BRS01   | 12 inch teddy bear |
| BRS01   | 18 inch teddy bear |
| BRS01   | 8 inch teddy bear  |
| FNG01   | King doll          |
| FNG01   | Queen doll         |
+---------+--------------------+
5 rows in set (0.00 sec)


上述总结:

    1)如何用AND 和 OR 操作符组合成WHERE子句

    2)如何管理求值顺序,如何使用 IN 和 NOT 操作符




用通配符进行过滤:

    LIKE操作符:使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤。

       通配符:用来匹配值的一部分的特殊字符。
  搜索模式:由字面值、 通配符或两者组合构成的搜索条件。


        通配符本身实际上是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示DBMS,后跟的搜索模式利用通配符匹配而不是简单的相等匹配进行比较。

  通配符搜索只能用于文本字段( 字符串),非文本数据类型字段不能使用通配符搜索。


    百分号(%)通配符:

        最常使用的通配符是百分号(%) 。 在搜索串中, 表示任何字符出现任意次数。

mysql> SELECT prod_id, prod_name
    -> FROM products
    -> WHERE prod_name LIKE 'Fish%';
+---------+-------------------+
| prod_id | prod_name         |
+---------+-------------------+
| BNBG01  | Fish bean bag toy |
+---------+-------------------+
1 row in set (0.04 sec)

    此例子使用了搜索模式 'Fish%'。 在执行这条子句时, 将检索任意以Fish起头的词。 %告诉DBMS接受Fish之后的任意字符, 不管它有多少字符。

mysql> SELECT prod_id, prod_name
    -> FROM products
    -> WHERE prod_name LIKE '%bean bag%';
+---------+---------------------+
| prod_id | prod_name           |
+---------+---------------------+
| BNBG01  | Fish bean bag toy   |
| BNBG02  | Bird bean bag toy   |
| BNBG03  | Rabbit bean bag toy |
+---------+---------------------+
3 rows in set (0.00 sec)

    通配符可在搜索模式中的任意位置使用, 并且可以使用多个通配符。 搜索模式'%bean bag%'表示匹配任何位置上包含文本bean bag的值, 不论它之前或之后出现什么字符。

    %通配符除了能匹配一个或多个字符外, %还能匹配0个字符。 %代表搜索模式中给定位置的0个、 1个或多个字符。这一点需要注意。


    请注意NULL: 通配符%看起来像是可以匹配任何东西, 但有个例外,这就是NULL。子句WHERE prod_name LIKE '%'不会匹配产品名称为NULL的行。如下所示:

mysql> SELECT cust_email, cust_name
    -> FROM customers;
+-----------------------+---------------+
| cust_email            | cust_name     |
+-----------------------+---------------+
| [email protected] | Village Toys  |
| NULL                  | Kids Place    |
| [email protected]    | Fun4All       |
| [email protected] | Fun4All       |
| NULL                  | The Toy Store |
+-----------------------+---------------+
5 rows in set (0.01 sec)

-- 上面显示所在列的所有行,下面使用通配符搜索,可以看到 % 并不能匹配名称为 NULL 的行

mysql> SELECT cust_email, cust_name
    -> FROM customers
    -> WHERE cust_email LIKE '%';
+-----------------------+--------------+
| cust_email            | cust_name    |
+-----------------------+--------------+
| [email protected] | Village Toys |
| [email protected]    | Fun4All      |
| [email protected] | Fun4All      |
+-----------------------+--------------+
3 rows in set (0.00 sec)



下划线(_)通配符:

另一个有用的通配符是下划线( _) 。 下划线的用途与%一样, 但它只匹配单个字符, 而不是多个字符。

mysql> SELECT prod_id, prod_name
    -> FROM products
    -> WHERE prod_name LIKE '__ inch teddy bear';
+---------+--------------------+
| prod_id | prod_name          |
+---------+--------------------+
| BR02    | 12 inch teddy bear |
| BR03    | 18 inch teddy bear |
+---------+--------------------+
2 rows in set (0.01 sec)


mysql> SELECT prod_id, prod_name
    -> FROM products
    -> WHERE prod_name LIKE '% inch teddy bear';
+---------+--------------------+
| prod_id | prod_name          |
+---------+--------------------+
| BR01    | 8 inch teddy bear  |
| BR02    | 12 inch teddy bear |
| BR03    | 18 inch teddy bear |
+---------+--------------------+
3 rows in set (0.00 sec)

上面可以看出,两个下划线只能匹配两个字符,而且还必须是两个字符,与 (%) 能匹配0个字符不同,( _ ) 总是刚好匹配一个字符, 不能多也不能少。




SQL的通配符很有用。但这种功能是有代价的,即通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。 这里给出一些使用通配符时要记住的技巧。
   1)不要过度使用通配符。 如果其他操作符能达到相同的目的, 应该使用其他操作符。
   2)在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处, 搜索起来是最慢的。
   3)仔细注意通配符的位置。 如果放错地方, 可能不会返回想要的数据。


上述总结:

    1)介绍了什么是通配符并且介绍如何在WHERE 子句中使用SQL 通配符




你可能感兴趣的:(Chapter 5 ~ 6 (高级数据过滤 及 用通配符进行过滤))