WHERE子句用于筛选符合条件的数据,支持比较、逻辑运算符及BETWEEN、IN、LIKE、IS NULL等操作,需注意索引使用、避免函数干扰和前导通配符,常与JOIN、GROUP BY、HAVING等结合,执行顺序为WHERE→GROUP BY→HAVING→ORDER BY→LIMIT。

MySQL里的
WHERE
当我们谈论MySQL的条件查询,
WHERE
SELECT
UPDATE
DELETE
FROM
比如,你想从一个名为
products
SELECT product_name, price FROM products WHERE price < 100;
这里,
price < 100
WHERE
=
!=
<>
>
<
>=
<=
你也可以用逻辑运算符来组合多个条件,让你的筛选逻辑更复杂、更精细:
AND
OR
NOT
例如,找出价格在50到100之间(含50和100)且库存量大于10的产品:
SELECT product_name, price, stock_quantity FROM products WHERE price >= 50 AND price <= 100 AND stock_quantity > 10;
这里,
AND
()
SELECT product_name, category, price FROM products WHERE (category = 'Electronics' OR category = 'Appliances') AND price > 500;
这会先找出属于“Electronics”或“Appliances”类别的产品,然后再从这些产品中筛选出价格高于500的。
在实际工作中,数据往往不是那么规整,我们的筛选需求也远不止简单的等于或大于。这时候,
WHERE
范围查询:BETWEEN ... AND ...
BETWEEN
>=
<=
SELECT order_id, order_date FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
我觉得这比写
order_date >= '2023-01-01' AND order_date <= '2023-12-31'
集合查询:IN (...)
NOT IN (...)
IN
SELECT customer_name, city
FROM customers
WHERE city IN ('New York', 'Los Angeles', 'Chicago');这比写一堆
OR
city = 'New York' OR city = 'Los Angeles' OR city = 'Chicago'
NOT IN
模式匹配:LIKE
LIKE
%
_
比如,查找所有产品名称以“Smart”开头的产品:
SELECT product_name FROM products WHERE product_name LIKE 'Smart%';
而如果你想找产品名称中包含“Pro”的产品,不管它在哪里:
SELECT product_name FROM products WHERE product_name LIKE '%Pro%';
这种模糊匹配在搜索功能里非常常见。
空值处理:IS NULL
IS NOT NULL
NULL
''
0
=
NULL
IS NULL
IS NOT NULL
查找所有没有电子邮件地址的客户:
SELECT customer_name FROM customers WHERE email IS NULL;
理解
NULL
这些操作符的组合使用,加上括号的优先级控制,让
WHERE
在我看来,
WHERE
常见的性能陷阱:
未创建索引或索引使用不当: 这是最常见也最致命的问题。如果你在
WHERE
-- 假设 birth_date 是索引列 -- 这样写会使索引失效,因为 MySQL 需要对每一行计算 YEAR() SELECT name FROM users WHERE YEAR(birth_date) = 1990; -- 优化方式:转换为范围查询 SELECT name FROM users WHERE birth_date BETWEEN '1990-01-01' AND '1990-12-31';
LIKE '%pattern'
LIKE
%
-- 无法有效利用索引 SELECT product_name FROM products WHERE product_name LIKE '%鼠标%';
如果业务允许,尽量使用
LIKE 'pattern%'
OR
OR
OR
AND
数据类型不匹配: 如果你在
WHERE
优化策略:
为WHERE
EXPLAIN
-- 为 product_id 和 category 创建索引 ALTER TABLE products ADD INDEX idx_product_id (product_id); ALTER TABLE products ADD INDEX idx_category (category);
避免在索引列上使用函数: 如前所述,这会阻止索引的使用。尝试将函数操作移到查询结果集上,或者将条件转换为索引友好的形式。
优化LIKE
简化OR
UNION ALL
OR
SELECT
UNION ALL
*选择性地使用`SELECT
:** 尽量只选择你需要的列,而不是
定期分析和优化表: 使用
ANALYZE TABLE
合理使用子查询和JOIN: 某些情况下,将复杂的
WHERE
JOIN
在我看来,性能优化是一个持续的过程,没有一劳永逸的方案。理解MySQL的工作原理,善用
EXPLAIN
WHERE
JOIN
GROUP BY
HAVING
ORDER BY
LIMIT
与JOIN
WHERE
SELECT o.order_id, o.order_date, c.customer_name FROM orders o JOIN customers c ON o.customer_id = c.customer_id WHERE c.customer_name = 'Alice Johnson';
这里,
JOIN
orders
customers
WHERE
customer_name
一个常见的误区是在
LEFT JOIN
ON
WHERE
LEFT JOIN
WHERE
NULL
LEFT JOIN
INNER JOIN
LEFT JOIN
NULL
-- 这是一个 LEFT JOIN,即使 products 表没有匹配的订单,也会显示所有产品 SELECT p.product_name, o.order_id FROM products p LEFT JOIN order_items oi ON p.product_id = oi.product_id LEFT JOIN orders o ON oi.order_id = o.order_id; -- 如果在 WHERE 中加入右表条件,会过滤掉左表没有匹配的行 -- 效果可能类似于 INNER JOIN SELECT p.product_name, o.order_id FROM products p LEFT JOIN order_items oi ON p.product_id = oi.product_id LEFT JOIN orders o ON oi.order_id = o.order_id WHERE o.order_date > '2023-01-01'; -- 如果 o.order_date 为 NULL,这一行会被过滤掉
所以,在使用
LEFT JOIN
ON
与GROUP BY
HAVING
WHERE
HAVING
WHERE
GROUP BY
HAVING
GROUP BY
COUNT()
SUM()
AVG()
例如,你想找出每个类别中订单数量超过100的那些类别:
-- 找出总订单金额大于1000的客户 SELECT customer_id, SUM(total_amount) AS total_spent FROM orders GROUP BY customer_id HAVING SUM(total_amount) > 1000;
如果你想先筛选出2023年的订单,然后再按客户分组并找出总金额超过500的客户,你会这样写:
SELECT customer_id, SUM(total_amount) AS total_spent FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31' -- 先过滤2023年的订单 GROUP BY customer_id HAVING SUM(total_amount) > 500; -- 再过滤聚合后的结果
这里的执行顺序是:
FROM
JOIN
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT
WHERE
GROUP BY
与ORDER BY
LIMIT
WHERE
ORDER BY
LIMIT
SELECT product_name, price FROM products WHERE category = 'Electronics' ORDER BY price DESC LIMIT 5;
这个查询会先从
products
category
price
这些语句的组合使用,赋予了我们从数据库中提取复杂信息的强大能力。关键在于理解它们各自的作用和执行顺序,这样才能构建出既准确又高效的SQL查询。
以上就是WHERE如何查询MySQL_MySQL条件查询与WHERE子句使用教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号