过滤数据

2021-12-23 MySQL SQL 必知必会

本文讲解如何使用 SELECT 语句的 WHERE 子句指定搜索条件。

# 一、使用 WHERE 子句

SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
1
2
3

# 二、WHERE 子句操作符

# 2.1 检查单个值

SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
1
2
3

# 2.2 不匹配检查

SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
1
2
3

# 2.3 范围值检查

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
1
2
3

在使用 BETWEEN 时,必须指定两个值:所需范围的低端值和高端值。这两个值必须用 AND 关键字分隔。

BETWEEN 匹配范围中所有的值,包括指定的开始值和结束值。

# 2.4 空值检查

SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
1
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

解答

SELECT prod_id, prod_name
FROM Products
WHERE prod_price = 9.49;
1
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

解答

SELECT prod_id, prod_name
FROM Products
WHERE prod_price >= 9;
1
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

解答

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 3 AND 6
ORDER BY prod_price;
1
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

解答

SELECT DISTINCT order_num
FROM OrderItems
WHERE quantity >= 100;
1
2
3

# 五、参考资料

Last Updated: 2023-01-28 4:31:25