高级数据过滤

操作符(operator)

用来改变WHERE子句中的子句关键字,也成逻辑操作符。

  • AND操作符
    通过使用AND来给WHERE子句附加条件。

索引出供应商'DLL01'制造且价格小于等于4美金的所有产品名称和价格。

  1. mysql> SELECT prod_id, prod_price, prod_name
  2. -> FROM Products
  3. -> WHERE vend_id = 'DLL01' AND prod_price <= 4;
  4. +---------+------------+---------------------+
  5. | prod_id | prod_price | prod_name |
  6. +---------+------------+---------------------+
  7. | BNBG01 | 3.49 | Fish bean bag toy |
  8. | BNBG02 | 3.49 | Bird bean bag toy |
  9. | BNBG03 | 3.49 | Rabbit bean bag toy |
  10. +---------+------------+---------------------+
  11. 3 rows in set (0.02 sec)

解释: SLELECT 语句中的子句WHERE包含两个条件,供应商指定DLL01,价格高于4美金,不显示,如果价格小于 4美金,都不术语DELL01的,也不显示。

OR操作符

检索匹配任意条件。

  1. mysql> SELECT prod_name, prod_price
  2. -> FROM Products
  3. -> WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
  4. +---------------------+------------+
  5. | prod_name | prod_price |
  6. +---------------------+------------+
  7. | Fish bean bag toy | 3.49 |
  8. | Bird bean bag toy | 3.49 |
  9. | Rabbit bean bag toy | 3.49 |
  10. | 8 inch teddy bear | 5.99 |
  11. | 12 inch teddy bear | 8.99 |
  12. | 18 inch teddy bear | 11.99 |
  13. | Raggedy Ann | 4.99 |
  14. +---------------------+------------+
  15. 7 rows in set (0.01 sec)

解释: 索引供应商所有产品的产品名和价格,并匹配任意条件 DLL01或者BRS01.

计算次序

WHERE 运行AND 与 RO 结合,进行复杂操作,和高级过滤。

检索10美金以上,并且由DLL10或者BRSO1制造。

  1. mysql> SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10;
  2. +---------------------+------------+
  3. | prod_name | prod_price |
  4. +---------------------+------------+
  5. | Fish bean bag toy | 3.49 |
  6. | Bird bean bag toy | 3.49 |
  7. | Rabbit bean bag toy | 3.49 |
  8. | 18 inch teddy bear | 11.99 |
  9. | Raggedy Ann | 4.99 |
  10. +---------------------+------------+
  11. 5 rows in set (0.00 sec)

返回的价格带有10美金一下的,原因是AND有优先级,SQL在处理 OR前,先处理了AND,直接检索BRS01,或者DLL01,而忽略了价格。

解决的方法是用 园括号进行分组操作。

  1. mysql> SELECT prod_name, prod_price
  2. -> FROM Products
  3. -> WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
  4. -> AND prod_price >= 10;
  5. +--------------------+------------+
  6. | prod_name | prod_price |
  7. +--------------------+------------+
  8. | 18 inch teddy bear | 11.99 |
  9. +--------------------+------------+
  10. 1 row in set (0.01 sec)

()圆括号具有比AND,RO更高的操作计算顺序。

注意: 使用AND 和OR操作WHERE句子,都应该用圆括号明确分组操作。

IN 操作符

IN操作符用来指定范围,范围中的每一条,都进行匹配。IN取值规律,由逗号分割,全部放置括号中。

  1. mysql> SELECT prod_name, prod_price
  2. -> FROM Products
  3. -> WHERE vend_id IN ('DLL01', 'BRS01')
  4. -> ORDER BY prod_name;
  5. +---------------------+------------+
  6. | prod_name | prod_price |
  7. +---------------------+------------+
  8. | 12 inch teddy bear | 8.99 |
  9. | 18 inch teddy bear | 11.99 |
  10. | 8 inch teddy bear | 5.99 |
  11. | Bird bean bag toy | 3.49 |
  12. | Fish bean bag toy | 3.49 |
  13. | Rabbit bean bag toy | 3.49 |
  14. | Raggedy Ann | 4.99 |
  15. +---------------------+------------+
  16. 7 rows in set (0.01 sec)

解释: 用SELECT检索,DLL01和BRS01制造的所有产品,IN操作符后跟由逗号分割的合法值清单。

IN 相当与完成了OR相同的功能,下面的结果与上面输出结果一样

  1. mysql> SELECT prod_name, prod_price
  2. -> FROM Products
  3. -> WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
  4. -> ORDER BY prod_name;
  5. +---------------------+------------+
  6. | prod_name | prod_price |
  7. +---------------------+------------+
  8. | 12 inch teddy bear | 8.99 |
  9. | 18 inch teddy bear | 11.99 |
  10. | 8 inch teddy bear | 5.99 |
  11. | Bird bean bag toy | 3.49 |
  12. | Fish bean bag toy | 3.49 |
  13. | Rabbit bean bag toy | 3.49 |
  14. | Raggedy Ann | 4.99 |
  15. +---------------------+------------+
  16. 7 rows in set (0.00 sec)
  • 使用IN的优点:
    • 语法清晰,特别是语法较长时
    • 操作符少,计算次序容易管理
    • IN比OR执行速度快
    • 最大的优点,可以包含其他SELECT语句,能够更加动态的建立WHERE子句。

      NOT操作符

NOT操作符总是与其他操作符一起使用,用在要过滤的前面。

  1. mysql> SELECT vend_id, prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name;
  2. +---------+--------------------+
  3. | vend_id | prod_name |
  4. +---------+--------------------+
  5. | BRS01 | 12 inch teddy bear |
  6. | BRS01 | 18 inch teddy bear |
  7. | BRS01 | 8 inch teddy bear |
  8. | FNG01 | King doll |
  9. | FNG01 | Queen doll |
  10. +---------+--------------------+
  11. 5 rows in set (0.00 sec)

列出不带有DLL01之外的所有产品。

原文: https://cxiaodian.gitbooks.io/mysql/content/chapter4.html