阅读前须知-点我下拉

数据库简单查询的学习笔记

目录

  1. 数据库简单查询
    ├── 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. 数据库聚合函数
    ├── 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
2
SELECT * FROM student
WHERE age = 18;

完整含义:查询student表中年龄等于18的学生

1
2
SELECT * FROM student
WHERE score > 90;

完整含义:查询student表中成绩大于90的学生

  • 对字段进行布尔类型的判断,1为true,0为false
1
2
SELECT * FROM student
WHERE is_school=1;

完整含义:查询student表中在校的学生

1
2
SELECT * FROM student
WHERE is_school=0;

完整含义:查询student表中不在校的学生

  • 还可以检查缺失值,IS NULL:缺失值 ; IS NOT NULL:存在值
1
2
SELECT * FROM student
WHERE phone IS NULL;

完整含义:查询student表中没有手机号的学生

id name phone
2 李四 NULL
3 王五 NULL
1
2
SELECT * FROM student
WHERE phone IS NOT NULL;

完整含义:查询student表中有手机号的学生

id name phone
1 张三 138

5. 排序——ORDER BY

ASC : 升序
DESC : 降序

1
2
SELECT * FROM student
ORDER BY score ASC;

完整含义:查询student表并升序排序

1
2
SELECT * FROM student
ORDER BY score DESC;

完整含义:查询student表并降序排序

6. 并或——AND 和 OR

AND:同时满足

1
2
SELECT * FROM student
WHERE age = 18 AND score > 90;

完整含义:查询student表中年龄18并且成绩大于90的学生

OR:满足一个即可

1
2
SELECT * FROM student
WHERE age = 18 OR score > 90;

完整含义:查询student表中年龄18或者成绩大于90的学生

7. 模糊查询——LIKE

模糊查询,也叫模式匹配,用于在 WHERE 子句中搜索列中的指定模式。当你只记得部分信息(比如"名字里带张"、“以某字开头”)而无法用 = 精确匹配时,就可以使用 LIKE。

LIKE 依赖两个通配符来实现模糊匹配:

通配符 含义 能否为零个字符
% 匹配 0个或多个 任意字符 ✅ 可以
_ 匹配 恰好1个 任意字符 ❌ 不能,必须占一个字符位

核心区别:% 像"省略号"——可以代表任意长度(包括空);_ 像"占位符"——每个 _ 严格占一个字符位置。


1. % 通配符示例:

1
2
3
-- 以"张"开头,后面跟0个或多个任意字符
SELECT * FROM student
WHERE name LIKE '张%';
id name age score phone
1 张三 18 95 138

查询结果包括"张三"(因为"三"被 % 匹配了)。如果还有"张"这个单字名也会被匹配(% 可以匹配0个字符)。

1
2
3
-- 以"张"结尾,前面有0个或多个任意字符
SELECT * FROM student
WHERE name LIKE '%张';

只要名字最后一个字是"张"就会被查出。

1
2
3
-- 任意位置包含"张"
SELECT * FROM student
WHERE name LIKE '%张%';

这是最常用的模糊查询写法:只要名字里有"张"就匹配,不论位置。


2. _ 通配符示例:

_ 最核心的规则是:一个下划线严格匹配一个字符,不能多也不能少。

1
2
3
-- 姓"张"且名字恰好是2个字(_ 代表恰好1个字符)
SELECT * FROM student
WHERE name LIKE '张_';
id name age score phone
1 张三 18 95 138

'张_' 匹配"张三",但不匹配"张"(少了1个字)也不匹配"张三四"(多了1个字)。

1
2
3
-- 名字为3个字,且中间那个字是"小"
SELECT * FROM student
WHERE name LIKE '_小_';

这个写法拆解为:

  • 第1个 _ → 第1个字(任意)
  • → 第2个字(精确匹配)
  • 第2个 _ → 第3个字(任意)

所以 '_小_' 能匹配"李小三"“王小四"这类名字,但不匹配"小张”(只有2个字)或"李小三四"(有4个字)。

1
2
3
-- 名字恰好是3个字(3个下划线 = 3个字符)
SELECT * FROM student
WHERE name LIKE '___';

这是 _ 的经典用法:不用关心每个位置是什么字,只限定字符数量。


3. % 与 _ 联合使用:

1
2
3
-- 姓"张"且名字至少2个字(_保证至少1个,%匹配后续任意)
SELECT * FROM student
WHERE name LIKE '张_%';

联合使用时可以组合出更灵活的匹配规则:

  • _ 负责精确控制某几个位置的字符数
  • % 负责其余位置"任意长度"的模糊匹配

通配符总表:

写法 含义 匹配示例
张% 以"张"开头 张、张三、张三四
%张 以"张"结尾 张、小张、小小张
%张% 包含"张" 张、张三、小张、小小张五
张_ 姓"张"且恰好2个字 张三、张四
_小_ 3个字且中间是"小" 李小三、王小四
___ 恰好3个字 任意3字名
张_% 姓"张"且至少2个字 张三、张三四五

8. 限制数量——LIMIT

1
2
SELECT * FROM student
LIMIT 2;

完整含义:只查询student表中前两条数据

1
2
3
SELECT * FROM student
ORDER BY score DESC
LIMIT 1;

查询了整个表,在对其进行降序后,只查询第一条数据,就是成绩最大的
完整含义:查询student表中成绩最高的一位学生

9. 重命名——AS

对比以下2种写法,都是查询了student表中年龄的列,对比有AS和没AS的区别

1
2
SELECT age 
FROM student;
age
18
20
1
2
SELECT age AS 年龄
FROM student;
年龄
18
20

数据库聚合函数

1. 统计数量——COUNT()

1
SELECT COUNT(*) FROM student;

完整含义:统计所有的学生人数(COUNT(*)含义是统计所有行数)
结果 --> 3

1
2
SELECT COUNT(*) FROM student
WHERE age = 18;

逻辑是统计完所有行数后,找到年龄是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
2
3
SELECT class AS 班级, COUNT(*) AS 人数
FROM student
GROUP BY class;

先统计每个班级的人数:

班级 人数
1班 2
2班 1
1
2
3
SELECT class AS 班级, AVG(score) AS 平均分
FROM student
GROUP BY class;
班级 平均分
1班 85
2班 70

4. 分组后筛选——HAVING

区分:WHERE是分组之前的筛选,HAVING是分组之后的筛选,并且WHERE不能使用聚合函数,仅针对行;HAVING可以使用聚合函数,并且针对组。

1
2
3
4
SELECT class, AVG(score)
FROM student
GROUP BY class
HAVING AVG(score) > 80;

完整含义:查询grade表中平均分大于80分的班级

5. SQL的执行顺序

1
2
3
4
5
6
7
8
SELECT
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT