阅读前须知-点我下拉
数据库简单查询的学习笔记
目录
-
数据库简单查询
├── 1.1 数据库查询是什么?
├── 1.2 查询的核心 —— SELECT
├── 1.3 查询指定字段
├── 1.4 筛选条件 —— WHERE
├── 1.5 排序 —— ORDER BY
├── 1.6 并或 —— AND 和 OR
├── 1.7 模糊查询 —— LIKE
├── 1.8 限制数量 —— LIMIT
└── 1.9 重命名 —— AS -
数据库聚合函数
├── 2.1 统计数量 —— COUNT()
├── 2.2 简单函数 —— SUM(),AVG(),MAX(),MIN()
├── 2.3 分组 —— GROUP BY
├── 2.4 分组后筛选 —— HAVING
└── 2.5 SQL的执行顺序
数据库简单查询
1.数据库查询是什么?
数据库查询本质是:从数据库中“提取数据”,也可以简单理解为:在Excel表格中查找内容。只是数据库更加强大。
SQL(Structured Query Language)是查询语言,就是结构化查询语言。专门用来对数据增删改查,核心就是SELECE,本篇文章,就会围绕查询,进行数据库简单查询的学习笔记整理。
举一个实例,下方有一个名为student的表格:
表(table): EXCEL表格
行(row): 一条数据
列(column): 一个字段
| id | name | age | score | phone |
|---|---|---|---|---|
| 1 | 张三 | 18 | 95 | 138 |
| 2 | 李四 | 19 | 88 | NULL |
| 3 | 王五 | 18 | 76 | NULL |
2.查询的核心——SELECT
1 | SELECT 字段 FROM 表名; |
以下笔记全部结合于上述的实例表格
1 | SELECT * FROM student; |
SELECT:查询。*:all的意思,所有字段。FROM:从哪个表。
完整含义:查询student表中是所有数据
3.查询指定字段
1 | SELECT name, score FROM student; |
如果不使用查询全部的*,上述代码的完整含义为:只查询student表中姓名和成绩。
实际效果如下:
| name | score |
|---|---|
| 张三 | 95 |
| 李四 | 88 |
| 王五 | 76 |
4.筛选条件——WHERE
- 首先要了解查询运算符:
| 运算符 | 含义 |
|---|---|
| = | 等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| != | 不等于 |
1 | SELECT * FROM student |
完整含义:查询student表中年龄等于18的学生
1 | SELECT * FROM student |
完整含义:查询student表中成绩大于90的学生
- 对字段进行布尔类型的判断,1为true,0为false
1 | SELECT * FROM student |
完整含义:查询student表中在校的学生
1 | SELECT * FROM student |
完整含义:查询student表中不在校的学生
- 还可以检查缺失值,IS NULL:缺失值 ; IS NOT NULL:存在值
1 | SELECT * FROM student |
完整含义:查询student表中没有手机号的学生
| id | name | phone |
|---|---|---|
| 2 | 李四 | NULL |
| 3 | 王五 | NULL |
1 | SELECT * FROM student |
完整含义:查询student表中有手机号的学生
| id | name | phone |
|---|---|---|
| 1 | 张三 | 138 |
5. 排序——ORDER BY
ASC : 升序
DESC : 降序
1 | SELECT * FROM student |
完整含义:查询student表并升序排序
1 | SELECT * FROM student |
完整含义:查询student表并降序排序
6. 并或——AND 和 OR
AND:同时满足
1 | SELECT * FROM student |
完整含义:查询student表中年龄18并且成绩大于90的学生
OR:满足一个即可
1 | SELECT * FROM student |
完整含义:查询student表中年龄18或者成绩大于90的学生
7. 模糊查询——LIKE
模糊查询,也叫模式匹配,用于在 WHERE 子句中搜索列中的指定模式。当你只记得部分信息(比如"名字里带张"、“以某字开头”)而无法用 = 精确匹配时,就可以使用 LIKE。
LIKE 依赖两个通配符来实现模糊匹配:
| 通配符 | 含义 | 能否为零个字符 |
|---|---|---|
% |
匹配 0个或多个 任意字符 | ✅ 可以 |
_ |
匹配 恰好1个 任意字符 | ❌ 不能,必须占一个字符位 |
核心区别:
%像"省略号"——可以代表任意长度(包括空);_像"占位符"——每个_严格占一个字符位置。
1. % 通配符示例:
1 | -- 以"张"开头,后面跟0个或多个任意字符 |
| id | name | age | score | phone |
|---|---|---|---|---|
| 1 | 张三 | 18 | 95 | 138 |
查询结果包括"张三"(因为"三"被 % 匹配了)。如果还有"张"这个单字名也会被匹配(% 可以匹配0个字符)。
1 | -- 以"张"结尾,前面有0个或多个任意字符 |
只要名字最后一个字是"张"就会被查出。
1 | -- 任意位置包含"张" |
这是最常用的模糊查询写法:只要名字里有"张"就匹配,不论位置。
2. _ 通配符示例:
_ 最核心的规则是:一个下划线严格匹配一个字符,不能多也不能少。
1 | -- 姓"张"且名字恰好是2个字(_ 代表恰好1个字符) |
| id | name | age | score | phone |
|---|---|---|---|---|
| 1 | 张三 | 18 | 95 | 138 |
'张_' 匹配"张三",但不匹配"张"(少了1个字)也不匹配"张三四"(多了1个字)。
1 | -- 名字为3个字,且中间那个字是"小" |
这个写法拆解为:
- 第1个
_→ 第1个字(任意) 小→ 第2个字(精确匹配)- 第2个
_→ 第3个字(任意)
所以 '_小_' 能匹配"李小三"“王小四"这类名字,但不匹配"小张”(只有2个字)或"李小三四"(有4个字)。
1 | -- 名字恰好是3个字(3个下划线 = 3个字符) |
这是 _ 的经典用法:不用关心每个位置是什么字,只限定字符数量。
3. % 与 _ 联合使用:
1 | -- 姓"张"且名字至少2个字(_保证至少1个,%匹配后续任意) |
联合使用时可以组合出更灵活的匹配规则:
_负责精确控制某几个位置的字符数%负责其余位置"任意长度"的模糊匹配
通配符总表:
| 写法 | 含义 | 匹配示例 |
|---|---|---|
张% |
以"张"开头 | 张、张三、张三四 |
%张 |
以"张"结尾 | 张、小张、小小张 |
%张% |
包含"张" | 张、张三、小张、小小张五 |
张_ |
姓"张"且恰好2个字 | 张三、张四 |
_小_ |
3个字且中间是"小" | 李小三、王小四 |
___ |
恰好3个字 | 任意3字名 |
张_% |
姓"张"且至少2个字 | 张三、张三四五 |
8. 限制数量——LIMIT
1 | SELECT * FROM student |
完整含义:只查询student表中前两条数据
1 | SELECT * FROM student |
查询了整个表,在对其进行降序后,只查询第一条数据,就是成绩最大的
完整含义:查询student表中成绩最高的一位学生
9. 重命名——AS
对比以下2种写法,都是查询了student表中年龄的列,对比有AS和没AS的区别
1 | SELECT age |
| age |
|---|
| 18 |
| 20 |
1 | SELECT age AS 年龄 |
| 年龄 |
|---|
| 18 |
| 20 |
数据库聚合函数
1. 统计数量——COUNT()
1 | SELECT COUNT(*) FROM student; |
完整含义:统计所有的学生人数(COUNT(*)含义是统计所有行数)
结果 --> 3
1 | SELECT COUNT(*) FROM student |
逻辑是统计完所有行数后,找到年龄是18的学生
完整含义:统计所有的学生人数
结果 --> 2
COUNT(*)和SELECT * 的本质区别是:前者是“有多少个”,后者是“都有谁?”
2. 简单函数——SUM(),AVG(),MAX(),MIN()
1 | SELECT SUM(score) FROM student; |
SUM()求和:计算95+88+76
1 | SELECT AVG(score) FROM student; |
AVG()求平均值
1 | SELECT MAX(score) FROM student; |
MAX()最大值
1 | SELECT MIN(score) FROM student; |
MIN()最小值
3. 分组——GROUP BY
假如现在有一个新表grade:
| name | class | score |
|---|---|---|
| 张三 | 1班 | 90 |
| 李四 | 1班 | 80 |
| 王五 | 2班 | 70 |
如果需要统计每个班级的平均分,就需要分组。GROUP BY 基本语法:SELECT 分组字段,聚合函数 FROM 表名 GROUP BY 分组字段;
1 | SELECT class AS 班级, COUNT(*) AS 人数 |
先统计每个班级的人数:
| 班级 | 人数 |
|---|---|
| 1班 | 2 |
| 2班 | 1 |
1 | SELECT class AS 班级, AVG(score) AS 平均分 |
| 班级 | 平均分 |
|---|---|
| 1班 | 85 |
| 2班 | 70 |
4. 分组后筛选——HAVING
区分:WHERE是分组之前的筛选,HAVING是分组之后的筛选,并且WHERE不能使用聚合函数,仅针对行;HAVING可以使用聚合函数,并且针对组。
1 | SELECT class, AVG(score) |
完整含义:查询grade表中平均分大于80分的班级
5. SQL的执行顺序
1 | SELECT |








