文章目录
- 1.使用WHERE子句
- 2.WHERE子句操作符
- 2.1 使用单个值
- 2.2 不匹配检查
- 2.3 范围值查询
- 2.4 空值检查
- 3.组合WHERE子句
- 3.1 AND操作符
- 3.2 OR操作符
- 3.3 计算次序
- 4.IN操作符
- 5.NOt关键字
- 5.注意事项
- 5.1 NULL与不匹配
- 5.2 SQL过滤与应用过滤
- 5.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操作符的优点如下:
- 在使用较长的条件时,IN操作符的语法更加清晰直观;
- 在使用IN操作符时,计算的次序更容易管理;
- IN操作符一般比OR操作符执行更快;
- 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 进行排序,这样需要排序的数据更少,性能更好;