1, 数据库的相关概念

以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊端。

如果说文件中存储的是以下这种数据:

  1. 姓名 年龄 性别 住址
  2. 张三 18 联合路1
  3. 李四 19 联合路2
  4. 王五 20 联合路3

如果说现在我们需要把李四的性别改为女的话,通过我们之前学习的IO流操作,我们需要把现存的数据读取到内存当中,然后我们进行修改,随后把修改好了的数据再次存储到文件中。这样的方法存在很大的问题,比如说当文件很大时,内存就无法存储这么大的数据。

如果说我们需要既能持久化存储数据,也要能避免上述问题的技术使用在我们的系统中。那么数据库就是这样的技术。

1.1 数据库

  • 存储和管理数据的仓库,数据是有组织的进行存储。
  • 数据库英文名是 DataBase,简称DB

数据库就是把数据存储在硬盘上,这样子达到持久化存储的效果。解决这种办法的方法就是使用数据库管理系统。

1.2 数据库管理系统

  • 管理数据库的大型软件
  • 英文:DataBase Management System,简称 DBMS

mysql核心技术1 - 图1
图片所示就是 数据库管理系统 和 数据库 的关系。

1.3 常见的数据库管理系统

  • Oracle:收费的大型数据库,Oracle 公司的产品
  • MySQL: 开源免费的中小型数据库。后来 Sun公司收购了 MySQL,而 Sun 公司又被 Oracle 收购
  • SQL Server:MicroSoft 公司收费的中型的数据库。C#等语言常使用
  • PostgreSQL:开源免费中小型的数据库
  • DB2:IBM 公司的大型收费数据库产品
  • SQLite:嵌入式的微型数据库。如:作为 Android 内置数据库
  • MariaDB:开源免费中小型的数据库

本次学习的是MySQL数据库管理系统。但是不需要担心不会其他的管理系统,因为这些管理系统都是依靠(SQL)编程语言来实现的。
mysql核心技术1 - 图2

1.4 SQL


  • 英文:Structured Query Language,简称 SQL,结构化查询语言
  • 操作关系型数据库的编程语言
  • 定义操作所有关系型数据库的统一标准,可以使用SQL操作所有的关系型数据库管理系统,以后工作中如果使用到了其他的数据库管理系统,也同样的使用SQL来操作。

2, MySQL


2.1 MySQL安装

安装很简单,笔记中不详讲,忘记了安装,观看视频MySQL的01.
下载链接:https://downloads.mysql.com/archives/community/

mysql核心技术1 - 图3
下载完后进行解压:
mysql核心技术1 - 图4

2.2 MySQL的卸载

第一步打开命令窗口(cmd)
1.然后输入 net stop mysql ,回车。

  1. net stop mysql

2.在输入 mysqld -remove mysql , 回车。

  1. mysqld -remove mysql

3.删除MySQL的目录以及环境变量。
完成卸载。

2.3 MySQL配置环境变量


2.3.1 添加环境变量

右键 此电脑 -> 属性 , 点击 高级系统设置
image.png
点击 环境变量

在 系统变量 中新建一个MySQL_HOME,变量值是自己mysql所在的目录
image.png
在 系统变量 中找到 Path 并双击,新建立一个环境变量,变量值 %MYSQL_HOME%\bin
%为引用,后边的\bin是指这个文件夹。
建立这个环境变量主要是能在cmd中直接使用。
image.png

右键开始菜单(就是屏幕左下角),选择命令提示符(管理员),打开黑框,敲入mysql,回车。
如果提示Can't connect to MySQL server on 'localhost'则证明添加成功;
如果提示mysql不是内部或外部命令,也不是可运行的程序或批处理文件则表示添加失败,请重新检查步骤并重试。

如果使用mysql命令时报缺少dll文件的错误,如下:
image.png
说明当前系统缺少dll文件,我们需要在系统上把C++环境装好,直接运行课程资料里的”vcredist_x64.exe“,
等安装好后重新打开命令界面。再次执行mysql命令。

2.3.2 新建配置文件

新建一个文本文件txt,内容如下:

  1. [mysql]
  2. default-character-set=utf8
  3. [mysqld]
  4. character-set-server=utf8
  5. default-storage-engine=INNODB
  6. 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目录生成。

  1. mysqld --initialize-insecure

tips:如果出现如下错误
mysql核心技术1 - 图9
是由于权限不足导致的,则需要用管理员方式运行 cmd.exe

2.3.4 注册MySQL服务

在黑框里敲入mysqld -install,回车。

  1. mysqld -install

则注册完毕,电脑上此时已经安装好了MySQL服务。

2.3.5 启动MySQL服务

在命令黑窗口里敲入net start mysql,回车。

  1. net start mysql // 启动mysql服务
  2. 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>,则登录成功。

  1. mysql -uroot -p108113

image.png

登录参数:

  1. mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)

退出

退出mysql:(两个都可以使用)

  1. exit
  2. quit

2.5 MySQL数据模型

关系型数据库:

关系型数据库是使用具有行和列的表结构来存储数据的数据库

如下图,订单信息表客户信息表 都是有行有列的二维表,我们将这样的称为关系型数据库。

image.png
接下来看关系型数据库的优点:

  • 都是使用表结构,格式一致,易于维护。
  • 使用通用的 SQL 语言操作,使用方便,可用于复杂查询。
    • 关系型数据库都可以通过SQL进行操作,所以使用方便。
    • 复杂查询。现在需要查询001号订单及对应的客户数据,我们可以看到该订单是1号客户的订单,而1号订单是李聪这个客户。
  • 数据存储在磁盘中,安全。

数据模型:

image.png

如上图,我们通过客户端可以通过数据库管理系统创建数据库,在数据库中创建表,在表中添加数据。创建的每一个数据库对应到磁盘上都是一个文件夹。比如可以通过SQL语句创建一个数据库(数据库名称为db1),语句如下。该语句咱们后面会学习。
image.png
我们可以在数据库安装目录下的data目录下看到多了一个 db1 的文件夹。所以,在MySQL中一个数据库对应到磁盘上的一个文件夹。

而一个数据库下可以创建多张表,我们到MySQL中自带的mysql数据库的文件夹目录下:

image.png

而上图中右边的 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语句可以单行或多行书写,只要最后有分号结尾即可

image.png
上面这种是多行书写,单行书写也可:
image.png
有了;号才是一个完整的SQL语句

  • MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。

注释
单行注释:(MySQL特有)
1)— 注释内容(注意—后边要空格)
image.png
2)#注释内容
image.png

多行注释:/ 注释 /

2.3 SQL分类


  • DDL(Data Definition Language) : 数据定义语言,用来定义数据库对象:数据库,表,列等
    DDL简单理解就是用来操作数据库,表等

mysql核心技术1 - 图19

  • DML(Data Manipulation Language) 数据操作语言,用来对数据库中表的数据进行增删改.

    1. 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 查询

查询所有的数据库

  1. SHOW DATABASES;

效果图:
image.png

除去db1 剩下的都是MySQL自带的数据库,这些数据库以后我们不要去动用。

4.2 创建数据库


  • 创建数据库
    1. CREATE DATABASE 数据库名称;
    效果图:
    mysql核心技术1 - 图21
    这种情况可能会报错,因为我们在创建的时候不知道db1数据库此时存不存在,若存在会报错
    就会出现下图所示情况:
    image.png
    所以为了避免这种情况,我们应该在创建前先进行判断,如果不存在次数据库则创建
    代码格式如下:
    1. CREATE DATABASE IF NOT EXISTS 数据库名称;
    效果图:
    image.png
    此图中因为已经有了db1,所以第一次会出现警告(但没有报错),但是没有db2,所以第二次创建成功,最后查询所有数据库即可看到此时有db1和db2。

4.3 删除数据库


  • 删除数据库
    1. DROP DATABASE 数据库名称;
    效果图:
    image.png
    同样此时也有可能会报错,因为你不知道此时存不存在此数据库
    因此删除数据库操作中我们也需要进行判断
    代码如下:
    1. DROP DATABASE IF EXISTS 数据库名称;
    因为此时是删除数据库,所以需要判断数据库存在
    效果图:
    image.png

4.4 使用数据库


  • 使用数据库

当数据库建立好之后,我们就可以选择去使用,使用的代码是:

  1. USE 数据库名称;

效果图:
image.png

  • 查看当前使用的数据库

代码如下:

  1. SELECT DATABAS();

效果图:
image.png
这个的意思是告知你,目前使用的是db1数据库。

5, DDL:操作表

操作表也就是对表进行增(Create)查(Retrieve)改(Update)删(Delete)。

5.1 查询表


  • 查询当前数据库下的所有表名称
  1. SHOW TABLES;

效果图:(这里因为db1没有包含任何表 所以用mysql数据库来演示)
image.png

  • 查询表结构

代码如下:

  1. DESC 表名称;

效果图:(此处查询的是mysql数据库中的func表的结构)
image.png

5.2 创建表

代码如下:(创建多种字段的)

  1. CREATE TABLE 表名(
  2. 字段名1 数据类型1
  3. 字段名2 数据类型2
  4. ...
  5. 字段名n 数据类型n
  6. );

这里面,每个字段写完后若还有下一个字段,需要用逗号隔开,最后一个不用。(加了会报错)

小练习:
创建一个下图样子的表:
mysql核心技术1 - 图30

答案代码:

  1. create table tb_user(
  2. id int,
  3. username varchar(15),
  4. password varchar(15)
  5. );

这里面varchar是指十五个字符以内的就行,没有固定要求是15个,少了var,只有cahr的话固定要求了要15个字符

效果如下:
image.pngimage.png

5.3 数据类型


MySQL中支持很多数据类型,总体上分为三类:

  • 数值

    1. tinyint : 小整数型,占一个字节
    2. int 大整数类型,占四个字节
    3. eg age int
    4. double 浮点类型
    5. 使用格式: 字段名 double(总长度,小数点后保留的位数)
    6. eg score double(5,2)
  • 日期

    1. date 日期值。只包含年月日
    2. eg birthday date
    3. datetime 混合日期和时间值。包含年月日时分秒
  • 字符串

    1. char 定长字符串。
    2. 优点:存储性能高
    3. 缺点:浪费空间
    4. eg name char(10) 如果存储的数据字符个数不足10个,也会占10个的空间
    5. varchar 变长字符串。
    6. 优点:节约空间
    7. 缺点:存储性能底
    8. eg name varchar(10) 如果存储的数据字符个数不足10个,那就数据字符个数是几就占几个的空间

其余类型可以看工具中MySQL课程资料里面的MySQL数据类型的Excel文件。(在此处上传到本笔记中)
MySQL数据类型.xlsx

  1. 1)、length():mysql里面的length()函数是一个用来获取字符串长度的内置函数。
  2. 2)、char_length():在mysql内置函数里面查看字符串长度的还有一个函数是char_length()。
  3. 3)、这两个函数的区别是:
  4.  a)、length(): 单位是字节,utf8编码下,一个汉字三个字节,一个数字或字母一个字节。gbk编码下,一个汉字两个字节,一个数字或字母一个字节。
  5.  b)、char_length():单位为字符,不管汉字还是数字或者是字母都算是一个字符。
  6. 查看字符集的语句: show variables like 'character_set%';

示例:
在此演示length和char_length的区别,特此插入一条语句,该语句后边会详讲,目前了解即可。
image.png
在上图中,我向表中加入了 id为1,username为李四,password为lisi123的数据,
此时用char_length查询username时会查出两个字符,因为char_length查询出来的是字符,无论是什么都是一个字符,但是此时用length查询username出现的结果为6,因为length查询的是字节,一个汉字占用三个字节,数字和字母都是一个字节,所以结果会是6(2个汉字)。
同理,如果我们去查询password,结果就会是相同,如下图:
image.png

小练习:
题目:

  1. 需求:设计一张学生表,请注重数据类型、长度的合理性
  2. 1. 编号
  3. 2. 姓名,姓名最长不超过10个汉字
  4. 3. 性别,因为取值只有两种可能,因此最多一个汉字
  5. 4. 生日,取值为年月日
  6. 5. 入学成绩,小数点后保留两位
  7. 6. 邮件地址,最大长度不超过 64
  8. 7. 家庭联系电话,不一定是手机号码,可能会出现 - 等字符
  9. 8. 学生状态(用数字表示,正常、休学、毕业...)

答案:
代码如下:

  1. create table student (
  2. id int,
  3. name varchar(10),
  4. gender char(1),
  5. birthday date,
  6. score double(5,2),
  7. email varchar(64),
  8. tel varchar(20),
  9. status tinyint
  10. );

image.png

5.4 删除表

  • 删除表代码:
    1. DROP TABLE 表名称;
    同之前创建数据库的时候一样,此时你不确定是否有此表,所以需要进行判断,判断代码不变,在此处报错结果图我就不演示了。
    1. DROP TABLE IF EXISTS 表名称;
    效果图:
    image.png
    删除后再次查看,表就只剩下了student表;
    image.png

5.5 修改表

  • 修改表名

代码:

  1. ALTER TABLE 原表名 RENAME TO 新表名;

效果图:(把之前创建的student表名修改为stu)
image.png

  • 添加一列

代码:

  1. ALTER TABLE 表名 ADD 列名 数据类型;

效果图:(在stu表中添加新的一列地址address,该字段类型是varchar(50))
image.png
图中可以看到,第二个展示的表中是多了address,是刚刚我们用代码添加的列。

  • 修改数据类型

代码:

  1. ALTER TABLE 表名 MODIFY 列名 新数据类型;

效果图:(把我们刚刚创建的address列的数据类型修改为char)
image.png
通过上下两表的对比,可以发现address的数据类型已经发生了更改

tips:忽略上方的报错,此处报错是因为我在命令语句后多加了一个分号


  • 修改列名和数据类型

如果要一次性修改列名以及他的数据类型,分开弄效率较低,可以直接一起修改。
代码:

  1. ALTER TABLE 表名 CHANGE 列名 新列名 数据类型;

效果图:(把stu中address列修改表名为addr,以及把他的数据类型修改为varchar(30))
image.png

  • 删除列

删除列的代码非常简单:

  1. ALTER TABLE 表名 DROP 列名;

效果图:(把之前添加的addr列删除)
image.png

6, Navicat Premium的使用

上面我们写代码都是在cmd命令管理窗口写的,看起来非常不方便,且没有可视的图形界面,Navicat Premium就是一种可视界面。

6.1 安装

工具文件包中的MySQL课程资料中的MySQL软件包有该文件夹,点击exe文件安装即可,安装完就行破解。
image.png

image.png
双击红色框框进行安装,自行选择安装位置,安装好了之后,复制蓝色框框内的文件,建议和mysql文件装在同一目录下,我装在了D盘下。
image.png
破解方法:
破解文件说明:破解说明.txt
然后打开我们刚刚安装的文件包,即上面的红框框文件包,然后将刚刚复制的篮框文件直接粘贴到这里面就完成了破解。

6.2 使用

6.2.1 建立和mysql服务的连接

第一步:打开软件后,单机左上角的连接,选择MySQL。
mysql核心技术1 - 图46

第二步:连接名随意填写,密码要和自己mysql密码相同
image.png
连接好后左边会有这样的一串:
image.png
随后右键刚刚建立的连接,选择打开连接,当背景变绿说明连接已经打开
image.png

6.2.2 操作


  • 修改表结构

通过下图操作修改表结构:

image.png

点击了设计表后即出现如下图所示界面,在图中红框中直接修改字段名,类型等信息:

image.png

  • 编写SQL语句并执行

按照如下图所示进行操作即可书写SQL语句并执行sql语句。

image.png

7, DML

数据操作语言,用来对数据库中表的数据进行增删改, DML简单理解就对表中数据进行增删改。
DML主要是对数据进行增(insert)删(delete)改(update)操作。

7.1 添加数据


  • 给指定列添加数据:

    1. INSERT INTO 表名(列1,列2...) VALUES(值1,值2,...);

    注意添加的有几列,value值就需要有几个,且是一一对应的。
    效果图:(我们把tb_user中加入id为1 name为空的字段)
    image.png
    在此提醒,执行了选择之后,需要去表中刷新,否则数据不会出现。
    image.png
    刷新后的样子:
    image.png

  • 给全部列插入数据:

    1. INSERT INTO 表名 VALUES(值1,值2,值3,...);

    tips:这里的值必须按照顺序添加,切把所有的值都要添加。
    比如tb_user表中有两个字段,则这个代码就需要有2个值。
    执行代码:
    image.png
    注意:此处郭嘉俊是字符串,在Navicat Premium中字符串使用单引号’’ 不是双引号

效果图:
image.png

  • 批量添加数据
    1. INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
    2. INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
    执行代码:
    image.png
    tips:这里面也可以批量添加指定数据,格式就和之前的指定数据添加一样,在表名后用小括号指定数据。

效果图:
image.png

练习:
为了掩饰操作是否成功,这里提供一个查询所有数据的代码:

  1. select * from stu;

这里的*代表所有字段,这段代码代表从我们的stu表中查我们的所有字段。
效果图:
image.png
练习代码:

  1. -- 给指定列添加数据
  2. INSERT INTO stu (id, NAME) VALUES (1, '张三');
  3. -- 给所有列添加数据,列名的列表可以省略的
  4. INSERT INTO stu (id,NAME,gender,birthday,score,email,tel,STATUS) VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);
  5. INSERT INTO stu VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);
  6. -- 批量添加数据
  7. INSERT INTO stu VALUES
  8. (3,'李五','男','1999-11-11',88.88,'lisi@itmm.cn','13888888888',1),
  9. (4,'李六','男','1999-11-11',88.88,'lisi@itmm.cn','13888888888',1),
  10. (5,'李七','男','1999-11-11',88.88,'lisi@itmm.cn','13888888888',1);

效果图:(其中第六行代码没有执行,第六行代码是第四行代码的简写)
image.png

7.2 修改数据

  • 修改表数据

代码格式:

  1. UPDATE 表名 SET 列名1=值1,列名2=值2,...[WHERE 条件]

tips: 1.在这里面如果没有加条件,则默认为全部都修改。 2.[ ]中括号包围的语句说明可有可无,可以省略。

练习:
把stu表中name属性为张三的gender属性修改为女。

代码如下:

  1. UPDATE stu SET gender='女' WHERE name='张三';

效果图:
image.png

将张三的生日改为 1999-12-12 分数改为99.99

代码如下:

  1. UPDATE stu SET birthday='1999-12-12',score=99.9 WHERE name='张三';

效果图:
image.png
如果这些语句中没有where进行条件判定,则该语句会将表中的所有数据都进行修改,有了这个条件判定,则只会修改张三的数据。
例如如果输出这样的语句:

  1. UPDATE stu SET gender='女';

则会变成下图这样:
image.png

上边的语句都执行完后,我们用刚刚提到的查询代码查询一下,出现的结果为:
image.png

7.3 删除数据

  • 删除数据

代码如下:

  1. DELETE FROM 表名 [WHERE 条件];

练习:
删除表中张三的数据
代码如下:

  1. delete from stu where name='张三';

效果图:
image.png

删除stu的所有数据:
代码如下:

  1. delete from stu;

效果图:
image.png

8, DQL

DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)
DQL简单理解就是对数据进行查询操作。从数据库表中查询到我们想要的数据。

先介绍一下DQL的查询语句:
代码如下:

  1. SELECT
  2. 字段列表
  3. FROM
  4. 表名列表
  5. WHERE
  6. 条件列表
  7. GROUP BY
  8. 分组字段
  9. HAVING
  10. 分组后条件
  11. ORDER BY
  12. 排序字段
  13. LIMIT
  14. 分页限定

为了下面的学习变得方便,我们先把刚刚的stu空表删除,重新建立一个自己需要用到的表。

1.删除stu表,代码如下:

  1. DROP TABLE IF EXISTS stu;

运行完了之后,stu表就被删除了

2.建立一个新的stu表,数据有编号,姓名,年龄,性别,地址,数学成绩,英语成绩,入学时间。
代码如下:

  1. CREATE TABLE stu(
  2. id int,
  3. name varchar(15),
  4. age int,
  5. sex varchar(2),
  6. address varchar(25),
  7. math double(5,2),
  8. english double(5,2),
  9. time date);

效果图:
image.png

3.为了使后边更方便,我需要添加一堆数据进去。
代码如下:

  1. INSERT INTO stu VALUES(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
  2. (2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
  3. (3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
  4. (4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
  5. (5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
  6. (6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
  7. (7,'张学右',22,'女','香港',99,99,'1998-09-01'),
  8. (8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');

效果图:
image.png

准备好这些后,就开始开始之后的学习了

8.1 基础查询

8.1.1 语法

  • 查询多个字段

代码如下:

  1. SELECT 字段名称 FROM 表名; -- 查询对应的字段
  2. SELECT * FROM 表名; -- 查询所有的字段

例子:
我们查询stu包中的name和age字段,代码如下:

  1. select name,age from stu;

效果图:
image.png

查询所有字段,代码如下:

  1. select * from stu;

效果图如下:
image.png

  • 去除重复记录
    1. SELECT DISTINCT 字段名称 FROM 表名;
    去除重复记录的意思就是,只展示不同的结果,例如下面只查询sex,只会出现两个值,代码如下:
    1. select distinct sex from stu;
    效果图如下:
    image.png
    作为比较,此处把没有去除重复值的效果也展示出来:
    image.png
    由此可见,之后出现的重复值都没有显示。
    作为拓展,这里研究一下,如果有两个字段的话,是怎么对待相同的这个含义的,为了使实验变得清晰可懂,这里特别加一行,与第一行是一模一样的。再添加一行,与第一行只有年龄不一样。此时的表显示为:

开始实验,代码如下:

  1. select distinct name,age from stu;

显示的结果为:
image.png
再把不去除重复字段的展示出来:
image.png
通过对比可以发现,如果去除重复字段中有两个及以上的字段,则这几个字段必须都相同的时候,才会去除,否则会实现。

  • 起别名
    1. AS [AS也可以省略]
    效果图:
    image.png
    通过代码可得as可以省去,中间间隔空格就行,且展出出来的就会变成别名。

8.1.2 练习

  • 查询name,age两列。

代码如下:

  1. select name 姓名,age 年龄 from stu;

效果图:
image.png

  • 查询所有列的数据,列名的列表可以使用*替代

代码如下:

  1. select * from stu;

效果图:
image.png

  • 去除重复字段

代码如下:

  1. select distinct address from stu;

效果图:
image.png

  • 查询姓名、数学成绩、英语成绩。并通过as给math和english起别名(as关键字可以省略)

代码如下:

  1. select name,math 数学成绩,english 英语成绩 from stu;

效果图:
image.png

8.2 条件查询

8.2.1语法

代码如下:

  1. select 字段列表 from 表名 where 条件列表;

条件列表图:
mysql核心技术1 - 图81

8.2.2 条件查询练习

以下练习都在db数据库的stu表中进行

  • 查询年龄大于20岁的学院的信息

代码如下:

  1. select * from stu where age>20;

效果图如下:
image.png

此处实验如果想只显示名字和年龄的话,
代码如下:

  1. select name,age from stu where age>20;

效果如下:
image.png

由此可以看出,前边的字段列表是要显示的字段。

  • 查询年龄大于等于20岁的学院信息

代码如下:

  1. select * from stu where age>=20;

效果图:
image.png

  • 查询年龄大于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;

  1. 接下来依次展示效果图:<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)
  2. - 查询年龄为18或者22或者20岁的成员信息
  3. 代码如下:

select * from stu where age=18 or age=20 || age=22;

select * from stu where age in(18,20,22);

  1. 效果图:<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)
  2. - 查找英语成绩为null和不为null的成员信息
  3. 这里不能用=和!=来写,需要用is nullis not null来写<br />代码如下:

— 查找英语成绩为null的成员信息 select * from stu where english is null;

— 查找英语成绩不为null的成员信息 select * from stu where english is not null;

  1. 效果图:<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)
  2. 其余课件上的练习都可以用上面的几个测试实现,就不一一演示了。
  3. <a name="dbOG3"></a>
  4. ### 8.2.3 模糊查询练习
  5. 模糊查询的关键字是like,他有两种占位的通配符(_ %)
  6. 1. _ 是单个任意字符。(意思是只占一位)
  7. 1. %是任意数量的字符。 (意思是可以任意占位)
  8. 接下来用代码演示一下这两个占位符以及模糊查询。对此,我先将所有的学员信息查询出来:<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)
  9. - 查询姓'马'的学员信息(%通配符)
  10. 代码如下:

select * from stu where name like ‘马%’;

  1. 效果图:<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)
  2. - 查询第二个字为'花'的学员信息:(_ %通配符)
  3. 代码如下:

select * from stu where name like ‘_花%’;

  1. 效果图:<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)
  2. 为了使结果变得明显,这里我手动向图表里添加一行这个数据:<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)
  3. 效果图:<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 />可见_ 通配符占据了一个字符,所以第一个字为花的花无缺并没有被查找出来。
  4. - 查找名字中带花的学员信息(无论花在哪个位置):
  5. 代码如下:

select * from stu where name like ‘%花%’;

  1. 效果图:<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)
  2. <a name="iVU6T"></a>
  3. ## 8.3 排序查询
  4. <a name="yrlYN"></a>
  5. ### 8.3.1 语法
  6. 代码如下:

select 需要查询的字段名称 from 表名称 order by 排序字段名[排序方式1],排序字段名[排序方式2],排序字段名[排序方式3]…;

  1. > 排序方法有两种:
  2. > ASC:升序排序(默认的,可以不写,不写的时候就是升序排序)
  3. > DESC 降序排序
  4. > 只有第一个排序条件相同时才会使用第二个排序条件。
  5. <a name="mYB56"></a>
  6. ### 8.3.2 练习
  7. - 查询学生信息,按照年龄升序排序

select * from stu order by age ASC;

select * from stu order by age;

  1. 效果图:<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为默认值,不写出来并没有影响。
  2. - 查询学生信息,按照年龄降序排序(必须写DESC
  3. 代码如下:

select * from stu order by age desc;

  1. 效果图:<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)
  2. - 先按数学成绩降序排序,数学成绩一样时,按英语成绩升序排序
  3. 代码如下:

select * from stu order by math desc,english;

  1. 效果图:<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)
  2. - 先按数学成绩降序排序,数学成绩一样时,按英语成绩升序排序,英语成绩相同,按照年龄升序排序。
  3. 代码如下:

select * from stu order by math desc,english,age;

  1. 效果图:<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)
  2. <a name="PBM4O"></a>
  3. ### 8.3.3 拓展知识
  4. 把条件查询和排序查询结合在一起<br />例如:查询年龄大于20岁的女生且按照英语成绩降序排序。<br />代码如下:

select * from stu where age>20,sex=’女’ order by english desc;

  1. 效果图:<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)
  2. <a name="AN1z6"></a>
  3. ## 8.4 聚合函数
  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)
  5. <a name="h2U3o"></a>
  6. ### 8.4.1 聚合函数分类
  7. | 函数名 | 功能 |
  8. | --- | --- |
  9. | count(列名) | 统计个数,数量(一般选用不为null的列) |
  10. | max(列名) | 求最大值 |
  11. | min(列名) | 求最小值 |
  12. | sum(列名) | 求和值 |
  13. | avg(列名) | 求平均值 |
  14. <a name="dmHIu"></a>
  15. ### 8.4.2 聚合函数的语法
  16. 代码如下:

select 聚合函数名称(列名称) from 表;

  1. 注意:null值不参与所有的聚合函数,等下会演示。
  2. <a name="O3imD"></a>
  3. ### 8.4.3 练习
  4. - 统计学生的总数
  5. 代码如下

select count(id) 总学生数量 from stu;

select count(english) 总学生数量 from stu;

  1. 效果图:<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)
  2. 两图对比发现,总共有八个学生,但是用英语成绩查看的时候只有七个,那是因为有个女学生的英语成绩为null,null不参与所有的聚合函数,所以会少一个,因此使用count统计数量的时候要用没有null的一列,或者使用*,只要其中一列有值时就会统计一个.<br />代码如下:

select count(*) 总学生数量 from stu;

  1. 效果图:<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)
  2. - 统计数学的最高分和最低分
  3. 代码如下:

select max(math) 数学最高分 from stu;

select min(math) 数学最低分 from stu;

select max(math) 数学最高分,min(math) 数学最低分 from stu;

  1. 效果图:<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)
  2. - 计算所有同学的英语成绩的总和
  3. 代码如下:

select sum(english) 英语所有人总分 from stu;

  1. 效果图:<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)
  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) ```