数据库开发-MySQL
数据库开发-MySQL
今日目标
- 能够说出 为什么要使用数据库以及常见的几种数据库管理系统 🍐
- 能够说出 数据库的存在形式 🍐
- 能够操作 Mysql 安装成功并且登陆成功
- 能够使用 Navicat 操作数据库 ✏️
- 能够使用 DML 添加数据,删除数据,修改数据 ✏️
- 能够使用 DQL 查询数据 ✏️ ❤️
- 基本查询 ✏️
- 条件查询 ✏️
- 聚合函数 ✏️
- 分组查询 ✏️
- 排序查询 ✏️
- 分页查询 ✏️
知识储备
- 理解数据要持久化存储的需求
- 有用过excel表格存储数据的经历
- 有使用过wps软件操作excel表格的经历
背景
- 一般将web应用程序分为三层,即:Controller、Service、Dao
- 在真实的企业开发中呢,都会采用数据库来存储和管理数据(数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库)
- 像我们日常访问的电商网站京东,企业内部的管理系统OA、ERP、CRM这类的系统,以及大家每天都会刷的头条、抖音类的app,那这些大家所看到的数据,其实都是存储在数据库中的。
- SQL(Structured Query Language,简称SQL):结构化查询语言,它是操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。我们学习数据库开发,最为重要的就是学习SQL语句
- 排名前十的数据库:
结论
只要我们学会了SQL语句,就可以通过SQL语句来操作Mysql🎯,也可以通过SQL语句来操作其他关系型数据库,如oracle等
1. MySQL概述 ✏️ 🍐
1.1 安装 ✏️
安装

MySQL官方提供了两个版本:
- 商业版本(MySQL Enterprise Edition)
- 该版本是收费的,我们可以使用30天。 官方会提供对应的技术支持。
- 社区版本(MySQL Community Server) 👈
- 该版本是免费的,但是MySQL不会提供任何的技术支持。
本节,采用的是MySQL的社区版本(8.0.31)
安装
官网下载地址:https://downloads.mysql.com/archives/community/

这个安装包呢,大家可以不用下载,因为资料中已提供现成的安装包。
安装MySQL具体的步骤,参考资料中提供的 《MySQL安装文档》 ,进行软件的安装即可。
严格按照下面的步鄹进行(如果已经安装了5.7版本以上的,就不需要在装数据库了)
连接
MySQL服务器启动完毕后,然后再使用如下指令,来连接MySQL服务器:
mysql -u用户名 -p密码 [-h数据库服务器的IP地址 -P端口号]
-h 参数不加,默认连接的是本地 127.0.0.1 的MySQL服务器
-P 参数不加,默认连接的端口号是 3306
上述指令,可以有两种形式:
- 方式1:密码直接在-p参数之后直接指定 (这种方式不安全,密码直接以明文形式出现在命令行)

- 方式2:密码在-p回车之后,在命令行中输入密码,然后回车

3.企业使用方式(了解)
- 上述的MySQL服务器我们是安装在本地的,在真实的企业开发中,MySQL数据库服务器是不会在我们本地安装的,是在公司的服务器上安装的,
- 服务器还需要放置在专门的IDC机房中的,IDC机房需要保证恒温、恒湿、恒压,而且还要保证网络、电源的可靠性(备用电源及网络)。
1.2 数据模型 🍐
数据模型
目标:知悉Mysql数据库当中到底是 如何来存储和管理数据
关系型数据库(RDBMS)
概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
而所谓二维表,指的是由行和列组成的表,如下图:

二维表的优点:
- 使用表存储数据,格式统一,便于维护
- 使用SQL语言操作,标准统一,使用方便,可用于复杂查询
我们之前提到的MySQL、Oracle、DB2、SQLServer这些都是属于关系型数据库,里面都是基于二维表存储数据的。
结论:基于二维表存储数据的数据库就成为关系型数据库,不是基于二维表存储数据的数据库,就是非关系型数据库(比如大家后面要学习的Redis,就属于非关系型数据库)。
2). 数据模型
MySQL是关系型数据库,是基于二维表进行数据存储的,具体的结构图下:
GIF动画教程 📹 👇
- 通过MySQL客户端连接数据库管理系统DBMS,然后通过DBMS操作数据库
- 使用MySQL客户端,向数据库管理系统发送一条SQL语句,由数据库管理系统根据SQL语句指令去操作数据库中的表结构及数据
- 一个数据库服务器中可以创建多个数据库,一个数据库中也可以包含多张表,而一张表中又可以包含多行记录。
在Mysql数据库服务器当中存储数据,你需要:
- 先去创建数据库(可以创建多个数据库,之间是相互独立的)
- 在数据库下再去创建数据表(一个数据库下可以创建多张表)
- 再将数据存放在数据表中(一张表可以存储多行数据)
总结
- 关系型数据库: 建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
- 一个数据库服务器中可以创建多个数据库,一个数据库中也可以包含多张表,而一张表中又可以包含多行记录。
课堂作业
🎻 0. mysql数据库管理系统,是哪个公司的?有什么特性?🎤
🎻 1. mysql数据库管理系统,数据库,表,字段之间存在什么关系?🎤
🎻 2. 要往mysql数据库中插入数据或者查询数据,需要用什么语言? 🎤
1.3 SQL简介
SQL简介
SQL:结构化查询语言,使用SQL可以操作任何关系型数据库.🎯
SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾。

- SQL语句可以使用空格/缩进来增强语句的可读性。

- MySQL数据库的SQL语句不区分大小写。(注:oracle数据库区分)

- 注释:
- 单行注释:-- 注释内容 或 # 注释内容(MySQL特有)
- 多行注释: /注释内容/
以上就是SQL语句的通用语法,这些通用语法大家目前先有一个直观的认识,我们后面在讲解每一类SQL语句的时候,还会再来强调通用语法。
分类
SQL语句根据其功能被分为四大类:DDL、DML、DQL、DCL
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 👈 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |

实际在用户使用过程中,查询往往多于插入和修改以及删除
sql在线练习网站 👍 如果你没有安装好mysql,可以用这个网站练习
2. 数据库设计-DDL 🍐
下面我们就正式的进入到SQL语句的学习,在学习之前先给大家介绍一下我们要开发一个项目,整个开发流程是什么样的,以及在流程当中哪些环节会涉及到数据库。🎯
2.1 项目开发流程🍐
项目开发流程

需求文档:
- 在我们开发一个项目或者项目当中的某个模块之前,会先会拿到产品经理给我们提供的页面原型及需求文档 点击可查看原型图👈

设计:
- 拿到产品原型和需求文档之后,我们首先要做的不是编码,而是要先进行项目的设计,其中就包括概要设计、详细设计、接口设计、数据库设计等等。
- 数据库设计根据产品原型以及需求文档,要分析各个模块涉及到的表结构以及表结构之间的关系,以及表结构的详细信息。最终我们需要将数据库以及数据库当中的表结构设计创建出来。
开发/测试:
- 参照页面原型和需求进行编码,实现业务功能。在这个过程当中,我们就需要来操作设计出来的数据库表结构,来完成业务的增删改查操作等。
部署上线:
- 在项目的功能开发测试完成之后,项目就可以上线运行了,后期如果项目遇到性能瓶颈,还需要对项目进行优化。优化很重要的一个部分就是数据库的优化,包括数据库当中索引的建立、SQL 的优化、分库分表等操作。
在上述的流程当中,针对于数据库来说,主要包括三个阶段:
- 数据库设计阶段
- 参照页面原型以及需求文档设计数据库表结构
- 数据库操作阶段
- 根据业务功能的实现,编写SQL语句对数据表中的数据进行增删改查操作
- 数据库优化阶段
- 通过数据库的优化来提高数据库的访问性能。优化手段:索引、SQL优化、分库分表等
接下来我们就先来学习第一部分数据库的设计,而数据库的设计就是来定义数据库,定义表结构以及表中的字段。
总结
- 项目开发流程分为:需求文档、设计、开发/测试、部署上线
- 在上述的流程当中,针对于数据库来说,主要包括三个阶段:
- 数据库设计阶段
- 数据库操作阶段
- 数据库优化阶段
课堂作业
- 项目开发流程中数据库设计,主要是设计什么?🎤
- 在开发阶段,需要对数据库进行什么操作?
2.2 数据库操作
DDL英文全称是Data Definition Language(数据定义语言),用来定义数据库对象(数据库、表)
DDL中数据库的常见操作:查询、创建、使用、删除
2.2.1 查询数据库
查询所有数据库:
记得输入密码和用户名先连接数据库
show databases;
命令行中执行效果如下:

查询当前数据库:
select database();
命令行中执行效果如果:

我们要操作某一个数据库,必须要切换到对应的数据库中。
通过指令:select database() ,就可以查询到当前所处的数据库
2.2.2 创建数据库
语法:
create database [ if not exists ] 数据库名;
案例: 创建一个itcast数据库。
create database itcast;
命令行执行效果如下:

注意:在同一个数据库服务器中,不能创建两个名称相同的数据库,否则将会报错。

- 可以使用if not exists来避免这个问题
-- 数据库不存在,则创建该数据库;如果存在则不创建
create database if not extists itcast;
命令行执行效果如下:
2.2.3 使用数据库
语法:
use 数据库名 ;
我们要操作某一个数据库下的表时,就需要通过该指令,切换到对应的数据库下,否则不能操作。
案例:切换到itcast数据
use itcast;
命令执行效果如下:

2.2.4 删除数据库
语法:
drop database [ if exists ] 数据库名 ;
如果删除一个不存在的数据库,将会报错。
可以加上参数 if exists ,如果数据库存在,再执行删除,否则不执行删除。
案例:删除itcast数据库
drop database if exists itcast; -- itcast数据库存在时删除
命令执行效果如下:

说明:上述语法中的database,也可以替换成 schema
- 如:create schema db01;
- 如:show schemas;
image-20221205180608004
课堂作业
🎻 1.使用sql的ddl语言 创建一个名字为 javawebdb
的数据库
2.3 图形化工具 ✏️
为了提高开发效率,都会借助于现成的图形化管理工具来操作数据库
在命令行当中来敲这些SQL语句很不方便,主要的原因有以下 3 点:
- 没有任何代码提示。(全靠记忆,容易敲错字母造成执行报错)
- 操作繁琐,影响开发效率。(所有的功能操作都是通过SQL语句来完成的)
- 编写过的SQL代码无法保存。
目前MySQL主流的图形化界面工具有以下几种:

DataGrip是JetBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、PostgreSQL的理想解决方案。
官网: https://www.jetbrains.com/zh-cn/datagrip/
安装: 参考资料中提供的《DataGrip安装手册》
说明:DataGrip这款工具可以不用安装,因为Jetbrains公司已经将DataGrip这款工具的功能已经集成到了 IDEA当中,所以我们就可以使用IDEA来作为一款图形化界面工具来操作Mysql数据库。
点击查看Idea连接数据库
2.2.3.1 连接数据库
1、打开IDEA自带的Database

2、配置MySQL

3、输入相关信息

4、下载MySQL连接驱动

5、测试数据库连接

6、保存配置

默认情况下,连接上了MySQL数据库之后, 数据库并没有全部展示出来。 需要选择要展示哪些数据库。具体操作如下:
点击查看Idea操作数据库
2.2.3.2 操作数据库
创建数据库:


有了图形化界面工具后,就可以方便的使用图形化工具:创建数据库,创建表、修改表等DDL操作。
其实工具底层也是通过DDL语句操作的数据库,只不过这些SQL语句是图形化界面工具帮我们自动完成的。
查看所有数据库:


其实 也蛮好用的👍,经济宽裕的小伙伴,可以购买正版试试,如果要试用,点击查看Navicat安装教程 👈
2.3 表操作 ✏️ 🍐
表结构的操作也是包含四个部分:创建表、查询表、修改表、删除表。
2.3.1 创建
2.3.1.1 语法
create table 表名(
字段1 字段1类型 [约束] [comment 字段1注释 ],
字段2 字段2类型 [约束] [comment 字段2注释 ],
......
字段n 字段n类型 [约束] [comment 字段n注释 ]
) [ comment 表注释 ] ;
注意: [ ] 中的内容为可选参数; 最后一个字段后面没有逗号
案例:创建tb_user表
- 对应的结构如下:

- 建表语句:
create table tb_user (
id int comment 'ID,唯一标识', # id是一行数据的唯一标识(不能重复)
username varchar(20) comment '用户名',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
) comment '用户表';
数据表创建完成,接下来我们还需要测试一下是否可以往这张表结构当中来存储数据。
双击打开tb_user表结构,大家会发现里面没有数据:

添加数据:
此时我们再插入一条数据:

我们之前提到过:id字段是一行数据的唯一标识,不能有重复值。但是现在数据表中有两个相同的id值,这是为什么呢?
- 其实我们现在创建表结构的时候, id这个字段我们只加了一个备注信息说明它是一个唯一标识,但是在数据库层面呢,并没有去限制字段存储的数据。所以id这个字段没有起到唯一标识的作用。
想要限制字段所存储的数据,就需要用到数据库中的约束。
点击查看数据库中的约束
2.3.1.2 约束
概念:所谓约束就是作用在表中字段上的规则,用于限制存储在表中的数据。
作用:就是来保证数据库当中数据的正确性、有效性和完整性。(后面的学习会验证这些)
在MySQL数据库当中,提供了以下5种约束:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段值不能为null | not null |
唯一约束 | 保证字段的所有数据都是唯一、不重复的 | unique |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | primary key |
默认约束 | 保存数据时,如果未指定该字段值,则采用默认值 | default |
外键约束多表中讲解 | 让两张表的数据建立连接,保证数据的一致性和完整性 | foreign key |
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
案例:创建tb_user表
- 对应的结构如下:

在上述的表结构中:
id 是一行数据的唯一标识
username 用户名字段是非空且唯一的
name 姓名字段是不允许存储空值的
gender 性别字段是有默认值,默认为男
- 建表语句:
create table tb_user (
id int primary key comment 'ID,唯一标识',
username varchar(20) not null unique comment '用户名',
name varchar(10) not null comment '姓名',
age int comment '年龄',
gender char(1) default '男' comment '性别'
) comment '用户表';
数据表创建完成,接下来测试一下表中字段上的约束是否生效


大家有没有发现一个问题:id字段下存储的值,如果由我们自己来维护会比较麻烦(必须保证值的唯一性)。MySQL数据库为了解决这个问题,给我们提供了一个关键字:auto_increment(自动增长)
主键自增:auto_increment
- 每次插入新的行记录时,数据库自动生成id字段(主键)下的值
- 具有auto_increment的数据列是一个正数序列开始增长(从1开始自增)
create table tb_user (
id int primary key auto_increment comment 'ID,唯一标识', #主键自动增长
username varchar(20) not null unique comment '用户名',
name varchar(10) not null comment '姓名',
age int comment '年龄',
gender char(1) default '男' comment '性别'
) comment '用户表';
测试:主键自增
Idea中约束修改GIF动画教程 📹 👇 点击查看GIF动画图解👈
点击查看数据库中的数据类型
2.3.1.3 数据类型
在上面建表语句中,我们在指定字段的数据类型时,用到了int 、varchar、char,那么在MySQL中除了以上的数据类型,还有哪些常见的数据类型呢? 接下来,我们就来详细介绍一下MySQL的数据类型。
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
数值类型
类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
---|---|---|---|---|
TINYINT | 1byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2bytes | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT | 3bytes | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT/INTEGER | 4bytes | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
BIGINT | 8bytes | (-263,263-1) | (0,2^64-1) | 极大整数值 |
FLOAT | 4bytes | (-3.402823466 E+38,3.402823466351 E+38) | 0 和 (1.175494351 E-38,3.402823466 E+38) | 单精度浮点数值 |
DOUBLE | 8bytes | (-1.7976931348623157 E+308,1.7976931348623157 E+308) | 0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308) | 双精度浮点数值 |
DECIMAL | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
示例:
年龄字段 ---不会出现负数, 而且人的年龄不会太大
age tinyint unsigned
分数 ---总分100分, 最多出现一位小数
score double(4,1)
字符串类型
类型 | 大小 | 描述 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串(需要指定长度) |
VARCHAR | 0-65535 bytes | 变长字符串(需要指定长度) |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
char 与 varchar 都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性能会更高些。
示例:
用户名 username ---长度不定, 最长不会超过50
username varchar(50)
手机号 phone ---固定长度为11
phone char(11)
日期时间类型
类型 | 大小 | 范围 | 格式 | 描述 |
---|---|---|---|---|
DATE | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901 至 2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳 |
示例:
生日字段 birthday ---生日只需要年月日
birthday date
创建时间 createtime --- 需要精确到时分秒
createtime datetime
2.3.1.4 案例
需求:根据产品原型/需求创建表((设计合理的数据类型、长度、约束)
参考资料中提供的《黑马-tlias智能学习辅助系统》页面原型,设计员工管理模块的表结构
暂不考虑所属部门字段
产品原型及需求如下:



步骤:
阅读产品原型及需求文档,看看里面涉及到哪些字段。
查看需求文档说明,确认各个字段的类型以及字段存储数据的长度限制。
在页面原型中描述的基础字段的基础上,再增加额外的基础字段。
使用SQL创建表:
create table emp (
id int unsigned primary key auto_increment comment 'ID',
username varchar(20) not null unique comment '用户名',
password varchar(32) default '123456' comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
image varchar(300) comment '图像',
job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管',
entrydate date comment '入职时间',
create_time datetime not null comment '创建时间',
update_time datetime not null comment '修改时间'
) comment '员工表';
除了使用SQL语句创建表外,我们还可以借助于图形化界面来创建表结构,这种创建方式会更加直观、更加方便。
操作步骤如下:
- 在指定操作的数据库上,右键New ==> Table

- 编辑表结构的相关信息

2.3.1.5 设计表流程
通过上面的案例,我们明白了,设计一张表,基本的流程如下:
阅读页面原型及需求文档
基于页面原则和需求文档,确定原型字段(类型、长度限制、约束)
再增加表设计所需要的业务基础字段(id主键、插入时间、修改时间)

说明:
create_time:记录的是当前这条数据插入的时间。
update_time:记录当前这条数据最后更新的时间。
2.3.2 查询
关于表结构的查询操作,工作中一般都是直接基于图形化界面操作。
查询当前数据库所有表
show tables;

查看指定表结构
desc 表名 ;#可以查看指定表的字段、字段的类型、是否可以为NULL、是否存在默认值等信息

查询指定表的建表语句
show create table 表名 ;


2.3.3 修改
关于表结构的修改操作,工作中一般都是直接基于图形化界面操作。
添加字段
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
案例: 为tb_emp表添加字段qq,字段类型为 varchar(11)
alter table tb_emp add qq varchar(11) comment 'QQ号码';
图形化操作:添加字段


修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
案例:修改qq字段的字段类型,将其长度由11修改为13
alter table tb_emp modify qq varchar(13) comment 'QQ号码';
案例:修改qq字段名为 qq_num,字段类型varchar(13)
alter table tb_emp change qq qq_num varchar(13) comment 'QQ号码';
图形化操作:修改数据类型和字段名


删除字段
alter table 表名 drop 字段名;
案例:删除tb_emp表中的qq_num字段
alter table tb_emp drop qq_num;
图形化操作:删除字段

修改表名
rename table 表名 to 新表名;
案例:将当前的tb_emp表的表名修改为emp
rename table tb_emp to emp;
图形化操作:修改表名

2.3.4 删除
关于表结构的删除操作,工作中一般都是直接基于图形化界面操作。
删除表语法:
drop table [ if exists ] 表名;
if exists :只有表名存在时才会删除该表,表名不存在,则不执行删除操作(如果不加该参数项,删除一张不存在的表,执行将会报错)。
案例:如果tb_emp表存在,则删除tb_emp表
drop table if exists tb_emp; -- 在删除表时,表中的全部数据也会被删除。
图形化操作:删除表

相关信息
如果你想了解Navicat软件如何进行表操作的,可以点击点击查看Navicat安装和使用视频
3. 数据库操作-DML ✏️ 🍐
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
- 添加数据(INSERT)
- 修改数据(UPDATE)
- 删除数据(DELETE)
3.1 增加(insert)
insert语法:
向指定字段添加数据
insert into 表名 (字段名1, 字段名2) values (值1, 值2);
全部字段添加数据
insert into 表名 values (值1, 值2, ...);
批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
批量添加数据(全部字段)
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);
案例1:向tb_emp表的username、name、gender字段插入数据
-- 因为设计表时create_time, update_time两个字段不能为NULL,所以也做为要插入的字段
insert into tb_emp(username, name, gender, create_time, update_time)
values ('wuji', '张无忌', 1, now(), now());
案例2:向tb_emp表的所有字段插入数据
insert into tb_emp(id, username, password, name, gender, image, job, entrydate, create_time, update_time)
values (null, 'zhirou', '123', '周芷若', 2, '1.jpg', 1, '2010-01-01', now(), now());
案例3:批量向tb_emp表的username、name、gender字段插入数据
insert into tb_emp(username, name, gender, create_time, update_time)
values ('weifuwang', '韦一笑', 1, now(), now()),
('fengzi', '张三疯', 1, now(), now());
图形化操作:双击tb_emp表查看数据

Insert操作的注意事项: 👈
插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
字符串和日期型数据应该包含在引号中。
插入的数据大小,应该在字段的规定范围内。
3.2 修改(update)
update语法:
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [where 条件] ;
案例1:将tb_emp表中id为1的员工,姓名name字段更新为'张三'
update tb_emp set name='张三',update_time=now() where id=1;
案例2:将tb_emp表的所有员工入职日期更新为'2010-01-01'
update tb_emp set entrydate='2010-01-01',update_time=now();

注意事项:
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
在修改数据时,一般需要同时修改公共字段update_time,将其修改为当前操作时间。
3.3 删除(delete)
delete语法:
delete from 表名 [where 条件] ;
案例1:删除tb_emp表中id为1的员工
delete from tb_emp where id = 1;
案例2:删除tb_emp表中所有员工
delete from tb_emp;
注意事项:
• DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
• DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)。
• 当进行删除全部数据操作时,会提示询问是否确认删除所有数据,直接点击Execute即可。
课堂作业
🎻 1.将上述的案例按照顺序完成一遍
4. 数据库操作-DQL ✏️🍐 ❤️
4.1 介绍
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
查询关键字:SELECT
查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP所看到的展示信息,都是通过从数据库中查询得到的,而在这个查询过程中,还会涉及到条件、排序、分页等操作。

语法
DQL查询语句,语法结构如下:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
分为以下几个部分学习:
- 基本查询(不带任何条件)
- 条件查询(where)
- 分组查询(group by)
- 排序查询(order by)
- 分页查询(limit)
点击查看测试数据
CREATE DATABASE db86;-- 创建数据库
USE db86;-- 切换数据库
-- 创建表格
CREATE TABLE emp (
id INT UNSIGNED PRIMARY KEY auto_increment COMMENT 'ID,主键',
username VARCHAR ( 20 ) NOT NULL UNIQUE COMMENT '用户名',
PASSWORD VARCHAR ( 32 ) NOT NULL COMMENT '密码',
NAME VARCHAR ( 10 ) NOT NULL COMMENT '姓名',
gender TINYINT UNSIGNED NOT NULL COMMENT '性别, 1:男, 2:女',
phone CHAR ( 11 ) NOT NULL UNIQUE COMMENT '手机号',
job TINYINT UNSIGNED COMMENT '职位, 1:班主任,2:讲师,3:学工主管,4:教研主管,5:咨询师',
salary INT UNSIGNED COMMENT '薪资',
image VARCHAR ( 300 ) COMMENT '头像',
entry_date date COMMENT '入职日期',
create_time datetime COMMENT '创建时间',
update_time datetime COMMENT '修改时间'
) COMMENT '员工表';
-- 准备测试数据
INSERT INTO emp ( id, username, PASSWORD, NAME, gender, phone, job, salary, image, entry_date, create_time, update_time )
VALUES
( 1, 'shinaian', '123456', '施耐庵', 1, '13309090001', 4, 15000, '1.jpg', '2000-01-01', '2023-10-27 16:35:33', '2023-10-27 16:35:35' ),
( 2, 'songjiang', '123456', '宋江', 1, '13309090002', 2, 8600, '2.jpg', '2015-01-01', '2023-10-27 16:35:33', '2023-10-27 16:35:37' ),
( 3, 'lujunyi', '123456', '卢俊义', 1, '13309090003', 2, 8900, '3.jpg', '2008-05-01', '2023-10-27 16:35:33', '2023-10-27 16:35:39' ),
( 4, 'wuyong', '123456', '吴用', 1, '13309090004', 2, 9200, '4.jpg', '2007-01-01', '2023-10-27 16:35:33', '2023-10-27 16:35:41' ),
( 5, 'gongsunsheng', '123456', '公孙胜', 1, '13309090005', 2, 9500, '5.jpg', '2012-12-05', '2023-10-27 16:35:33', '2023-10-27 16:35:43' ),
( 6, 'huosanniang', '123456', '扈三娘', 2, '13309090006', 3, 6500, '6.jpg', '2013-09-05', '2023-10-27 16:35:33', '2023-10-27 16:35:45' ),
( 7, 'chaijin', '123456', '柴进', 1, '13309090007', 1, 4700, '7.jpg', '2005-08-01', '2023-10-27 16:35:33', '2023-10-27 16:35:47' ),
( 8, 'likui', '123456', '李逵', 1, '13309090008', 1, 4800, '8.jpg', '2014-11-09', '2023-10-27 16:35:33', '2023-10-27 16:35:49' ),
( 9, 'wusong', '123456', '武松', 1, '13309090009', 1, 4900, '9.jpg', '2011-03-11', '2023-10-27 16:35:33', '2023-10-27 16:35:51' ),
( 10, 'lichong', '123456', '林冲', 1, '13309090010', 1, 5000, '10.jpg', '2013-09-05', '2023-10-27 16:35:33', '2023-10-27 16:35:53' ),
( 11, 'huyanzhuo', '123456', '呼延灼', 1, '13309090011', 2, 9700, '11.jpg', '2007-02-01', '2023-10-27 16:35:33', '2023-10-27 16:35:55' ),
( 12, 'xiaoliguang', '123456', '小李广', 1, '13309090012', 2, 10000, '12.jpg', '2008-08-18', '2023-10-27 16:35:33', '2023-10-27 16:35:57' ),
( 13, 'yangzhi', '123456', '杨志', 1, '13309090013', 1, 5300, '13.jpg', '2012-11-01', '2023-10-27 16:35:33', '2023-10-27 16:35:59' ),
( 14, 'shijin', '123456', '史进', 1, '13309090014', 2, 10600, '14.jpg', '2002-08-01', '2023-10-27 16:35:33', '2023-10-27 16:36:01' ),
( 15, 'sunerniang', '123456', '孙二娘', 2, '13309090015', 2, 10900, '15.jpg', '2011-05-01', '2023-10-27 16:35:33', '2023-10-27 16:36:03' ),
( 16, 'luzhishen', '123456', '鲁智深', 1, '13309090016', 2, 9600, '16.jpg', '2010-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:05' ),
( 17, 'liying', '12345678', '李应', 1, '13309090017', 1, 5800, '17.jpg', '2015-03-21', '2023-10-27 16:35:33', '2023-10-27 16:36:07' ),
( 18, 'shiqian', '123456', '时迁', 1, '13309090018', 2, 10200, '18.jpg', '2015-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:09' ),
( 19, 'gudasao', '123456', '顾大嫂', 2, '13309090019', 2, 10500, '19.jpg', '2008-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:11' ),
( 20, 'ruanxiaoer', '123456', '阮小二', 1, '13309090020', 2, 10800, '20.jpg', '2018-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:13' ),
( 21, 'ruanxiaowu', '123456', '阮小五', 1, '13309090021', 5, 5200, '21.jpg', '2015-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:15' ),
( 22, 'ruanxiaoqi', '123456', '阮小七', 1, '13309090022', 5, 5500, '22.jpg', '2016-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:17' ),
( 23, 'ruanji', '123456', '阮籍', 1, '13309090023', 5, 5800, '23.jpg', '2012-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:19' ),
( 24, 'tongwei', '123456', '童威', 1, '13309090024', 5, 5000, '24.jpg', '2006-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:21' ),
( 25, 'tongmeng', '123456', '童猛', 1, '13309090025', 5, 4800, '25.jpg', '2002-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:23' ),
( 26, 'yanshun', '123456', '燕顺', 1, '13309090026', 5, 5400, '26.jpg', '2011-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:25' ),
( 27, 'lijun', '123456', '李俊', 1, '13309090027', 5, 6600, '27.jpg', '2004-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:27' ),
( 28, 'lizhong', '123456', '李忠', 1, '13309090028', 5, 5000, '28.jpg', '2007-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:29' ),
( 29, 'songqing', '123456', '宋清', 1, '13309090029', 5, 5100, '29.jpg', '2020-01-01', '2023-10-27 16:35:33', '2023-10-27 16:36:31' ),
( 30, 'liyun', '123456', '李云', 1, '13309090030', NULL, NULL, '30.jpg', '2020-03-01', '2023-10-27 16:35:33', '2023-10-27 16:36:31' );
4.2 基本查询(不带任何的查询条件)
在基本查询的DQL语句中,不带任何的查询条件,语法如下:
查询多个字段
select 字段1, 字段2, 字段3 from 表名;
查询所有字段(通配符)
select * from 表名;
设置别名
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] from 表名;
去除重复记录
select distinct 字段列表 from 表名;
- 案例1:查询指定字段 name,entrydate并返回
- 案例2:查询返回所有字段
- 案例3:查询所有员工的 name,entrydate,并起别名(姓名、入职日期)
- 案例4:查询已有的员工关联了哪几种职位(不要重复)
案例1:查询指定字段 name,entrydate并返回
select name,entrydate from emp;

案例2:查询返回所有字段
select * from emp;
*
号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)

案例3:查询所有员工的 name,entrydate,并起别名(姓名、入职日期)
-- 方式1:
select name AS 姓名, entrydate AS 入职日期 from emp;
-- 方式2: 别名中有特殊字符时,使用''或""包含
select name AS '姓 名', entrydate AS '入职日期' from emp;
-- 方式3:
select name AS "姓名", entrydate AS "入职日期" from emp;

案例4:查询已有的员工关联了哪几种职位(不要重复)
select distinct job from emp;

4.3 条件查询
条件查询
select 字段列表 from 表名 where 条件列表 ; -- 条件列表:意味着可以有多个条件
学习条件查询就是学习条件的构建方式,而在SQL语句当中构造条件的运算符分为两类:
- 比较运算符
- 逻辑运算符
常用的比较运算符如下:
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between ... and ... | 在某个范围之内(含最小、最大值) |
in(...) | 在in之后的列表中的值,多选一 |
like 占位符 | 模糊匹配(_匹配单个字符, %匹配任意个字符) |
is null | 是null |
常用的逻辑运算符如下:
逻辑运算符 | 功能 |
---|---|
and 或 && | 并且 (多个条件同时成立) |
or 或 || | 或者 (多个条件任意一个成立) |
not 或 ! | 非 , 不是 |
- 案例1:查询 姓名 为 杨逍 的员工
- 案例2:查询 id小于等于5 的员工信息
- 案例3:查询 没有分配职位 的员工信息
- 案例4:查询 有职位 的员工信息
- 案例5:查询 密码不等于 '123456' 的员工信息
- 案例6:查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
- 案例7:查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
- 案例8:查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
- 案例9:查询 姓名 为两个字的员工信息
- 案例10:查询 姓 '张' 的员工信息
案例1:查询 姓名 为 杨逍 的员工
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where name = '杨逍'; -- 字符串使用''或""包含

案例2:查询 id小于等于5 的员工信息
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where id <=5;

案例3:查询 没有分配职位 的员工信息
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where job is null ;

注意:查询为NULL的数据时,不能使用
= null
image-20221206122036970
案例4:查询 有职位 的员工信息
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where job is not null ;

案例5:查询 密码不等于 '123456' 的员工信息
-- 方式1:
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where password <> '123456';
-- 方式2:
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where password != '123456';

案例6:查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
-- 方式1:
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where entrydate>='2000-01-01' and entrydate<='2010-01-01';
-- 方式2: between...and
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where entrydate between '2000-01-01' and '2010-01-01';

案例7:查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where entrydate between '2000-01-01' and '2010-01-01'
and gender = 2;

案例8:查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
-- 方式1:使用or连接多个条件
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where job=2 or job=3 or job=4;
-- 方式2:in关键字
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where job in (2,3,4);

案例9:查询 姓名 为两个字的员工信息
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where name like '__'; # 通配符 "_" 代表任意1个字符

案例10:查询 姓 '张' 的员工信息
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where name like '张%'; # 通配符 "%" 代表任意个字符(0个 ~ 多个)

课堂作业
-- 查询id大于22
-- 查询id大于等于22 小于24
-- 查询名字不等于zhang5
-- 查询入职日期在2012-01-01到2015-01-01,且包含首位
-- 查询名字name 为张三 张四 方东白
-- 模糊查询 查询姓 张的
-- 模糊查询 查询名字第二个字是十的数据
-- 模糊查询 查询名字包含方的
-- 查询名字name 为张三 要么 job为2 要么 入职日期是 2012-01-01
-- 查询job为null数据
4.4 聚合函数
聚合函数
聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算)
之前我们做的查询都是横向查询,就是根据条件一行一行的进行判断,而使用
语法:
select 聚合函数(字段列表) from 表名 ;
注意 : 聚合函数会忽略空值,对NULL值不作为统计。
常用聚合函数:
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
- count :按照列去统计有多少行数据。
- sum :计算指定列的数值和,如果不是数值类型,那么计算结果为0
- max :计算指定列的最大值
- min :计算指定列的最小值
- avg :计算指定列的平均值
- 在根据指定的列统计的时候,如果这一列中有null的行 ,该行不会被统计在其中。
- 案例1:统计该企业员工数量
- 案例2:统计该企业员工的平均薪资
- 案例3:统计该企业最迟入职的员工
- 案例4:统计该企业员工 ID 的平均值
- 案例5:统计该企业员工的 ID 之和
案例1:统计该企业员工数量
# count(字段)
select count(id) from emp;-- 结果:30
select count(job) from emp;-- 结果:29 (聚合函数对NULL值不做计算)
# count(常量)
select count(0) from emp;
select count('A') from emp;
# count(*) 推荐此写法(MySQL底层进行了优化)
select count(*) from emp;
案例2:统计该企业员工的平均薪资
select avg(salary) from emp;
案例3:统计该企业员工的最低薪资
select min(salary) from emp;
案例4:统计该企业员工的最高薪资
select max(salary) from emp;
案例5:统计该企业每月要给员工发放的薪资总额(薪资之和)
select sum(salary) from emp;
总结
- count :按照列去统计有多少行数据。
- sum :计算指定列的数值和,如果不是数值类型,那么计算结果为0
- max :计算指定列的最大值
- min :计算指定列的最小值
- avg :计算指定列的平均值
- 在根据指定的列统计的时候,如果这一列中有null的行 ,该行不会被统计在其中。
课堂作业
- 将案例1-5进行练习
- 统计员工表中男性和女性的人数
- 计算每个职位的平均入职年限
4.5 分组查询
分组查询
分组: 按照某一列或者某几列,把相同的数据进行合并输出。

分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
分组查询通常会使用聚合函数进行计算。
语法:
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
聚合统计:分组查询常用于数据聚合和统计。在许多业务场景中,需要计算某个列的总和、平均值、最大值、最小值等聚合函数的结果。例如,在电子商务中,可以使用分组查询来统计每个产品类别的销售总额。
数据分析:分组查询允许业务用户根据不同维度对数据进行分析。例如,在市场营销中,可以使用分组查询来分析不同地区或年龄段的客户购买行为,以便优化市场策略。
去重:有时,需要从数据中删除重复的记录。分组查询可以帮助确定哪些记录是重复的,然后进一步处理这些记录。例如,从客户数据库中去除重复的电子邮件地址。
业务报表:分组查询常用于生成业务报表。可以根据特定条件将数据分组并生成报表,使业务决策更明确和有针对性。例如,生成每月销售报表,按产品或地区分组。
数据汇总:分组查询可以用于对大量数据进行汇总。例如,在物流行业,可以使用分组查询来生成每个月的货物运输汇总报告,包括货物数量、运输成本等信息。
总之,分组查询是数据库中一种强大的工具,它允许对数据进行聚合、分析、汇总和统计,提供更深入的洞察力和支持业务需求的数据。通过合理使用分组查询,可以满足不同业务场景的需求,提高数据处理效率和业务决策的质量。
- 案例1:根据性别分组 , 统计男性和女性员工的数量
- 案例2:查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
案例1:根据性别分组 , 统计男性和女性员工的数量
select gender, count(*)
from emp
group by gender; -- 按照gender字段进行分组(gender字段下相同的数据归为一组)

案例2:查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job, count(*)
from emp
where entrydate <= '2015-01-01' -- 分组前条件
group by job -- 按照job字段分组
having count(*) >= 2; -- 分组后条件

注意事项:
• 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
• 执行顺序:where > 聚合函数 > having
总结
where与having区别(面试题)
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
课堂作业
- 计算不同年份入职员工的人数
编写一个SQL查询,计算不同年份入职的员工的人数,结果应包括两列:入职年份(entry_year)和人数(count)。
YEAR(时间) 可以返回年份
4.6 排序查询
排序查询
排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序。
语法:
select 字段列表
from 表名
[where 条件列表]
[group by 分组字段 ]
order by 字段1 排序方式1 , 字段2 排序方式2 … ;
- 排序方式:
- ASC :升序(默认值)
- DESC:降序
- 案例1:根据入职时间, 对员工进行升序排序
- 案例2:根据入职时间,对员工进行降序排序
- 案例3:根据入职时间对公司的员工进行升序排序,入职时间相同,再按照更新时间进行降序排序
案例1:根据入职时间, 对员工进行升序排序
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from emp
order by entrydate ASC; -- 按照entrydate字段下的数据进行升序排序
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from emp
order by entrydate; -- 默认就是ASC(升序)

注意事项:如果是升序, 可以不指定排序方式ASC
案例2:根据入职时间,对员工进行降序排序
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from emp
order by entrydate DESC; -- 按照entrydate字段下的数据进行降序排序

案例3:根据入职时间对公司的员工进行升序排序,入职时间相同,再按照更新时间进行降序排序
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from emp
order by entrydate ASC , update_time DESC;

注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
总结
- 格式:
order by
字段1 排序方式1 , 字段2 排序方式2 … ; - 排序方式:
- ASC :升序(默认值)
- DESC:降序
课堂作业
- 按照姓名字母顺序升序排序员工表
编写一个SQL查询,按照员工姓名(name)的字母顺序升序对员工表进行排序。
- 按照入职年限升序和性别降序排序员工表
编写一个SQL查询,按照员工入职年限(entrydate)升序和性别(gender)降序对员工表进行排序。
4.7 分页查询
分页查询
分页 操作在业务系统开发时,也是非常常见的一个功能,日常我们在网站中看到的各种各样的分页条,后台也都需要借助于数据库的分页操作。

分页查询语法:
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
分页查询应用场景:
分页浏览数据:在许多应用程序中,数据量可能非常庞大,不适合一次性加载到前端或客户端。分页查询允许用户按需加载数据,以便更好地浏览大量数据。例如,社交媒体应用程序允许用户在他们的新闻源或朋友列表中分页浏览帖子或联系人。
提高性能:对于大型数据集,一次性检索和传输所有数据可能导致性能问题,特别是在网络连接有限的情况下。分页查询可以减小每次查询的数据量,降低了数据库和网络的负担,提高了性能。这在电子商务网站的商品列表、搜索结果或大型数据库应用程序中特别重要。
分布式系统:在分布式数据库系统中,数据可能存储在多个节点或分片上。分页查询可以有效地处理分布式数据,允许每个节点返回一部分结果,最后合并成一个完整的分页数据。
减少内存使用:一次性加载大量数据可能会导致内存不足的问题。通过分页查询,可以将数据逐步加载到内存中,减少内存消耗。
交互式应用程序:分页查询适用于需要快速响应用户请求的交互式应用程序,例如在线游戏、实时监控系统和即时通讯应用程序。用户可以不断滚动或翻页,从而获得实时更新的数据。
报表生成:分页查询也常用于报表生成工具。用户可以生成大型报表并逐页浏览,而不需要等待所有数据加载完成。
总之,分页查询是数据库中一种非常有用的机制,它允许业务应用程序更有效地处理大量数据,提高性能,减少内存使用,提供更好的用户体验,适应各种业务需求。通过合理使用分页查询,可以有效管理和呈现数据,满足不同业务场景的需求。
- 案例1:从起始索引0开始查询员工数据, 每页展示5条记录
- 案例2:查询 第1页 员工数据, 每页展示5条记录
- 案例3:查询 第2页 员工数据, 每页展示5条记录
- 案例4:查询 第3页 员工数据, 每页展示5条记录
案例1:从起始索引0开始查询员工数据, 每页展示5条记录
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from emp
limit 0 , 5; -- 从索引0开始,向后取5条记录

案例2:查询 第1页 员工数据, 每页展示5条记录
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from emp
limit 5; -- 如果查询的是第1页数据,起始索引可以省略,直接简写为:limit 条数

案例3:查询 第2页 员工数据, 每页展示5条记录
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from emp
limit 5 , 5; -- 从索引5开始,向后取5条记录

案例4:查询 第3页 员工数据, 每页展示5条记录
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from emp
limit 10 , 5; -- 从索引10开始,向后取5条记录

总结
- 语法格式: select 字段列表 from 表名
limit 起始索引, 查询记录数
; - 注意事项:
- 起始索引从0开始。 计算公式 : 起始索引 = (查询页码 - 1)* 每页显示记录数
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 条数
课堂作业
- 为什么要分页查询?🎤
- 完成案例1-4
课后作业
🚩 1. 重点完成上述的课堂作业
晚自习第一节课的前30分钟,总结完毕之后,每个同学先必须梳理今日知识点 (记得写不知道的,以及感恩三件事);整理好的笔记可以发给组长,组长交给班长,意在培养大家总结的能力)
晚自习第一节课的后30分钟开始练习(记住:程序员是代码堆起来的):
- 先要把今天的所有案例或者课堂练习,如果没练完的,练完他
- 独立书写今日作业 👈
剩余的时间:预习第二天的知识,预习的时候一定要注意:
- 预习不是学习,不要死看第二天的视频(很容易出现看了白看,为了看视频而看视频)
- 预习看第二天的笔记,把笔记中标注重要的知识,可以找到预习视频,先看一遍,如果不懂的 ,记住做好标注。