使用WHERE子句对表中的数据进行筛选,满足条件的记录行会出现在结果集中(对记录进行筛选,符合条件的记录才能被查询出来)
语法格式
SELECT * FROM 表名 WHERE 条件;
WHERE子句在表名(FROM子句)之后给出
WHERE后面支持多种条件表达:
1.比较运算
2.模糊查询
3.范围查询
4.空判断
5.逻辑运算
1.比较运算
比较运算符 | 说明 |
= | 等于 |
!= 或 <> | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
数据导入
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
`id` int(11) NOT NULL,
`prod_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`prod_price` decimal(10, 2) DEFAULT NULL,
`vend_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `products` VALUES (1, 'Book', 9.00, 1001);
INSERT INTO `products` VALUES (2, 'Fruit', 12.00, 1002);
INSERT INTO `products` VALUES (3, 'TV', 15.00, 1003);
INSERT INTO `products` VALUES (4, 'Computer', 20.00, 1003);
INSERT INTO `products` VALUES (5, 'Pen', 5.00, 1001);
products表
id:产品id prod_name:产品名称 prod_price:产品价格 vend_id:供应商id
问题1:检索价格小于10美元的所有产品
SELECT prod_name, prod_price
FROM products
WHERE prod_price < 10;
结果展示:
问题2:检索价格大于等于10美元的所有产品
SELECT prod_name, prod_price
FROM products
WHERE prod_price >= 10;
结果展示:
问题3:检索出不是由供应商1003制造的所有产品
-- 解法1
SELECT vend_id, prod_name
FROM products
WHERE vend_id <> 1003;
-- 解法2
SELECT vend_id, prod_name
FROM products
WHERE vend_id != 1003;
结果展示:
问题4:检索出产品名称为'Fruit'的所有信息
SELECT *
FROM products
WHERE prod_name = 'Fruit';
结果展示:
2.模糊查询
3.范围查询
IN | NOT IN 表示在一个非连续的范围内进行查询
BETWEEN...AND...表示在一个连续的范围内进行查询
4.空判断
5.逻辑运算
逻辑操作符 | 说明 |
AND | 检索满足所有给定条件的行 |
OR | 检索匹配任一给定条件的行 |
NOT | 检索否定后跟条件的行 |
数据导入
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
`id` int(11) NOT NULL,
`prod_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`prod_price` decimal(10, 2) DEFAULT NULL,
`vend_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `products` VALUES (1, 'Book', 9.00, 1001);
INSERT INTO `products` VALUES (2, 'Fruit', 12.00, 1002);
INSERT INTO `products` VALUES (3, 'TV', 15.00, 1003);
INSERT INTO `products` VALUES (4, 'Computer', 20.00, 1003);
INSERT INTO `products` VALUES (5, 'Pen', 5.00, 1001);
products表
id:产品id prod_name:产品名称 prod_price:产品价格 vend_id:供应商id
问题1:检索出由供应商1003制造的产品且该产品价格低于18美金(输出结果顺序:id,prod_name,prod_name)
SELECT id,prod_price,prod_name
FROM products
WHERE vend_id = 1003 AND prod_price < 18;
结果展示:
问题2:检索出由供应商1002或者1003制造的产品(输出结果顺序:prod_name,prod_price)
SELECT prod_name,prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;
结果展示:
问题3:检索出不是由供应商1001制造的所有产品
SELECT *
FROM products
WHERE NOT vend_id = 1001;
结果展示:
计算次序(优先级)
WHERE可包含任意数目的AND和OR操作符,允许两者结合以进行复杂和高级的过滤
SELECT prod_name,prod_price, vend_id FROM products
WHERE vend_id = 1001 OR vend_id = 1003 AND prod_price = 9;
结果展示:
SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符
问题4:检索出由供应商1002或者1003制造出的产品,且该产品的价格为9美元
解决方法:使用圆括号明确地分组相应的操作符
SELECT prod_name,prod_price, vend_id FROM products
WHERE (vend_id = 1001 OR vend_id = 1003) AND prod_price = 9;
结果展示:
圆括号具有较AND或OR操作符高的计算次序
如果不加括号,条件运算按照NOT、AND、OR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级
在WHERE子句中使用圆括号
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义
要组合三个或者更多的条件,就需要用小括号()表示如何进行条件运算