🕵️♂️ 数据库单表查询全攻略:从入门到精通,看这一篇就够了!
引言:别再用 SELECT * 裸奔了!
在数据库的世界里,80%的日常操作都是在和"查询"打交道。而单表查询,就是所有复杂查询的基石。如果把数据库比作一个巨大的图书馆,那么单表查询就是你在这个图书馆里精准找书、统计藏书、整理书架的基本功。
今天,我们就来一次地毯式的扫盲,把 MySQL 单表查询的所有知识点(增删改查里的"查")一次性讲透!无论你是刚入门的小白,还是想查漏补缺的老手,这篇干货都能让你满载而归。
📖 第一章:基础查询------数据的"搬运工"
最基础的查询,就是从表里把数据拿出来。核心语法是 SELECT ... FROM ...。
1. 查什么?
-
查所有列:
SELECT *FROM users; -
⚠️ 避坑指南 :在生产环境中,千万别图省事用
*!这不仅会传输大量不需要的数据,还会导致数据库无法利用覆盖索引,性能大打折扣。 -
查指定列:
SELECT name, ageFROM users;(按需索取,才是好公民)。
2. 起个好听的名字(别名 AS)
字段名太长或者不方便展示时,可以用 AS 起别名:
SELECT name AS '姓名', age AS '年龄' FROM users;
3. 拒绝重复(DISTINCT)
如果你想知道用户都来自哪些城市,不想看一堆重复的"北京",可以用 DISTINCT 去重:
SELECT DISTINCT city FROM users;
💡 注意 :DISTINCT 作用于后面所有的字段,只有当这些字段的值完全一样时才会被去重。
🔍 第二章:条件查询------精准的"筛选器"
只查一部分数据怎么办?这就需要用到 WHERE 子句。它是 SQL 中使用频率最高的部分。
1. 比较与逻辑运算
-
比大小/相等 :
=,>,<,>=,<=,!=(或<>)。例子:SELECT *FROM goodsWHERE price > 100; -
逻辑组合 :
AND(并且),OR(或者),NOT(取反)。例子:SELECT *FROM usersWHERE age >= 18 AND status = 'active';
2. 范围查询神器
-
连续范围 (BETWEEN AND):包含边界值。例子:
SELECT *FROM ordersWHERE amount BETWEEN 100 AND 500; -
指定集合 (IN):匹配非连续的特定值。例子:
SELECT *FROM usersWHERE city IN ('北京', '上海', '广州');
3. 模糊查询 (LIKE)
想找名字里带"华"的人?用通配符!
-
%:代表任意多个字符(包括0个)。例子 :name LIKE '张%'(姓张的),name LIKE '%手机%'(名字里包含手机的)。 -
_:代表任意一个 字符。例子 :name LIKE '_明'(两个字的名字,且叫某明)。
4. 空值判断 (IS NULL)
⚠️ 高频易错点 :数据库里的 NULL 代表"什么都没有",不能用 = 来判断!
- 正确写法:
WHERE email IS NULL或WHERE email IS NOT NULL。
📊 第三章:排序与分页------数据的"美容师"
查出来的数据乱糟糟?想要第几页的数据?
1. 排序 (ORDER BY)
-
升序 (ASC):默认,可以省略。
-
降序 (DESC):从高到低。
-
多字段排序:先按部门排,部门一样的再按工资排。
sql
SELECT * FROM employees ORDER BY department ASC, salary DESC;
2. 分页 (LIMIT)
面试必问!怎么实现网页上的"下一页"?
-
取前 N 条 :
LIMIT n。 -
跳过 M 条,取 N 条 :
LIMIT m, n(注意:起始位置是从 0 开始的)。例子 :每页显示 10 条,想看第 3 页的数据(即跳过前 20 条):sqlSELECT * FROM products LIMIT 20, 10;
🧮 第四章:聚合函数与分组------数据的"统计员"
老板问你:"咱们公司各部门的平均工资是多少?" 这时候就需要聚合函数和分组出场了。
1. 五大常用聚合函数
它们是对一组数据进行计算,返回单个值:
-
COUNT(*):统计总行数(不管里面有没有 NULL)。 -
SUM(列):求和(只能用于数值列)。 -
AVG(列):求平均值(忽略 NULL)。 -
MAX(列)/MIN(列):求最大/最小值。
2. 分组 (GROUP BY)
把数据按某个特征归类,然后对每一类进行统计。
sql
-- 统计每个部门的员工人数
SELECT department, COUNT(*) FROM employees GROUP BY department;
3. 过滤分组 (HAVING)
很多同学分不清 WHERE 和 HAVING。记住这个口诀:"先筛选,后分组;分完组,再过滤"。
-
WHERE:在分组之前过滤原始数据(不能用聚合函数)。 -
HAVING:在分组之后过滤统计结果(必须配合 GROUP BY 使用)。
经典案例:找出平均薪资大于 15000 的部门。
sql
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 15000; -- 这里绝对不能用 WHERE!
⚙️ 第五章:底层逻辑------SQL 的执行顺序
写 SQL 的时候,我们是按 SELECT -> FROM -> WHERE 的顺序写的。但数据库在执行时,其实是另一套逻辑!理解这个,对你排查 Bug 非常有帮助。
正确的执行顺序是这样的:
-
FROM:先确定要查哪张表。
-
WHERE:把不符合条件的行踢出去。
-
GROUP BY:把剩下的数据分组。
-
HAVING:把不符合条件的组踢出去。
-
SELECT:挑出要展示的列。
-
DISTINCT:去重。
-
ORDER BY:给结果排个序。
-
LIMIT:截取最后要展示的那几条。
📝 总结:单表查询知识全景图
为了方便大家记忆,我把今天的重点整理成了一张速查表:
| 关键词 | 作用 | 核心注意点 |
|---|---|---|
| SELECT | 投影(选列) | 生产环境少用 *,多用别名 |
| WHERE | 筛选(选行) | NULL 要用 IS 判断;LIKE 走索引有讲究 |
| GROUP BY | 分组统计 | 分组后的 SELECT 字段必须出现在 GROUP BY 中 |
| HAVING | 分组后过滤 | 专门用来过滤聚合函数(如 COUNT, AVG)的结果 |
| ORDER BY | 排序 | 默认为 ASC,多字段排序用逗号隔开 |
| LIMIT | 分页 | LIMIT 起始位置, 条数 ,起始位置从 0 开始 |
掌握了单表查询,你就打通了数据库操作的"任督二脉"。下次面对复杂的业务需求时,试着把这些积木(关键字)灵活组合起来,你会发现 SQL 其实非常优雅!
如果觉得这篇内容对你有帮助,别忘了点赞、在看、转发三连哦!我们下期见!👋