基础模式:单条件与多条件查询
含条件查询语句的基础模式包括:
- 单条件查询:仅使用一个条件表达式
- 多条件查询:组合多个条件,需注意逻辑运算符优先级
-- 单条件:查询特定状态订单
SELECT FROM orders WHERE status = 'completed';
-- 多条件:查询已支付且金额>500的订单
SELECT FROM orders
WHERE status = 'paid' AND amount > 500;
模糊查询模式
模糊查询是SQL包含条件-含条件查询语句的高频场景,需根据场景选择最优模式:
前缀匹配
LIKE 'abc%'
✅ 可使用索引(B-Tree)
适用:用户名、产品编码
后缀匹配
LIKE '%abc'
❌ 索引失效(需全表扫描)
替代方案:FULLTEXT索引或反向存储字段
包含匹配
LIKE '%abc%'
❌ 索引失效
替代方案:全文检索引擎(Elasticsearch)
范围查询模式
范围查询是时间序列数据的核心场景,正确使用可显著提升性能:
-- ❌ 错误:函数包裹列(索引失效)
WHERE YEAR(order_date) = 2023 AND MONTH(order_date) = 6
-- ✅ 正确:范围查询(索引可用)
WHERE order_date >= '2023-06-01' AND order_date < '2023-07-01'
-- ✅ 更优:使用BETWEEN(含边界)
WHERE order_date BETWEEN '2023-06-01' AND '2023-06-30'
注意:BETWEEN对日期时间类型需谨慎处理边界,例如:
-- 范围包含起始日00:00:00,但不包含结束日00:00:00
WHERE created_at >= '2023-06-01'
AND created_at < '2023-07-01'
集合查询模式
当需要匹配多个离散值时,使用IN替代多个OR条件:
-- ❌ 冗长且难维护
WHERE category = 'A' OR category = 'B' OR category = 'C'
-- ✅ 简洁高效
WHERE category IN ('A', 'B', 'C')
-- ✅ 动态IN(子查询)
WHERE user_id IN (SELECT user_id FROM vip_users)
性能提示:IN列表超过1000项时,部分数据库(如Oracle)会报错,应改用临时表或分批处理。
分页查询模式
分页是含条件查询的常见配套操作,不同数据库语法差异较大:
-- MySQL / PostgreSQL
SELECT FROM products
WHERE category = '电子产品'
ORDER BY created_at DESC
LIMIT 20 OFFSET 40; -- 第3页(每页20条)
-- SQL Server
SELECT FROM products
WHERE category = '电子产品'
ORDER BY created_at DESC
OFFSET 40 ROWS FETCH NEXT 20 ROWS ONLY;
-- Oracle 12c+
SELECT FROM products
WHERE category = '电子产品'
ORDER BY created_at DESC
FETCH FIRST 20 ROWS ONLY;
关键点:分页前必须指定ORDER BY,否则结果无序且可能重复。