Linux个人心得25 (mysql⑤)

从这里开始,我们逐步讲解一些常用的语句,虽然前面可能已经偷偷使用了一些,也不妨碍我们这里系统讲解一遍。

一、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;

六、聚合函数(统计计算)

常用聚合函数:COUNTAVGMAXMINSUM

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 语法执行顺序

编写复杂查询时,必须遵循执行顺序:

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. DISTINCT
  7. ORDER BY
  8. LIMIT
相关推荐
文青小兵1 分钟前
Linux云计算——docker部分技术、命令 (一)
linux·docker·云计算
流星白龙4 分钟前
【MySQL高阶】5.MySQL服务器简介
服务器·mysql·adb
文青小兵7 分钟前
Linux云计算——docker 监控(五)
linux·docker·云计算·grafana·prometheus
流星白龙7 分钟前
【MySQL高阶】9.在一台机器上运行多个MySQL实例
数据库·mysql·adb
Rick19937 分钟前
MySQL 优化器会选择【最小、最精准、最高效】的索引
数据库·mysql
mN9B2uk1711 分钟前
MySQL命令行导出数据库
c语言·数据库·mysql
STDD19 分钟前
ATLAS MMO 专用服务器搭建教程:海盗生存 MMO 服务器开服指南
运维·服务器·php
ThinkPet23 分钟前
记事-vue3项目部署Jenkins实现CICD流程
运维·nginx·jenkins·jenkinsfile·cicd流水线
j_xxx404_28 分钟前
Linux 线程同步硬核解析:从条件变量、阻塞队列到信号量环形队列
linux·运维·服务器·c++·人工智能·ai·中间件
AI人工智能+电脑小能手29 分钟前
【大白话说Java面试题 第86题】【Mysql篇】第16题:MySQL 中锁的种类与行锁实现原理?
java·开发语言·数据库·mysql·面试