1, 数据库的相关概念
以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊端。
如果说文件中存储的是以下这种数据:
姓名 年龄 性别 住址
张三 18 男 联合路1号
李四 19 男 联合路2号
王五 20 女 联合路3号
如果说现在我们需要把李四的性别改为女的话,通过我们之前学习的IO流操作,我们需要把现存的数据读取到内存当中,然后我们进行修改,随后把修改好了的数据再次存储到文件中。这样的方法存在很大的问题,比如说当文件很大时,内存就无法存储这么大的数据。
如果说我们需要既能持久化存储数据,也要能避免上述问题的技术使用在我们的系统中。那么数据库就是这样的技术。
1.1 数据库
- 存储和管理数据的仓库,数据是有组织的进行存储。
- 数据库英文名是 DataBase,简称DB
数据库就是把数据存储在硬盘上,这样子达到持久化存储的效果。解决这种办法的方法就是使用数据库管理系统。
1.2 数据库管理系统
- 管理数据库的大型软件
- 英文:DataBase Management System,简称 DBMS
图片所示就是 数据库管理系统 和 数据库 的关系。
1.3 常见的数据库管理系统
- Oracle:收费的大型数据库,Oracle 公司的产品
- MySQL: 开源免费的中小型数据库。后来 Sun公司收购了 MySQL,而 Sun 公司又被 Oracle 收购
- SQL Server:MicroSoft 公司收费的中型的数据库。C#等语言常使用
- PostgreSQL:开源免费中小型的数据库
- DB2:IBM 公司的大型收费数据库产品
- SQLite:嵌入式的微型数据库。如:作为 Android 内置数据库
- MariaDB:开源免费中小型的数据库
本次学习的是MySQL数据库管理系统。但是不需要担心不会其他的管理系统,因为这些管理系统都是依靠(SQL)编程语言来实现的。
1.4 SQL
- 英文:Structured Query Language,简称 SQL,结构化查询语言
- 操作关系型数据库的编程语言
- 定义操作所有关系型数据库的统一标准,可以使用SQL操作所有的关系型数据库管理系统,以后工作中如果使用到了其他的数据库管理系统,也同样的使用SQL来操作。
2, MySQL
2.1 MySQL安装
安装很简单,笔记中不详讲,忘记了安装,观看视频MySQL的01.
下载链接:https://downloads.mysql.com/archives/community/
下载完后进行解压:
2.2 MySQL的卸载
第一步打开命令窗口(cmd)
1.然后输入 net stop mysql ,回车。
net stop mysql
2.在输入 mysqld -remove mysql , 回车。
mysqld -remove mysql
3.删除MySQL的目录以及环境变量。
完成卸载。
2.3 MySQL配置环境变量
2.3.1 添加环境变量
右键 此电脑 -> 属性 , 点击 高级系统设置
点击 环境变量
在 系统变量 中新建一个MySQL_HOME,变量值是自己mysql所在的目录
在 系统变量 中找到 Path 并双击,新建立一个环境变量,变量值 %MYSQL_HOME%\bin
%为引用,后边的\bin是指这个文件夹。
建立这个环境变量主要是能在cmd中直接使用。
右键开始菜单(就是屏幕左下角),选择命令提示符(管理员)
,打开黑框,敲入mysql
,回车。
如果提示Can't connect to MySQL server on 'localhost'
则证明添加成功;
如果提示mysql不是内部或外部命令,也不是可运行的程序或批处理文件
则表示添加失败,请重新检查步骤并重试。
如果使用mysql命令时报缺少dll文件的错误,如下:
说明当前系统缺少dll文件,我们需要在系统上把C++环境装好,直接运行课程资料里的”vcredist_x64.exe“,
等安装好后重新打开命令界面。再次执行mysql命令。
2.3.2 新建配置文件
新建一个文本文件txt,内容如下:
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
然后将上方的文件另存为,保存类型里选所有文件 (*.*)
,文件名叫my.ini
,存放的路径为MySQL的根目录
(我的电脑就是在 D:\mysql-5.7.24-winx64 )。
上面代码意思就是配置数据库的默认编码集为utf-8和默认存储引擎为INNODB。
2.3.3 初始化MySQL
在刚才的黑框中敲入mysqld --initialize-insecure
,回车,稍微等待一会,如果出现没有出现报错信息(如下图)则证明data目录初始化没有问题,此时再查看MySQL目录下已经有data目录生成。
mysqld --initialize-insecure
tips:如果出现如下错误
是由于权限不足导致的,则需要用管理员方式运行 cmd.exe
2.3.4 注册MySQL服务
在黑框里敲入mysqld -install
,回车。
mysqld -install
则注册完毕,电脑上此时已经安装好了MySQL服务。
2.3.5 启动MySQL服务
在命令黑窗口里敲入net start mysql
,回车。
net start mysql // 启动mysql服务
net stop mysql // 停止mysql服务
2.3.6 修改默认的账户密码(切记不要忘,修改起来很麻烦)
在黑窗口里敲入mysqladmin -u root password 108113
,这里的108113
就是指我的密码,默认的为1234。
至此,MySQL 5.7 解压版安装完毕!
2.4 MySQL登录和退出
登录
win+R,输入cmd,打开黑窗口。
在黑窗口中输入,mysql -uroot -p108113
,回车,出现下图且左下角为mysql>
,则登录成功。
mysql -uroot -p108113
登录参数:
mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)
退出
退出mysql:(两个都可以使用)
exit
quit
2.5 MySQL数据模型
关系型数据库:
关系型数据库是使用具有行和列的表结构来存储数据的数据库
如下图,订单信息表
和 客户信息表
都是有行有列的二维表,我们将这样的称为关系型数据库。
接下来看关系型数据库的优点:
- 都是使用表结构,格式一致,易于维护。
- 使用通用的 SQL 语言操作,使用方便,可用于复杂查询。
- 关系型数据库都可以通过SQL进行操作,所以使用方便。
- 复杂查询。现在需要查询001号订单及对应的客户数据,我们可以看到该订单是1号客户的订单,而1号订单是李聪这个客户。
- 数据存储在磁盘中,安全。
数据模型:
如上图,我们通过客户端可以通过数据库管理系统创建数据库,在数据库中创建表,在表中添加数据。创建的每一个数据库对应到磁盘上都是一个文件夹。比如可以通过SQL语句创建一个数据库(数据库名称为db1),语句如下。该语句咱们后面会学习。
我们可以在数据库安装目录下的data目录下看到多了一个 db1
的文件夹。所以,在MySQL中一个数据库对应到磁盘上的一个文件夹。
而一个数据库下可以创建多张表,我们到MySQL中自带的mysql数据库的文件夹目录下:
而上图中右边的 db.frm
是存放表结构的文件,db.MYD
是存放表数据的文件,通过这两个文件就可以查询到数据展示成二维表的效果。
扩展阅读
MySQL中数据库的存储引擎不同,数据文件的后缀名也不同。主要用两种引擎,分别是MyISAM和InnoDB
MyISAM,其数据文件后缀名是MYD。
Inoodb,其数据文件后缀名是ibd.
小结:
- MySQL中可以创建多个数据库,每个数据库对应到磁盘上的一个文件夹
- 在每个数据库中可以创建多个表,每张都对应到磁盘上一个 frm 文件
- 每张表可以存储多条数据,数据会被存储到磁盘中 MYD 文件或ibd文件中
3, SQL概述
3.1 SQL简介
- 英文:Structured Query Language,简称 SQL
- 结构化查询语言,一门操作关系型数据库的编程语言
- 定义操作所有关系型数据库的统一标准
- 对于同一个需求,每一种数据库操作的方式可能存在一些不一样的地方,我们称为“方言”
3.2 通用语法
- SQL语句可以单行或多行书写,只要最后有分号结尾即可
上面这种是多行书写,单行书写也可:
有了;号才是一个完整的SQL语句
- MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
注释
单行注释:(MySQL特有)
1)— 注释内容(注意—后边要空格)
2)#注释内容
多行注释:/ 注释 /
2.3 SQL分类
- DDL(Data Definition Language) : 数据定义语言,用来定义数据库对象:数据库,表,列等
DDL简单理解就是用来操作数据库,表等
DML(Data Manipulation Language) 数据操作语言,用来对数据库中表的数据进行增删改.
DML简单理解就对表中数据进行增删改<br />![](https://cdn.nlark.com/yuque/0/2022/png/12486844/1648808494880-ea210b47-e522-4f77-ac12-6ef27c1b1fca.png?x-oss-process=image%2Fresize%2Cw_797%2Climit_0#crop=0&crop=0&crop=1&crop=1&from=url&id=wJuUF&margin=%5Bobject%20Object%5D&originHeight=382&originWidth=797&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)
DQL简单理解就是对数据进行查询操作。从数据库表中查询到我们想要的数据。- DCL(Data Control Language) 数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户
DCL简单理解就是对数据库进行权限控制。比如我让某一个数据库表只能让某一个用户进行操作等。
我们学习的是DML和DQL,这是平常最经常使用的
4, DDL:操作数据库
操作数据库主要就是对数据库的增删查操作。
4.1 查询
查询所有的数据库
SHOW DATABASES;
效果图:
除去db1 剩下的都是MySQL自带的数据库,这些数据库以后我们不要去动用。
4.2 创建数据库
- 创建数据库
效果图:CREATE DATABASE 数据库名称;
这种情况可能会报错,因为我们在创建的时候不知道db1数据库此时存不存在,若存在会报错
就会出现下图所示情况:
所以为了避免这种情况,我们应该在创建前先进行判断,如果不存在次数据库则创建
代码格式如下:
效果图:CREATE DATABASE IF NOT EXISTS 数据库名称;
此图中因为已经有了db1,所以第一次会出现警告(但没有报错),但是没有db2,所以第二次创建成功,最后查询所有数据库即可看到此时有db1和db2。
4.3 删除数据库
- 删除数据库
效果图:DROP DATABASE 数据库名称;
同样此时也有可能会报错,因为你不知道此时存不存在此数据库
因此删除数据库操作中我们也需要进行判断
代码如下:
因为此时是删除数据库,所以需要判断数据库存在DROP DATABASE IF EXISTS 数据库名称;
效果图:
4.4 使用数据库
- 使用数据库
当数据库建立好之后,我们就可以选择去使用,使用的代码是:
USE 数据库名称;
效果图:
- 查看当前使用的数据库
代码如下:
SELECT DATABAS();
效果图:
这个的意思是告知你,目前使用的是db1数据库。
5, DDL:操作表
操作表也就是对表进行增(Create)查(Retrieve)改(Update)删(Delete)。
5.1 查询表
- 查询当前数据库下的所有表名称
SHOW TABLES;
效果图:(这里因为db1没有包含任何表 所以用mysql数据库来演示)
- 查询表结构
代码如下:
DESC 表名称;
效果图:(此处查询的是mysql数据库中的func表的结构)
5.2 创建表
代码如下:(创建多种字段的)
CREATE TABLE 表名(
字段名1 数据类型1,
字段名2 数据类型2,
...
字段名n 数据类型n
);
这里面,每个字段写完后若还有下一个字段,需要用逗号隔开,最后一个不用。(加了会报错)
小练习:
创建一个下图样子的表:
答案代码:
create table tb_user(
id int,
username varchar(15),
password varchar(15)
);
这里面varchar是指十五个字符以内的就行,没有固定要求是15个,少了var,只有cahr的话固定要求了要15个字符
效果如下:
5.3 数据类型
MySQL中支持很多数据类型,总体上分为三类:
数值
tinyint : 小整数型,占一个字节
int : 大整数类型,占四个字节
eg : age int
double : 浮点类型
使用格式: 字段名 double(总长度,小数点后保留的位数)
eg : score double(5,2)
日期
date : 日期值。只包含年月日
eg :birthday date :
datetime : 混合日期和时间值。包含年月日时分秒
字符串
char : 定长字符串。
优点:存储性能高
缺点:浪费空间
eg : name char(10) 如果存储的数据字符个数不足10个,也会占10个的空间
varchar : 变长字符串。
优点:节约空间
缺点:存储性能底
eg : name varchar(10) 如果存储的数据字符个数不足10个,那就数据字符个数是几就占几个的空间
其余类型可以看工具中MySQL课程资料里面的MySQL数据类型的Excel文件。(在此处上传到本笔记中)
MySQL数据类型.xlsx
1)、length():mysql里面的length()函数是一个用来获取字符串长度的内置函数。
2)、char_length():在mysql内置函数里面查看字符串长度的还有一个函数是char_length()。
3)、这两个函数的区别是:
a)、length(): 单位是字节,utf8编码下,一个汉字三个字节,一个数字或字母一个字节。gbk编码下,一个汉字两个字节,一个数字或字母一个字节。
b)、char_length():单位为字符,不管汉字还是数字或者是字母都算是一个字符。
查看字符集的语句: show variables like 'character_set%';
示例:
在此演示length和char_length的区别,特此插入一条语句,该语句后边会详讲,目前了解即可。
在上图中,我向表中加入了 id为1,username为李四,password为lisi123的数据,
此时用char_length查询username时会查出两个字符,因为char_length查询出来的是字符,无论是什么都是一个字符,但是此时用length查询username出现的结果为6,因为length查询的是字节,一个汉字占用三个字节,数字和字母都是一个字节,所以结果会是6(2个汉字)。
同理,如果我们去查询password,结果就会是相同,如下图:
小练习:
题目:
需求:设计一张学生表,请注重数据类型、长度的合理性
1. 编号
2. 姓名,姓名最长不超过10个汉字
3. 性别,因为取值只有两种可能,因此最多一个汉字
4. 生日,取值为年月日
5. 入学成绩,小数点后保留两位
6. 邮件地址,最大长度不超过 64
7. 家庭联系电话,不一定是手机号码,可能会出现 - 等字符
8. 学生状态(用数字表示,正常、休学、毕业...)
答案:
代码如下:
create table student (
id int,
name varchar(10),
gender char(1),
birthday date,
score double(5,2),
email varchar(64),
tel varchar(20),
status tinyint
);
5.4 删除表
- 删除表代码:
同之前创建数据库的时候一样,此时你不确定是否有此表,所以需要进行判断,判断代码不变,在此处报错结果图我就不演示了。DROP TABLE 表名称;
效果图:DROP TABLE IF EXISTS 表名称;
删除后再次查看,表就只剩下了student表;
5.5 修改表
- 修改表名
代码:
ALTER TABLE 原表名 RENAME TO 新表名;
效果图:(把之前创建的student表名修改为stu)
- 添加一列
代码:
ALTER TABLE 表名 ADD 列名 数据类型;
效果图:(在stu表中添加新的一列地址address,该字段类型是varchar(50))
图中可以看到,第二个展示的表中是多了address,是刚刚我们用代码添加的列。
- 修改数据类型
代码:
ALTER TABLE 表名 MODIFY 列名 新数据类型;
效果图:(把我们刚刚创建的address列的数据类型修改为char)
通过上下两表的对比,可以发现address的数据类型已经发生了更改
tips:忽略上方的报错,此处报错是因为我在命令语句后多加了一个分号
- 修改列名和数据类型
如果要一次性修改列名以及他的数据类型,分开弄效率较低,可以直接一起修改。
代码:
ALTER TABLE 表名 CHANGE 列名 新列名 数据类型;
效果图:(把stu中address列修改表名为addr,以及把他的数据类型修改为varchar(30))
- 删除列
删除列的代码非常简单:
ALTER TABLE 表名 DROP 列名;
效果图:(把之前添加的addr列删除)
6, Navicat Premium的使用
上面我们写代码都是在cmd命令管理窗口写的,看起来非常不方便,且没有可视的图形界面,Navicat Premium就是一种可视界面。
6.1 安装
工具文件包中的MySQL课程资料中的MySQL软件包有该文件夹,点击exe文件安装即可,安装完就行破解。
双击红色框框进行安装,自行选择安装位置,安装好了之后,复制蓝色框框内的文件,建议和mysql文件装在同一目录下,我装在了D盘下。
破解方法:
破解文件说明:破解说明.txt
然后打开我们刚刚安装的文件包,即上面的红框框文件包,然后将刚刚复制的篮框文件直接粘贴到这里面就完成了破解。
6.2 使用
6.2.1 建立和mysql服务的连接
第一步:打开软件后,单机左上角的连接,选择MySQL。
第二步:连接名随意填写,密码要和自己mysql密码相同
连接好后左边会有这样的一串:
随后右键刚刚建立的连接,选择打开连接,当背景变绿说明连接已经打开
6.2.2 操作
- 修改表结构
通过下图操作修改表结构:
点击了设计表后即出现如下图所示界面,在图中红框中直接修改字段名,类型等信息:
- 编写SQL语句并执行
按照如下图所示进行操作即可书写SQL语句并执行sql语句。
7, DML
数据操作语言,用来对数据库中表的数据进行增删改, DML简单理解就对表中数据进行增删改。
DML主要是对数据进行增(insert)删(delete)改(update)操作。
7.1 添加数据
给指定列添加数据:
INSERT INTO 表名(列1,列2...) VALUES(值1,值2,...);
注意添加的有几列,value值就需要有几个,且是一一对应的。
效果图:(我们把tb_user中加入id为1 name为空的字段)
在此提醒,执行了选择之后,需要去表中刷新,否则数据不会出现。
刷新后的样子:给全部列插入数据:
INSERT INTO 表名 VALUES(值1,值2,值3,...);
tips:这里的值必须按照顺序添加,切把所有的值都要添加。
比如tb_user表中有两个字段,则这个代码就需要有2个值。
执行代码:
注意:此处郭嘉俊是字符串,在Navicat Premium中字符串使用单引号’’ 不是双引号
效果图:
- 批量添加数据
执行代码:INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
tips:这里面也可以批量添加指定数据,格式就和之前的指定数据添加一样,在表名后用小括号指定数据。
效果图:
练习:
为了掩饰操作是否成功,这里提供一个查询所有数据的代码:
select * from stu;
这里的*代表所有字段,这段代码代表从我们的stu表中查我们的所有字段。
效果图:
练习代码:
-- 给指定列添加数据
INSERT INTO stu (id, NAME) VALUES (1, '张三');
-- 给所有列添加数据,列名的列表可以省略的
INSERT INTO stu (id,NAME,gender,birthday,score,email,tel,STATUS) VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);
INSERT INTO stu VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);
-- 批量添加数据
INSERT INTO stu VALUES
(3,'李五','男','1999-11-11',88.88,'lisi@itmm.cn','13888888888',1),
(4,'李六','男','1999-11-11',88.88,'lisi@itmm.cn','13888888888',1),
(5,'李七','男','1999-11-11',88.88,'lisi@itmm.cn','13888888888',1);
效果图:(其中第六行代码没有执行,第六行代码是第四行代码的简写)
7.2 修改数据
- 修改表数据
代码格式:
UPDATE 表名 SET 列名1=值1,列名2=值2,...[WHERE 条件]
tips: 1.在这里面如果没有加条件,则默认为全部都修改。 2.[ ]中括号包围的语句说明可有可无,可以省略。
练习:
把stu表中name属性为张三的gender属性修改为女。
代码如下:
UPDATE stu SET gender='女' WHERE name='张三';
效果图:
将张三的生日改为 1999-12-12 分数改为99.99
代码如下:
UPDATE stu SET birthday='1999-12-12',score=99.9 WHERE name='张三';
效果图:
如果这些语句中没有where进行条件判定,则该语句会将表中的所有数据都进行修改,有了这个条件判定,则只会修改张三的数据。
例如如果输出这样的语句:
UPDATE stu SET gender='女';
则会变成下图这样:
上边的语句都执行完后,我们用刚刚提到的查询代码查询一下,出现的结果为:
7.3 删除数据
- 删除数据
代码如下:
DELETE FROM 表名 [WHERE 条件];
练习:
删除表中张三的数据
代码如下:
delete from stu where name='张三';
效果图:
删除stu的所有数据:
代码如下:
delete from stu;
效果图:
8, DQL
DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)
DQL简单理解就是对数据进行查询操作。从数据库表中查询到我们想要的数据。
先介绍一下DQL的查询语句:
代码如下:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定
为了下面的学习变得方便,我们先把刚刚的stu空表删除,重新建立一个自己需要用到的表。
1.删除stu表,代码如下:
DROP TABLE IF EXISTS stu;
运行完了之后,stu表就被删除了
2.建立一个新的stu表,数据有编号,姓名,年龄,性别,地址,数学成绩,英语成绩,入学时间。
代码如下:
CREATE TABLE stu(
id int,
name varchar(15),
age int,
sex varchar(2),
address varchar(25),
math double(5,2),
english double(5,2),
time date);
效果图:
3.为了使后边更方便,我需要添加一堆数据进去。
代码如下:
INSERT INTO stu VALUES(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
效果图:
准备好这些后,就开始开始之后的学习了
8.1 基础查询
8.1.1 语法
- 查询多个字段
代码如下:
SELECT 字段名称 FROM 表名; -- 查询对应的字段
SELECT * FROM 表名; -- 查询所有的字段
例子:
我们查询stu包中的name和age字段,代码如下:
select name,age from stu;
效果图:
查询所有字段,代码如下:
select * from stu;
效果图如下:
- 去除重复记录
去除重复记录的意思就是,只展示不同的结果,例如下面只查询sex,只会出现两个值,代码如下:SELECT DISTINCT 字段名称 FROM 表名;
效果图如下:select distinct sex from stu;
作为比较,此处把没有去除重复值的效果也展示出来:
由此可见,之后出现的重复值都没有显示。
作为拓展,这里研究一下,如果有两个字段的话,是怎么对待相同的这个含义的,为了使实验变得清晰可懂,这里特别加一行,与第一行是一模一样的。再添加一行,与第一行只有年龄不一样。此时的表显示为:
开始实验,代码如下:
select distinct name,age from stu;
显示的结果为:
再把不去除重复字段的展示出来:
通过对比可以发现,如果去除重复字段中有两个及以上的字段,则这几个字段必须都相同的时候,才会去除,否则会实现。
- 起别名
效果图:AS [AS也可以省略]
通过代码可得as可以省去,中间间隔空格就行,且展出出来的就会变成别名。
8.1.2 练习
- 查询name,age两列。
代码如下:
select name 姓名,age 年龄 from stu;
效果图:
- 查询所有列的数据,列名的列表可以使用*替代
代码如下:
select * from stu;
效果图:
- 去除重复字段
代码如下:
select distinct address from stu;
效果图:
- 查询姓名、数学成绩、英语成绩。并通过as给math和english起别名(as关键字可以省略)
代码如下:
select name,math 数学成绩,english 英语成绩 from stu;
效果图:
8.2 条件查询
8.2.1语法
代码如下:
select 字段列表 from 表名 where 条件列表;
条件列表图:
8.2.2 条件查询练习
以下练习都在db数据库的stu表中进行
- 查询年龄大于20岁的学院的信息
代码如下:
select * from stu where age>20;
效果图如下:
此处实验如果想只显示名字和年龄的话,
代码如下:
select name,age from stu where age>20;
效果如下:
由此可以看出,前边的字段列表是要显示的字段。
- 查询年龄大于等于20岁的学院信息
代码如下:
select * from stu where age>=20;
效果图:
- 查询年龄大于x岁,且小于y岁的学员全部信息。(3种写法) ``` select * from stu where age>=20 && age<=30;
select * from stu where age>=18 and age<=20;
select * from stu where age between 18 and 30;
接下来依次展示效果图:<br />&&:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649243182362-70d90247-9994-4ff2-99ad-1f26b8b21271.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=162&id=ua46cdda7&margin=%5Bobject%20Object%5D&name=image.png&originHeight=203&originWidth=646&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17537&status=done&style=none&taskId=u4bf81ca4-f5a6-4de8-a28b-3bb20d51973&title=&width=516.8)<br />and:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649243332961-19bb76da-f469-4cac-af5f-74682370c126.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=154&id=u893d88e9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=192&originWidth=618&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17230&status=done&style=none&taskId=u60c61a1d-eacb-432a-873a-e726bdd681f&title=&width=494.4)<br />between...and...:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649243335795-e43d46bc-ded9-4747-bbb5-4ddb88c3d551.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=173&id=u0519443a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=216&originWidth=614&originalType=binary&ratio=1&rotation=0&showTitle=false&size=19790&status=done&style=none&taskId=uc8296384-1951-4892-8ea8-f52c7183339&title=&width=491.2)
- 查询年龄为18或者22或者20岁的成员信息
代码如下:
select * from stu where age=18 or age=20 || age=22;
select * from stu where age in(18,20,22);
效果图:<br />or或者||:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649244379537-eb17a135-649a-46b9-8e3e-0581a05d8b6e.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=184&id=u4361639f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=230&originWidth=617&originalType=binary&ratio=1&rotation=0&showTitle=false&size=20149&status=done&style=none&taskId=u30da8a44-12ca-4fb0-8780-0797f50c535&title=&width=493.6)<br />in():<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649244419833-bd5c01cd-afca-4ee0-bd29-16d332b313e3.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=192&id=u49af9784&margin=%5Bobject%20Object%5D&name=image.png&originHeight=240&originWidth=647&originalType=binary&ratio=1&rotation=0&showTitle=false&size=20533&status=done&style=none&taskId=u06c32bff-2a8a-4193-b205-16f18787512&title=&width=517.6)
- 查找英语成绩为null和不为null的成员信息
这里不能用=和!=来写,需要用is null和is not null来写<br />代码如下:
— 查找英语成绩为null的成员信息 select * from stu where english is null;
— 查找英语成绩不为null的成员信息 select * from stu where english is not null;
效果图:<br />英语成绩为null:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649244588711-84d90e2c-ead1-4422-acb4-6282e1f93834.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=114&id=u365566f1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=142&originWidth=615&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10999&status=done&style=none&taskId=ue22fad49-c371-4cb8-9b16-4df78950884&title=&width=492)<br />英语成绩不为null:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649244617616-d7521575-b2eb-4ce9-885e-1805c474a335.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=240&id=u05ba30f6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=300&originWidth=627&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27865&status=done&style=none&taskId=u96f38d65-ae66-47ca-aa36-41bf7fc4dce&title=&width=501.6)
其余课件上的练习都可以用上面的几个测试实现,就不一一演示了。
<a name="dbOG3"></a>
### 8.2.3 模糊查询练习
模糊查询的关键字是like,他有两种占位的通配符(_ 和 %)
1. _ 是单个任意字符。(意思是只占一位)
1. %是任意数量的字符。 (意思是可以任意占位)
接下来用代码演示一下这两个占位符以及模糊查询。对此,我先将所有的学员信息查询出来:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649244976033-16fea646-f435-4fda-9a10-ea9c10770c8f.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=252&id=u5190ddfe&margin=%5Bobject%20Object%5D&name=image.png&originHeight=315&originWidth=617&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29369&status=done&style=none&taskId=u239258a3-36b0-4d4f-b039-4d2e9ca5116&title=&width=493.6)
- 查询姓'马'的学员信息(%通配符)
代码如下:
select * from stu where name like ‘马%’;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649244928855-37bd3fa8-3f0c-43b7-88df-3f0de2f3f508.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=166&id=u8c23e978&margin=%5Bobject%20Object%5D&name=image.png&originHeight=208&originWidth=622&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16884&status=done&style=none&taskId=u9bc3d7d6-2e4f-4ba1-8bf5-78160cadbda&title=&width=497.6)
- 查询第二个字为'花'的学员信息:(_ %通配符)
代码如下:
select * from stu where name like ‘_花%’;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649245071204-01265426-d1dc-4720-b2ab-39f4361ebb69.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=115&id=u66730181&margin=%5Bobject%20Object%5D&name=image.png&originHeight=144&originWidth=637&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11294&status=done&style=none&taskId=u3321e252-00c8-49f9-815d-026177ce309&title=&width=509.6)
为了使结果变得明显,这里我手动向图表里添加一行这个数据:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649245111240-e18f7625-a9eb-4865-93e0-d8d795917773.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=38&id=u4f4acac2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=47&originWidth=461&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26068&status=done&style=none&taskId=uccf94a06-87d9-436f-b88a-932f8e69b6e&title=&width=368.8)
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649245296284-788165c5-f4db-45ba-9d4e-67e105716fc9.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=118&id=ufc462411&margin=%5Bobject%20Object%5D&name=image.png&originHeight=147&originWidth=620&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11424&status=done&style=none&taskId=u43fcb8d2-a893-4c40-a262-b8203580ed0&title=&width=496)<br />可见_ 通配符占据了一个字符,所以第一个字为花的花无缺并没有被查找出来。
- 查找名字中带花的学员信息(无论花在哪个位置):
代码如下:
select * from stu where name like ‘%花%’;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649246311722-0de74080-9675-4c7f-997e-db1199d7c034.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=158&id=u55e1aeed&margin=%5Bobject%20Object%5D&name=image.png&originHeight=197&originWidth=632&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17200&status=done&style=none&taskId=u0206ea96-c356-42bb-a33a-76873e8f78e&title=&width=505.6)
<a name="iVU6T"></a>
## 8.3 排序查询
<a name="yrlYN"></a>
### 8.3.1 语法
代码如下:
select 需要查询的字段名称 from 表名称 order by 排序字段名[排序方式1],排序字段名[排序方式2],排序字段名[排序方式3]…;
> 排序方法有两种:
> ASC:升序排序(默认的,可以不写,不写的时候就是升序排序)
> DESC: 降序排序
> 只有第一个排序条件相同时才会使用第二个排序条件。
<a name="mYB56"></a>
### 8.3.2 练习
- 查询学生信息,按照年龄升序排序
select * from stu order by age ASC;
select * from stu order by age;
效果图:<br />使用ASC:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649246329574-573920fd-4205-4640-a015-ac5e1be1964e.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=272&id=u6ddbd7c8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=340&originWidth=611&originalType=binary&ratio=1&rotation=0&showTitle=false&size=32192&status=done&style=none&taskId=uaac9b6ef-7ece-4bc6-8cd4-be00970c042&title=&width=488.8)<br />不使用ASC:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649246376640-4bad5675-b39a-4840-b9a6-b2abe7641ecd.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=275&id=uce833896&margin=%5Bobject%20Object%5D&name=image.png&originHeight=344&originWidth=629&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33264&status=done&style=none&taskId=uc2bbace6-9f26-4966-8fce-1763c14b3ac&title=&width=503.2)<br />两图对比,可发现 ASC为默认值,不写出来并没有影响。
- 查询学生信息,按照年龄降序排序(必须写DESC)
代码如下:
select * from stu order by age desc;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649246689729-11310001-2ecd-4cad-9bf7-779120c41c8c.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=275&id=ud6618c8f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=344&originWidth=604&originalType=binary&ratio=1&rotation=0&showTitle=false&size=32225&status=done&style=none&taskId=u2701bf30-88e3-41cb-83d5-042fb127d41&title=&width=483.2)
- 先按数学成绩降序排序,数学成绩一样时,按英语成绩升序排序
代码如下:
select * from stu order by math desc,english;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649246842463-25b4f527-cca2-4dca-bc1f-3c741de04182.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=273&id=uc91b9de9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=341&originWidth=667&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35141&status=done&style=none&taskId=ua2796adb-abc5-4cfb-ba4b-bcf35f174cd&title=&width=533.6)
- 先按数学成绩降序排序,数学成绩一样时,按英语成绩升序排序,英语成绩相同,按照年龄升序排序。
代码如下:
select * from stu order by math desc,english,age;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649247123932-68583fe9-0e96-4bd4-a25d-8bad80da4a04.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=274&id=ucd6af0e3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=343&originWidth=620&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35345&status=done&style=none&taskId=uea3205d5-4885-4e75-bbe3-c9f9dc0388d&title=&width=496)
<a name="PBM4O"></a>
### 8.3.3 拓展知识
把条件查询和排序查询结合在一起<br />例如:查询年龄大于20岁的女生且按照英语成绩降序排序。<br />代码如下:
select * from stu where age>20,sex=’女’ order by english desc;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649249569232-b0e0d385-44eb-4456-b48a-75161ac15fed.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=130&id=u05b4f345&margin=%5Bobject%20Object%5D&name=image.png&originHeight=163&originWidth=682&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15017&status=done&style=none&taskId=uaaee770c-8511-43e1-bc41-019d644eef9&title=&width=545.6)
<a name="AN1z6"></a>
## 8.4 聚合函数
将一列数据作为一个整体,进行纵向计算。<br />现在将表格的第九项刚刚自己添加的去掉,图变为:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649249113398-3c8c4fe2-051c-4852-9c7c-fed7cbcff1c2.png#clientId=uf891536f-c758-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=210&id=uddb1ac8c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=262&originWidth=699&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29243&status=done&style=none&taskId=ub3281686-cbf2-4f46-8473-3d89a464039&title=&width=559.2)
<a name="h2U3o"></a>
### 8.4.1 聚合函数分类
| 函数名 | 功能 |
| --- | --- |
| count(列名) | 统计个数,数量(一般选用不为null的列) |
| max(列名) | 求最大值 |
| min(列名) | 求最小值 |
| sum(列名) | 求和值 |
| avg(列名) | 求平均值 |
<a name="dmHIu"></a>
### 8.4.2 聚合函数的语法
代码如下:
select 聚合函数名称(列名称) from 表;
注意:null值不参与所有的聚合函数,等下会演示。
<a name="O3imD"></a>
### 8.4.3 练习
- 统计学生的总数
代码如下
select count(id) 总学生数量 from stu;
select count(english) 总学生数量 from stu;
效果图:<br />使用id查看:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649249795740-a0877fc0-3167-4ab1-a170-306c46c9e60e.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=112&id=uca3c6251&margin=%5Bobject%20Object%5D&name=image.png&originHeight=140&originWidth=438&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7174&status=done&style=none&taskId=uc57beaba-8ebc-4519-ac89-0ffed63abfd&title=&width=350.4)<br />使用english查看:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649249829632-fa9d587c-21ac-4cff-aeec-28b09040dd31.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=112&id=u4eeecb8f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=140&originWidth=495&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7638&status=done&style=none&taskId=u4887848d-5bf4-447f-97db-4653500bf50&title=&width=396)
两图对比发现,总共有八个学生,但是用英语成绩查看的时候只有七个,那是因为有个女学生的英语成绩为null,null不参与所有的聚合函数,所以会少一个,因此使用count统计数量的时候要用没有null的一列,或者使用*,只要其中一列有值时就会统计一个.<br />代码如下:
select count(*) 总学生数量 from stu;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649249941963-efac0892-ca1a-4304-8cbf-5cf3bf9f4cc1.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=105&id=u5b56a736&margin=%5Bobject%20Object%5D&name=image.png&originHeight=131&originWidth=442&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6938&status=done&style=none&taskId=u31b8e8e7-96c8-4a4a-9163-4772c645c93&title=&width=353.6)
- 统计数学的最高分和最低分
代码如下:
select max(math) 数学最高分 from stu;
select min(math) 数学最低分 from stu;
select max(math) 数学最高分,min(math) 数学最低分 from stu;
效果图:<br />他们也可以一起混着用,这里就直接显示一起混着用的结果图<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649250110959-ef0666a1-c337-418f-8f72-093507a406f3.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=106&id=u866c71b6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=133&originWidth=632&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9834&status=done&style=none&taskId=u2730ed47-3333-4b0d-bbc4-a8afe7fe53c&title=&width=505.6)
- 计算所有同学的英语成绩的总和
代码如下:
select sum(english) 英语所有人总分 from stu;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649250191530-3dd86ae8-7c66-4319-8047-6649c9806f29.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=106&id=ue2e293f2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=133&originWidth=539&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8300&status=done&style=none&taskId=u4f78a90d-7f79-40bb-bedb-8f0807696e4&title=&width=431.2)
拓展:也可以使用我们数学里面的加减法<br />计算所有同学的英语和数学的总分<br />代码如下:
select sum(english+math) 所有人两科总分 from stu;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649250285124-ba83e864-6aef-46f4-bed5-c4b6cf9dbe94.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=110&id=u485d74fc&margin=%5Bobject%20Object%5D&name=image.png&originHeight=138&originWidth=531&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8764&status=done&style=none&taskId=u11fdb65a-8886-438c-8e05-41b4f9fa05d&title=&width=424.8)
- 计算所有人的数学平均分
代码如下:
select avg(math) 所有人数学平均分 from stu;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649250358734-a2d45863-a1c6-46bd-82bb-6d7e67a9b7d5.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=110&id=u771ebc35&margin=%5Bobject%20Object%5D&name=image.png&originHeight=137&originWidth=483&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8176&status=done&style=none&taskId=uc2fc6e7e-7bf8-40a6-9d4f-fe63ad0e782&title=&width=386.4)
tips:<br />avg和sum只能操作数值型和浮点小数型的列,因为他们是计算值的操作,用非数值型或者浮点小数型出现的结果有问题.<br />例如:<br />代码如下:
select sum(name) from stu;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649250457966-6de2b54c-ca30-4bde-8869-6f28765faaa2.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=111&id=u09a0bb36&margin=%5Bobject%20Object%5D&name=image.png&originHeight=139&originWidth=324&originalType=binary&ratio=1&rotation=0&showTitle=false&size=5722&status=done&style=none&taskId=u181debe8-c9ab-4c0f-8fe6-5303880e5f3&title=&width=259.2)<br />出现的结果是0,因为他们不是数值型.
<a name="JoU8M"></a>
## 8.5 分组查询
<a name="Ongb3"></a>
### 8.5.1 语法
select 字段列表 from 表名[where 分组前条件] group by 分组字段名 [having 分组后条件过滤]
> 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
<a name="iV4WZ"></a>
### 8.5.2 练习
- 查询男生女生各自的数学平均分
代码如下:
select sex,avg(math) from stu group by sex;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649250750533-3eb60f46-58be-4b36-a958-3bc1f25811f1.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=135&id=u0893d4e8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=169&originWidth=527&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8875&status=done&style=none&taskId=udaba8e19-19c3-4775-a874-c8889fb0436&title=&width=421.6)
- 查询男生女生各自的数学平均分以及各组人数(数学成绩低于70分的不计入),
代码如下:
select sex,avg(math),count(id) from stu where math>=70 group by sex;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649250969247-20e3681f-7704-41da-be87-0307031f3473.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=138&id=u81efe66c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=172&originWidth=692&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11423&status=done&style=none&taskId=u9e58b306-1ec5-45d8-b110-2d8f41aae25&title=&width=553.6)
- 查询男生女生各自的数学平均分以及各组人数(数学成绩低于70分的不计入),并且分组后小于2个的不展示.
代码如下:
select sex,avg(math),count(id) from stu where math>=70 group by sex having count(*)>2;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649251073583-39c5e50c-f8d3-4dcd-a328-c3f2a1b106ae.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=107&id=ud2844918&margin=%5Bobject%20Object%5D&name=image.png&originHeight=134&originWidth=851&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11294&status=done&style=none&taskId=u3687e302-b051-4e36-af0e-a22e5382c45&title=&width=680.8)
对比这个实验和上个实验,可以发现having和where的差别:<br />where是在分组之前就进行了排除,同时where不能对聚合函数进行判断<br />having是在分组之后才进行删选。
额外的区别:<br />where不能使用别名,但是having可以使用别名<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649251400143-6f908c1e-e784-4ac0-87f3-353623c90f98.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=174&id=u27dd882f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=218&originWidth=833&originalType=binary&ratio=1&rotation=0&showTitle=false&size=21230&status=done&style=none&taskId=ubf100792-226c-476a-a3a0-55339d24ee4&title=&width=666.4)
<a name="vnsCE"></a>
## 8.6 分页查询
就是把数据分成一页一页的查询,可以自定义一页有几个数据,也可以选择从第几个数据开始看,**索引从0开始**。
<a name="R0Mg5"></a>
### 8.6.1 语法
代码如下:
select 字段列表 from 表名 limit 起始索引,查询的条目数;
<a name="ywDCw"></a>
### 8.6.2 练习
- 从0开始,查看2个数据
代码如下:
select * from stu limit 0,2;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649251653830-79eb9b4a-6ac3-4d8f-8a6c-f0583ff07e01.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=136&id=u9ee3f334&margin=%5Bobject%20Object%5D&name=image.png&originHeight=170&originWidth=607&originalType=binary&ratio=1&rotation=0&showTitle=false&size=12869&status=done&style=none&taskId=uef057615-168e-4e42-ac2b-4f1a050a380&title=&width=485.6)
- 查看三条数据,查看第二页
因为第二页是从第四个数据开始,所以索引是3.<br />代码如下:
select * from stu limit 3,3;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649251735750-b6cf55d7-3da6-4c4c-92df-8669a785b3b9.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=163&id=u320e50c1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=204&originWidth=656&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16641&status=done&style=none&taskId=ud7e86b0d-b3e0-4784-b591-f1b79866b79&title=&width=524.8)
- 每页四条数据,查看第二页
代码如下:
select * from stu limit 4,4;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649251828440-c9c8c68d-a4fc-446b-a808-ed033322b008.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=186&id=ua58983ec&margin=%5Bobject%20Object%5D&name=image.png&originHeight=233&originWidth=629&originalType=binary&ratio=1&rotation=0&showTitle=false&size=19496&status=done&style=none&taskId=u0e6f4bae-96df-42b4-aa90-d009d91102b&title=&width=503.2)
也可以不需要按照指定的页顺序,比如
- 查看六条数据,从第二个人开始看
因为第二个人的索引是1,所以代码如下:
select * from stu limit 1,6;
效果图:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27355090/1649251922253-2fc2f5dc-855f-4cef-b75f-39cbcb2af205.png#clientId=ucea0c8eb-36f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=224&id=u79f56b84&margin=%5Bobject%20Object%5D&name=image.png&originHeight=280&originWidth=631&originalType=binary&ratio=1&rotation=0&showTitle=false&size=24823&status=done&style=none&taskId=u5d16d579-f4d5-423f-85cc-4eb5c39cff8&title=&width=504.8)
如果要确定按照页数来看,你要确定第几页的第一个索引是什么,可以用以下公式:
起始索引 = 每页显示的数目*(当前页 - 1) ```