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;

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

常用聚合函数: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 语法执行顺序

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

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. DISTINCT
  7. ORDER BY
  8. LIMIT
相关推荐
lzx_0026 小时前
Linux 进程(三) 从进程状态到僵尸进程、孤儿进程
linux·服务器
FlightYe7 小时前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
刘马想放假9 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
kloc10 小时前
聊天室项目入口网关子服务的实现
linux·c++
GeW10 小时前
深圳APEC峰会倒计时:数据库与Linux运维的"隐形考场"
linux
梦到啥说啥11 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
无足鸟ICT12 小时前
【RHCA+】ipcrm命令(删除IPC资源)
linux
星恒随风13 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Z21-X14 小时前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
Pniubi15 小时前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql