数据库单表查询全攻略

🕵️‍♂️ 数据库单表查询全攻略:从入门到精通,看这一篇就够了!

引言:别再用 SELECT * 裸奔了!

在数据库的世界里,80%的日常操作都是在和"查询"打交道。而单表查询,就是所有复杂查询的基石。如果把数据库比作一个巨大的图书馆,那么单表查询就是你在这个图书馆里精准找书、统计藏书、整理书架的基本功。

今天,我们就来一次地毯式的扫盲,把 MySQL 单表查询的所有知识点(增删改查里的"查")一次性讲透!无论你是刚入门的小白,还是想查漏补缺的老手,这篇干货都能让你满载而归。


📖 第一章:基础查询------数据的"搬运工"

最基础的查询,就是从表里把数据拿出来。核心语法是 SELECT ... FROM ...

1. 查什么?
  • 查所有列

    SELECT *

    FROM users;

  • ⚠️ 避坑指南 :在生产环境中,千万别图省事用 *!这不仅会传输大量不需要的数据,还会导致数据库无法利用覆盖索引,性能大打折扣。

  • 查指定列

    SELECT name, age

    FROM 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 goods

    WHERE price > 100;

  • 逻辑组合AND (并且), OR (或者), NOT (取反)。例子

    SELECT *

    FROM users

    WHERE age >= 18 AND status = 'active';

2. 范围查询神器
  • 连续范围 (BETWEEN AND):包含边界值。例子

    SELECT *

    FROM orders

    WHERE amount BETWEEN 100 AND 500;

  • 指定集合 (IN):匹配非连续的特定值。例子

    SELECT *

    FROM users

    WHERE city IN ('北京', '上海', '广州');

3. 模糊查询 (LIKE)

想找名字里带"华"的人?用通配符!

  • %:代表任意多个字符(包括0个)。例子name LIKE '张%'(姓张的),name LIKE '%手机%'(名字里包含手机的)。

  • _:代表任意一个 字符。例子name LIKE '_明'(两个字的名字,且叫某明)。

4. 空值判断 (IS NULL)

⚠️ 高频易错点 :数据库里的 NULL 代表"什么都没有",不能用 = 来判断!

  • 正确写法:WHERE email IS NULLWHERE 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 条):

    sql 复制代码
    SELECT * 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)

很多同学分不清 WHEREHAVING。记住这个口诀:"先筛选,后分组;分完组,再过滤"

  • 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 非常有帮助。

正确的执行顺序是这样的

  1. FROM:先确定要查哪张表。

  2. WHERE:把不符合条件的行踢出去。

  3. GROUP BY:把剩下的数据分组。

  4. HAVING:把不符合条件的组踢出去。

  5. SELECT:挑出要展示的列。

  6. DISTINCT:去重。

  7. ORDER BY:给结果排个序。

  8. LIMIT:截取最后要展示的那几条。


📝 总结:单表查询知识全景图

为了方便大家记忆,我把今天的重点整理成了一张速查表:

关键词 作用 核心注意点
SELECT 投影(选列) 生产环境少用 *,多用别名
WHERE 筛选(选行) NULL 要用 IS 判断;LIKE 走索引有讲究
GROUP BY 分组统计 分组后的 SELECT 字段必须出现在 GROUP BY 中
HAVING 分组后过滤 专门用来过滤聚合函数(如 COUNT, AVG)的结果
ORDER BY 排序 默认为 ASC,多字段排序用逗号隔开
LIMIT 分页 LIMIT 起始位置, 条数 ,起始位置从 0 开始

掌握了单表查询,你就打通了数据库操作的"任督二脉"。下次面对复杂的业务需求时,试着把这些积木(关键字)灵活组合起来,你会发现 SQL 其实非常优雅!

如果觉得这篇内容对你有帮助,别忘了点赞、在看、转发三连哦!我们下期见!👋

相关推荐
文心快码BaiduComate2 小时前
520,Comate Mission模式跨越界限,和你达成最「深」联动
前端·数据库·后端
杨云龙UP2 小时前
Oracle RAC/ODA环境下如何准确查询PDB表空间已分配大小?一次说清Oracle表空间逻辑大小和ASM三副本实际占用_2026-05-19
linux·运维·数据库·sql·oracle·ffmpeg
ゆづき2 小时前
Java 初学者入门指南:常见问题 + 核心知识点 + 进阶 20 道练习题
java·开发语言·学习·算法·水题
@nengdoudou2 小时前
KingbaseES数据库MySQL模式使用 “GROUP BY“
数据库·mysql
晨曦中的暮雨2 小时前
3.20字节云部门一面|面经
数据库·oracle
万邦科技Lafite3 小时前
实战演练:利用京东API一键抓取商品详情
数据库·redis·python·缓存·开放api·淘宝开放平台
LIUAWEIO3 小时前
接口 data 满屏反斜杠,怎么展开?
java·开发语言·数据库·json在线解析·data是字符串·json转义·二次json
沪漂阿龙3 小时前
面试题详解:大模型设计沙箱全攻略——LLM Sandbox、Agent 工具执行、代码沙箱、安全隔离、权限控制与工程落地
网络·数据库·人工智能·安全