4.3 where关键字过滤查询数据



1.使用WHERE子句

数据库表一般包含大量数据,我们很少需要查询表中的全部数据,通常只会根据特定操作或报告的需要提取表数据的子集。只查找所需数据需要指定搜索条件,搜索条件也称为过滤条件;

在 SELECT 语句中,数据根据 WHERE 子句中指定的搜索条件进行过滤, WHERE 子句在表名之后(FROM子句) 之后给出,如下所示:

SELECT prod_price,prod_name
FROM products
WHERE prod_price = 3.42;

其查询结果如下:
在这里插入图片描述

这个例子使用了简单的相等测试,它检查一个列是否具有指定的值,根据此值进行过滤,但 WHERE 子句还有很多其他功能可以实现;

2.WHERE子句操作符

MySql 支持以下所有的条件操作符:

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

2.1 使用单个值

我们再来看一个测试相等的例子:

SELECT prod_price,prod_name
FROM products
WHERE prod_name = 'fuses';

输出:

在这里插入图片描述

其返回prod_name的值为 Fuses 的一行,MySql 在执行匹配时默认不区分大小写,所以 Fuses 与 fuses 没有区别;

接下来再来看一个使用其他操作符的例子:

SELECT prod_price,prod_name
FROM products
WHERE prod_price < 10;

输出:

在这里插入图片描述

其查询价格小于10的全部所有产品;

下一条语句查询价格小于等于10 的所有产品:

SELECT prod_price,prod_name
FROM products
WHERE prod_price <= 10;

输出:

在这里插入图片描述

2.2 不匹配检查

下面的例子查询不是由供货商1003 制造的所有产品:

SELECT vend_id,prod_name
FROM products
WHERE vend_id <> 1003;

输出:

在这里插入图片描述

其查询结果与下方的SQL语句一致:

SELECT vend_id,prod_name
FROM products
WHERE vend_id != 1003;

输出:

在这里插入图片描述

2.3 范围值查询

为了检查某个范围的值,可以使用 BETWEEN 操作符;其语法与其他 WHERE 子句的操作符不同,它需要俩个值,即范围的开始值与结束值;如:

SELECT prod_price,prod_name
FROM products
WHERE prod_price BETWEEN 5 AND 10;

输出:

在这里插入图片描述

其用来查询价格在 5-10 之间的所有产品,这俩个值用 AND 关键字分隔,BETWEEN 匹配范围中所有的值,包括指定的开始值和结束值;

2.4 空值检查

在创建表时,初始设计可以指定某些列是否可以为 NULL,这个 WHERE 子句就是 IS NULL 子句,如:

SELECT cust_id
FROM customers
WHERE cust_email IS NULL;

输出:
在这里插入图片描述

这条语句查询没有电子邮件地址的所有人员ID,同时,也可以查询不为空的列,如:

SELECT cust_id
FROM customers
WHERE cust_email IS NOT NULL;

输出:
在这里插入图片描述

这条语句查询有电子邮件地址的所有人员ID;

3.组合WHERE子句

MySql允许给出多个WHERE子句,这些子句以俩种方式进行使用:以AND子句或OR子句方式进行连接使用;

3.1 AND操作符

为了使用多个列的条件进行过滤,可以使用AND操作符给WHERE子句附加条件,如:

SELECT prod_id, prod_price,prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <= 10;

输出:
在这里插入图片描述

这条SQl语句查询所有供应商1003制造并且价格小于等于 10 的产品名称,产品ID和产品价格;

AND关键字表明返回同时满足所有给定条件的行;还可以继续增加过滤条件,每增加一个过滤条件,就要使用一个AND关键字;

3.2 OR操作符

OR操作符与AND操作符不同,其表示查询时匹配任一条件的行;如:

SELECT prod_price,prod_name
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;

输出:

在这里插入图片描述

其表示查询由供应商1002 或 供应商1003 ,同时返回他们俩家供应商的全部产品名称和价格,如果这里使用 AND 关键字,则不反回任何数据,因为表中没有既是供应商1002制造,又是供应商1003制造的商品;

3.3 计算次序

WHERE 子句可以包含任意数量的AND 和 OR 操作符,允许俩者同时使用,以便完成更加复杂的过滤条件,但这也带来一个问题,假如需要查询价格大于等于10 且供应商为1002或1003的全部产品,其SQL语句如下:

SELECT prod_price,prod_name
FROM products
WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;

输出:
在这里插入图片描述

返回结果中有俩个价格小于10 的产品,很显然返回的结果不满足预期,原因就在于计算的次序,SQL 在处理条件过滤时,优先处理AND关键字,然后才处理 OR 关键字,上面的语句会被认为是要查询供应商为1003并且价格大于10 或供应商为1002 的商品,在供应商1002的商品中,并没有了限定价格的条件,遇到类似这样的问题,我们可以使用小括号来限定我们的条件组合,如:

SELECT prod_price,prod_name
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

输出:

在这里插入图片描述

这样,就会优先查找供应商为1002和1003的产品,在从产品中过滤出价格大于等于10 的产品来进行展示;

4.IN操作符

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配,将范围的值全部放到小括号中,由逗号进行分隔,如:

SELECT prod_price,prod_name
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;

输出:
在这里插入图片描述

这条SQL语句查询供应商1002与1003制造的所有产品,并通过产品名称进行排序,IN关键字后的括号中包含所有条件的合法清单,其用逗号分隔,这里要注意的是全部的合法清单,如果括号中是(1002,1007),其并不会查询1003,1004…1006这几个值,因为其不在括号中;

IN操作符的优点如下:

  1. 在使用较长的条件时,IN操作符的语法更加清晰直观;
  2. 在使用IN操作符时,计算的次序更容易管理;
  3. IN操作符一般比OR操作符执行更快;
  4. IN操作符最大的优势在于可以包含其他SELECT语句,可以实现子查询(后续将介绍子查询);

5.NOt关键字

NOt 关键字有且只有一个功能,除了 IS NOT NUll 我们在前边介绍过外,其他所有的格式都一致,其作用就是否定它之后所跟的任何条件,如:

SELECT prod_price,prod_name
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;

输出:
在这里插入图片描述

其查询结果不是查询匹配供应商为1002和1003的,而是匹配除他们俩家供应商外其他所有供应商的;

5.注意事项

5.1 NULL与不匹配

要注意,在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL值的行,但这是不行的,因为未知具有特殊的含义,数据库不知道他们是否匹配,所以在匹配查询或者不匹配查询时不返回它们;

所以在查询数据时,一定要验证返回数据中确实给出了被过滤列具有 NULL 的行;

5.2 SQL过滤与应用过滤

数据也可以在应用层进行过滤,在应用层进行过滤,SQl会提供超过实际所需的数据,然后应用再对返回的全部数据进行循环过滤,提取出需要的数据;

通常,这样的做法很不适合商业化的开发,一般商业化开发中,表中会存在大量数据,大量数据在客户——应用——数据库中进行交互,十分占用网络通信,并且在应用层处理大量的数据也十分影响系统性能;

所以要尽可能的在SQl中过滤掉不需要的数据,将数据之间的传递尽可能的使其内容瘦身;

5.3 WHERE子句的位置

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

其实在这里可以通过书写顺序进行理解,我们要先将数据通过 WHERE 进行过滤,然后再通过 ORDER BY 进行排序,这样需要排序的数据更少,性能更好;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值