SQL回炉重造03_数据过滤_WHERE/NOT/IN

数据过滤

1. WHERE子句

1.1 WHERE子句基础语法

  • 数据库表中一般会包括大量数据,我们很少会检索表中所有的行。通常只需要根据特定条件提取需要的行即可。只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)

  • 语法

SELECT colName
FROM tableName
WHERE filterCondition;

# 例
SELECT prod_name,prod_price
FROM products
WHERE prod_price = 2.50;
  • WHERE子句的位置:应位于ORDER BY子句之前

1.2 WHERE子句操作符

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

1.2.1 单个值/不匹配检查

# 单个值检查
SELECT prod_name,prod_price
FROM products
WHERE prod_name = 'fuses';

# 不匹配检查
SELECT vend_id,prod_name
FROM products
WHERE vend_id <> 1003; # <>与!=是等效的
  • 使用单引号:在将值与字符串比较时,需要将字符串用单引号来限制

1.2.2 范围值检查

  • BETWEEN操作符:使用时需要指定最大和最小两个值,且需要使用AND关键字分隔。BETWEEN会匹配范围内所有值,包括指定的最大和最小值。
# 范围值检查
SELECT prod_name,prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;

1.2.3 空值检查

  • NULL:无值(no value),与字段0、空字符串、空格不同。

  • IS NULL子句:检查具有NULL值的列

  • 不匹配检查与NULL值:在进行匹配过滤或不匹配过滤时,数据库不会返回具有NULL值的行。因此在过滤数据时要验证返回数据中是否给出了被过滤列具有NULL的行。

SELECT cust_id
FROM customers
WHERE cust_email IS NULL;

2. 高级搜索——NOT 和 IN操作符

2.1 连结WHERE子句

  • 为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以通过两种方式使用:以AND子句或OR子句方式
  • 操作符(operator):用来连结或改变WHERE子句中的关键字,也称逻辑操作符(logical operator)

2.1.1 AND 操作符

  • AND :用在WHERE子句中的关键字,用于添加检索条件,并指示返回满足所有给定条件的行
SELECT prod_id, prod_price, prod_name 
FROM products
WHERE vend_id = 1003 AND prod_price <> 10;

2.1.2 OR操作符

  • OR : 用在WHERE子句中的关键字,用于添加检索条件,表示检索满足任一给定条件的行
SELECT prod_id, prod_price
FROM products
WHERE vend_id = 1003 OR vend_id = 1002;

2.1.3 操作次序

  • AND 与 OR的操作次序:像大多数语言一样,SQL会优先处理AND操作。因此,在使用复杂筛选条件的时候,应该尽可能使用圆括号()来分组操作符
# 列出价格为10美元(含)以上且由1002或1003制造的所有产品
SELECT prod_name, prod_price
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

2.2 IN操作符

  • IN:WHERE子句中用来指定要匹配值清单的关键字,功能与OR相当
    • IN操作符用来指定条件范围,范围中每一个条件都可以进行匹配
    • 使用圆括号来创建清单,并将每个匹配值用逗号分隔开
    • IN操作符的优点
      • 在使用长的合法选项清单时,IN操作符语法清楚且直观
      • 使用IN时,计算次序更容易管理(使用操作符次数减少)
      • IN操作符一般比OR执行更快
      • IN可以包含其他SELECT语句,可以更动态地建立WHERE子句。
SELECT  prod_name, prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name DESC;

2.3 NOT操作符

  • NOT: WHERE子句中用来否定跟在其后面条件的关键字
    • 在复杂的子句中,NOT是十分高效的,如在与IN结合使用时,找出与条件列表不匹配的行非常简单
    • MySQL中的NOTMySQL支持对IN、BEWTEEN、EXISTS子句取反
SELECT prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name DESC;
上一篇:[cf917D]Stranger Trees


下一篇:Educoder MySQL数据库 - 数据库和表的基本操作(一)