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
相关推荐
qetfw23 分钟前
CentOS 7 基础环境配置
linux·运维·centos
天空'之城27 分钟前
Linux 系统编程 21:守护进程与日志系统全解
linux·系统编程·日志系统·守护进程
l1t1 小时前
用split命令恢复被wget -c命令误追加的zip压缩包
linux
随性而行3602 小时前
微信API接口与AI自动化:开发者的实现思路
运维·服务器·开发语言·人工智能·微信·自动化
ttwuai2 小时前
GoFrame 连接 MySQL 报错排查:parseTime、时区和 utf8mb4 怎么配
数据库·mysql·adb
辉灰笔记2 小时前
MySQL8 意外关机/误移data目录导致服务启动失败 PID报错/权限报错 修复文档
linux·数据库·mysql·centos
喜欢的名字被抢了3 小时前
MySQL核心机制:事务、锁与存储引擎
数据库·sql·mysql·教程
胖兔纸23 小时前
OpenStack 1.7.2 & Ceph 9.2.1 运维命令
运维·ceph·openstack
不会C语言的男孩4 小时前
Docker 在嵌入式设备中的常用玩法
运维·docker·容器
ylscode4 小时前
CVE-2026-31694 漏洞深度分析:Linux 内核 FUSE 组件存在本地提权风险,普通用户可直取 root 权限
linux·运维·服务器