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
相关推荐
小马同学-11 分钟前
mysql数据库原理
数据库·mysql
qeen871 小时前
【Linux】Linux环境下的进程终止与进程等待问题
linux·运维·服务器
机核研创社2 小时前
短裤自动化工序与设备清单:十个点位、三项技术要点与选型裁决顺序
运维·自动化
尹人入圣2 小时前
市面上IP驱动产业新场景新工具
运维·网络·python·tcp/ip
LRL_2 小时前
【实战指南】Node.js 跨平台依赖下载:如何在 Windows/Linux 环境下互跨下载目标系统的 npm/pnpm 包
linux·windows·node.js
高山有多高3 小时前
【Linux笔记】网络命令
linux
布莱克6053 小时前
MySQL 增删改查(CRUD)语法详解
数据库·mysql·增删改查
一条破秋裤3 小时前
Linux 线程同步:读写锁
java·linux·jvm
JieDavid4 小时前
奇智创达知识产权管理系统期限监控模块实操,告别人工期限疏漏,实现管理闭环!
大数据·运维·人工智能·经验分享·重构
工作10年+,存储芯片行业4 小时前
Linux NVMe 中断排查与性能优化:IRQ 优化(原理+排查)
linux·运维·性能优化·ssd·nvme·pcie·中断