从这里开始,我们逐步讲解一些常用的语句,虽然前面可能已经偷偷使用了一些,也不妨碍我们这里系统讲解一遍。
一、WHERE 子句(条件过滤)
WHERE 用于限定查询、更新、删除操作的作用范围,是 SQL 最基础的筛选工具。
1. 基础等值匹配
sql
-- 查询等级等于1的所有玩家
SELECT * FROM player WHERE level = 1;
2. 逻辑关键字(AND / OR / NOT)
优先级:NOT > AND > OR ,可使用括号 () 改变优先级。
sql
-- 查询等级大于1且小于5,或者等级等于7的玩家
SELECT * FROM player WHERE level > 1 AND level < 5 OR level = 7;
-- 使用括号明确优先级
SELECT * FROM player WHERE (level > 1 AND level < 5) OR level = 7;
二、范围与集合查询
1. IN 关键字(匹配指定集合)
查询字段值属于某个列表内的数据。
sql
-- 查询等级为 1、3、5 的玩家
SELECT * FROM player WHERE level IN (1, 3, 5);
2. BETWEEN AND(范围查询,闭区间)
查询字段值在指定范围内的数据,包含起始值和结束值。
sql
-- 查询等级在 1~10 之间的玩家
SELECT * FROM player WHERE level BETWEEN 1 AND 10;
三、模糊查询(LIKE / REGEXP)
1. LIKE 模糊匹配
%:匹配任意长度字符串(包含空字符串)_:匹配单个任意字符(不能为空)
sql
-- 查询以"王"开头的玩家(王大力、王五均可匹配)
SELECT * FROM player WHERE name LIKE '王%';
-- 查询以"王"开头且名字只有两个字的玩家(仅王五可匹配)
SELECT * FROM player WHERE name LIKE '王_';
2. REGEXP 正则表达式
支持更灵活的模糊匹配规则:
sql
-- 查询名字中包含"王"的所有玩家
SELECT * FROM player WHERE name REGEXP '王';
常用正则通配符
.:任意单个字符^:以指定字符开头$:以指定字符结尾[abc]:匹配 a/b/c 中任意一个字符[a-z]:匹配 a-z 任意一个小写字母A|B:匹配 A 或者 B
四、NULL 值查询(重点易错点)
NULL 不等于任何值(包括自身),不能使用 = 判断。
sql
-- ✅ 正确:查询等级为空的玩家
SELECT * FROM player WHERE level IS NULL;
-- ✅ 正确:查询等级不为空的玩家
SELECT * FROM player WHERE level IS NOT NULL;
-- ✅ 特殊写法:安全等于 <=> 可判断 NULL
SELECT * FROM player WHERE level <=> NULL;
⚠ 注意:空字符串 '' 不等于 NULL。
五、ORDER BY 排序
对查询结果进行升序(ASC)/ 降序(DESC) 排列,不写默认为升序。
sql
-- 按等级升序排列
SELECT * FROM player ORDER BY level;
-- 按等级降序排列
SELECT * FROM player ORDER BY level DESC;
-- 多字段排序:等级降序 → 经验升序 → 名字降序
SELECT * FROM player ORDER BY level DESC, exp ASC, name DESC;
六、聚合函数(统计计算)
常用聚合函数:COUNT、AVG、MAX、MIN、SUM
sql
-- 统计玩家总数量
SELECT COUNT(*) FROM player;
-- 统计平均等级
SELECT AVG(level) FROM player;
-- 统计最高等级
SELECT MAX(level) FROM player;
-- 统计总经验
SELECT SUM(exp) FROM player;
七、GROUP BY 分组查询
对数据按指定字段分组,通常与聚合函数一起使用。
sql
-- 按等级分组,统计每个等级的玩家人数
SELECT level, COUNT(level) FROM player GROUP BY level;
八、HAVING 分组后过滤
HAVING 用于分组后过滤结果 ,必须搭配 GROUP BY 使用。
sql
-- 按等级分组,只显示人数大于4的等级
SELECT level, COUNT(level)
FROM player
GROUP BY level
HAVING COUNT(level) > 4
ORDER BY COUNT(level);
九、LIMIT 分页查询
限制查询结果返回的条数,常用于分页。
sql
-- 只显示前3条数据
SELECT * FROM player LIMIT 3;
-- 分页:从第4条开始,取3条(LIMIT 偏移量, 条数)
SELECT * FROM player LIMIT 3, 3;
十、DISTINCT 去重查询
去除查询结果中的重复数据。
sql
-- 查询不重复的玩家名字
SELECT DISTINCT name FROM player;
十一、集合运算(多结果集合并 / 交集 / 差集)
1. UNION / UNION ALL(并集)
UNION:自动去重UNION ALL:保留全部数据(效率更高)
sql
-- 合并两个查询结果(自动去重)
SELECT * FROM player WHERE level BETWEEN 1 AND 3
UNION
SELECT * FROM player WHERE exp BETWEEN 1 AND 3;
-- 合并结果(不去重)
SELECT * FROM player WHERE level BETWEEN 1 AND 3
UNION ALL
SELECT * FROM player WHERE exp BETWEEN 1 AND 3;
2. INTERSECT(交集)
查询同时满足两个条件的数据。
sql
SELECT * FROM player WHERE level BETWEEN 1 AND 3
INTERSECT
SELECT * FROM player WHERE exp BETWEEN 1 AND 3;
3. EXCEPT(差集)
查询只满足第一个条件、不满足第二个条件的数据。
sql
SELECT * FROM player WHERE level BETWEEN 1 AND 3
EXCEPT
SELECT * FROM player WHERE exp BETWEEN 1 AND 3;
十二、综合练习(实战常用)
练习 1:姓名模糊查询
sql
-- 查询名字以"宫本"开头的玩家
SELECT * FROM player WHERE name LIKE '宫本%';
-- 查询名字以"山"结尾的玩家
SELECT * FROM player WHERE name LIKE '%山';
练习 2:按姓氏统计人数
sql
-- 按姓氏分组 → 统计人数 → 只显示人数>5 → 按人数降序 → 取前3名
SELECT
SUBSTR(name, 1, 1) AS surname,
COUNT(*) AS count
FROM player
GROUP BY surname
HAVING COUNT(*) > 5
ORDER BY count DESC
LIMIT 3;
十三、SQL 语法执行顺序
编写复杂查询时,必须遵循执行顺序:
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- LIMIT