过滤数据
睡不醒的鲤鱼 2021-12-23 MySQL SQL 必知必会
本文讲解如何使用 SELECT 语句的 WHERE 子句指定搜索条件。
# 一、使用 WHERE 子句
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
1
2
3
2
3
# 二、WHERE 子句操作符
# 2.1 检查单个值
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
1
2
3
2
3
# 2.2 不匹配检查
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
1
2
3
2
3
# 2.3 范围值检查
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
1
2
3
2
3
在使用 BETWEEN 时,必须指定两个值:所需范围的低端值和高端值。这两个值必须用 AND 关键字分隔。
BETWEEN 匹配范围中所有的值,包括指定的开始值和结束值。
# 2.4 空值检查
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
1
2
3
2
3
这条语句返回所有没有价格(空 prod_price 字段,不是价格为 0)的产品。
注意
通过过滤选择不包含指定值的所有行时,你可能希望返回含 NULL 值的行。但是这做不到。因为 NULL 比较特殊,所以在进行匹配过滤或非匹配过滤时,不会返回这些结果。
# 三、小结
本文讲解了如何用 SELECT 语句的 WHERE 子句过滤返回的数据。包括如何检验相等、不相等、大于、小于、值的范围以及 NULL 值等。
# 四、挑战题
# 4.1 返回固定价格的产品
描述
有 Products 表
prod_id | prod_name | prod_price |
---|---|---|
a0018 | sockets | 9.49 |
a0019 | iphone13 | 600 |
b0018 | gucci t-shirts | 1000 |
问题
从 Products 表中检索产品 ID(prod_id)和产品名称(prod_name),只返回价格为 9.49 美元的产品。
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称',
`prod_price` DOUBLE NOT NULL COMMENT '产品价格'
);
INSERT INTO `Products` VALUES ('a0018','sockets',9.49),
('a0019','iphone13',600),
('b0019','gucci t-shirts',1000);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
解答
SELECT prod_id, prod_name
FROM Products
WHERE prod_price = 9.49;
1
2
3
2
3
# 4.2 返回更高价格的产品
描述
有 Products 表
prod_id | prod_name | prod_price |
---|---|---|
a0018 | sockets | 9.49 |
a0019 | iphone13 | 600 |
b0018 | gucci t-shirts | 1000 |
问题
编写 SQL 语句,从 Products 表中检索产品 ID(prod_id)和产品名称(prod_name),只返回价格为 9 美元或更高的产品。
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称',
`prod_price` DOUBLE NOT NULL COMMENT '产品价格'
);
INSERT INTO `Products` VALUES ('a0011','usb',9.49),
('a0019','iphone13',600),
('b0019','gucci t-shirts',1000);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
解答
SELECT prod_id, prod_name
FROM Products
WHERE prod_price >= 9;
1
2
3
2
3
# 4.3 返回产品并且按照价格排序
描述
有 Products 表
prod_id | prod_name | prod_price |
---|---|---|
a0011 | egg | 3 |
a0019 | sockets | 4 |
b0019 | coffee | 15 |
问题
编写 SQL 语句,返回 Products 表中所有价格在 3 美元到 6 美元之间的产品的名称(prod_name)和价格(prod_price),然后按价格对结果进行排序。
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称',
`prod_price` DOUBLE NOT NULL COMMENT '产品价格'
);
INSERT INTO `Products` VALUES ('a0011','egg',3),
('a0019','sockets',4),
('b0019','coffee',15);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
解答
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 3 AND 6
ORDER BY prod_price;
1
2
3
4
2
3
4
# 4.4 返回更多的产品
描述
OrderItems 表含有:订单号 order_num,quantity 产品数量
order_num | quantity |
---|---|
a1 | 105 |
a2 | 1100 |
a2 | 200 |
a4 | 1121 |
a5 | 10 |
a2 | 19 |
a7 | 5 |
问题
从 OrderItems 表中检索出所有不同且不重复的订单号(order_num),其中每个订单都要包含 100 个或更多的产品。
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品订单号',
quantity VARCHAR(255) NOT NULL COMMENT '商品数量'
);
INSERT `OrderItems` VALUES ('a1','105'),('a2','1100'),('a2','200'),('a4','1121'),('a5','10'),('a2','19'),('a7','5');
1
2
3
4
5
6
2
3
4
5
6
解答
SELECT DISTINCT order_num
FROM OrderItems
WHERE quantity >= 100;
1
2
3
2
3