【JavaWeb后端开发03】MySQL入门
文章目录
- 1. 前言
- 1.1 引言
- 1.2 相关概念
- 2. MySQL概述
- 2.1 安装
- 2.2 连接
- 2.2.1 介绍
- 2.2.2 企业使用方式(了解)
- 2.3 数据模型
- 2.3.1 **关系型数据库(RDBMS)**
- 2.3.2 数据模型
- 3. SQL语句
- 3.1 DDL语句
- 3.1.1 数据库操作
- 3.1.1.1 查询数据库
- 3.1.1.2 创建数据库
- 3.1.1.3 使用数据库
- 3.1.1.4 删除数据库
- 3.1.2 图形化工具
- 3.1.2.1 介绍
- 3.1.2.2 安装
- 3.1.2.3 连接数据库
- 3.1.3 表操作
- 3.1.3.1 创建
- 3.1.3.2 约束
- 3.1.3.3 数据类型
- 3.1.3.4 表结构设计-案例
- 3.1.3.5 表操作-其他操作
- 3.2 DML语句
- 3.2.1 增加(insert)
- 3.2.1.1 **语法**
- 3.2.1.2 案例演示
- 3.2.2 修改(update)
- 3.2.2.1 语法
- 3.2.2.2 案例演示
- 3.2.3 删除(delete)
- 3.2.3.1 语法
- 3.2.3.2 案例演示
- 3.3 DQL语句
- 3.3.1 介绍
- 3.3.2 语法
- 3.3.3 基本查询
- 3.3.4 条件查询
- 3.3.5 聚合函数
- 3.3.6 分组查询
- 3.3.7 排查查询
- 3.3.8 分页查询
1. 前言
1.1 引言
在我们讲解SpringBootWeb基础知识(IOC、DI等)的时候,我们讲到在web开发中,为了应用程序职责单一,方便维护,我们一般将web应用程序分为三层,即:Controller、Service、Dao 。
之前我们的案例中,是这样子的请求流程:浏览器发起请求,先请求Controller;Controller接收到请求之后,调用Service进行业务逻辑处理;Service再调用Dao,Dao再解析user.txt中所存储的数据。

txt文件中可以存储数据,但是在企业项目开发中一般不会使用文本文件存储项目数据,因为不便管理维护,操作难度大。
在真实的企业开发中呢,都会采用数据库来存储和管理数据,那此时,web开发调用流程图如下所示:

那么今天我们就要来学习数据库技术。
1.2 相关概念
首先来了解一下什么是数据库。
- 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。
像我们日常访问的电商网站京东,企业内部的管理系统OA、ERP、CRM这类的系统,以及大家每天都会刷的头条、抖音类的app,那这些大家所看到的数据,其实都是存储在数据库中的。最终这些数据,只是在浏览器或app中展示出来而已,最终数据的存储和管理都是数据库负责的。

数据是存储在数据库中的,那我们要如何来操作数据库以及数据库中所存放的数据呢?
那这里呢,会涉及到一个软件,那就是数据库管理系统。
- 数据库管理系统(DataBase Management System,简称DBMS),是操作和管理数据库的大型软件。
将来我们只需要操作这个软件,就可以通过这个软件来操纵和管理数据库了。

此时又出现一个问题:DBMS这个软件怎么知道要操作的是哪个数据库、哪个数据呢?是对数据做修改还是查询呢?
需要给DBMS软件发送一条指令,告诉这个软件我们要执行的是什么样的操作,要对哪个数据进行操作。而这个指令就是SQL语句。
- SQL(Structured Query Language,简称SQL):结构化查询语言,它是操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。

我们学习数据库开发,最为重要的就是学习SQL语句 。
关系型数据库:我们后面会详细讲解,现在大家只需要知道我们学习的数据库属于关系型数据库即可。
结论:程序员给数据库管理系统(DBMS)发送SQL语句,再由数据库管理系统操作数据库当中的数据。
了解了数据库的一些简单概念之后,接下来我们再来介绍下目前主流的数据库,这里截取了排名前十的数据库:

Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。(通常是不差钱的公司会选择使用这个数据库)
MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle又收购了Sun公司。目前Oracle推出两个版本的Mysql:社区版(开源免费)、商业版(收费)。
SQL Server:Microsoft 公司推出的收费的中型数据库,C#、.net等语言常用。
PostgreSQL:开源免费的中小型数据库。
DB2:IBM公司的大型收费数据库产品。
SQLLite:嵌入式的微型数据库。Android内置的数据库采用的就是该数据库。
MariaDB:开源免费的中小型数据库。是MySQL数据库的另外一个分支、另外一个衍生产品,与MySQL数据库有很好的兼容性。
那这么多数据库,我们全部都需要学习吗,其实并不用,我们只需要学习其中的一个就可以了,我们此次课程中学习的数据库是现在互联网公司开发使用最为流行的MySQL数据库。
此时大家可能会有一个疑问,我们现在学习的是Mysql数据库,我们以后去公司做开发,如果用到的是Oracle数据库或SQL Server数据库该怎么办?其实大家完全不用担心这个问题,因为这些数据库都是属于关系型数据库,要操作关系型数据库都是通过 SQL语句来实现的,而SQL语句又是操作关系型数据库的统一标准。
结论:只要我们学会了SQL语句,就可以通过SQL语句来操作Mysql,也可以通过SQL语句来操作Oracle或SQL Server
课程内容安排:
-
MySQL概述
-
SQL语句(DDL、DML、DQL)
-
多表设计
-
多表查询
-
事务
-
索引
2. MySQL概述

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

2.2 连接
2.2.1 介绍
MySQL服务器启动完毕后,然后再使用如下指令,来连接MySQL服务器:
-
-h 参数不加,默认连接的是本地 127.0.0.1 的MySQL服务器
-
-P 参数不加,默认连接的端口号是 3306
上述指令,可以有两种形式:
- 密码直接在-p参数之后直接指定 (这种方式不安全,密码直接以明文形式出现在命令行)

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

2.2.2 企业使用方式(了解)
上述的MySQL服务器我们是安装在本地的,这个仅仅是在我们学习阶段,在真实的企业开发中,MySQL数据库服务器是不会在我们本地安装的,是在公司的服务器上安装的,而服务器还需要放置在专门的IDC机房中的,IDC机房呢,就需要保证恒温、恒湿、恒压,而且还要保证网络、电源的可靠性(备用电源及网络)。

那我们要想使用服务器上的这台MySQL服务器,就需要在我们的电脑上去远程连接这台MySQL 。 而服务器上安装的MySQL数据库呢,并不是你一个人在访问,我们项目组的其他开发人员也是需要访问这台MySQL的。

接下来,就来演示一下,通过MySQL的客户端命令行,如何来连接服务器上部署的MySQL :

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

2.3 数据模型
介绍完了Mysql数据库的安装配置之后,接下来我们再来聊一聊Mysql当中的数据模型。学完了这一小节之后,我们就能够知道在Mysql数据库当中到底是如何来存储和管理数据的。
在介绍 Mysql的数据模型之前,需要先了解一个概念:关系型数据库。
2.3.1 关系型数据库(RDBMS)
概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。而所谓二维表,指的是由行和列组成的表,如下图:

二维表的优点:
-
使用表存储数据,格式统一,便于维护
-
使用SQL语言操作,标准统一,使用方便,可用于复杂查询
我们之前提到的MySQL、Oracle、DB2、SQLServer这些都是属于关系型数据库,里面都是基于二维表存储数据的。
结论:基于二维表存储数据的数据库就成为关系型数据库,不是基于二维表存储数据的数据库,就是非关系型数据库(比如大家后面要学习的Redis,就属于非关系型数据库)。
2.3.2 数据模型
介绍完了关系型数据库之后,接下来我们再来看一看在Mysql数据库当中到底是如何来存储数据的,也就是Mysql 的数据模型。
MySQL是关系型数据库,是基于二维表进行数据存储的,具体的结构图下:

-
通过MySQL客户端连接数据库管理系统DBMS,然后通过DBMS操作数据库。
-
使用MySQL客户端,向数据库管理系统发送一条SQL语句,由数据库管理系统根据SQL语句指令去操作数据库中的表结构及数据。
-
一个数据库服务器中可以创建多个数据库,一个数据库中也可以包含多张表,而一张表中又可以包含多行记录。
在Mysql数据库服务器当中存储数据,你需要:
先去创建数据库(可以创建多个数据库,之间是相互独立的)
在数据库下再去创建数据表(一个数据库下可以创建多张表)
再将数据存放在数据表中(一张表可以存储多行数据)
3. SQL语句
SQL:结构化查询语言。一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。SQL语句根据其功能被分为四大类:DDL、DML、DQL、DCL 。

分类
| 分类 | 全称 | 说明 |
|---|---|---|
| DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库、表、字段) |
| DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增、删、改 |
| DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
| DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
3.1 DDL语句
3.1.1 数据库操作
我们在进行数据库设计,需要使用到刚才所介绍SQL分类中的DDL语句。
DDL英文全称是Data Definition Language(数据定义语言),用来定义数据库对象(数据库、表、表中字段)。
DDL中数据库的常见操作:查询、创建、使用、删除。
3.1.1.1 查询数据库
- 查询所有数据库
命令行中执行效果如下:

- 查询当前数据库
命令行中执行效果如果:

我们要操作某一个数据库,必须要切换到对应的数据库中。
通过指令:select database() ,就可以查询到当前所处的数据库
3.1.1.2 创建数据库
- 语法:
创建数据库时,可以不指定字符集。 因为在MySQL8版本之后,默认的字符集就是 utf8mb4。
- 案例: 创建一个itcast数据库。
命令行执行效果如下:

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

可以使用if not exists来避免这个问题
命令行执行效果如下:

3.1.1.3 使用数据库
- 语法:
我们要操作某一个数据库下的表时,就需要通过该指令,切换到对应的数据库下,否则不能操作。
- 案例:切换到itcast数据
命令执行效果如下:

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

说明:上述语法中的database,也可以替换成 schema
如:create schema db01;
如:show schemas;

3.1.2 图形化工具
3.1.2.1 介绍
前面我们讲解了DDL中关于数据库操作的SQL语句,在我们编写这些SQL时,都是在命令行当中完成的。大家在练习的时候应该也感受到了,在命令行当中来敲这些SQL语句很不方便,主要的原因有以下 3 点:
-
没有任何代码提示。(全靠记忆,容易敲错字母造成执行报错)
-
操作繁琐,影响开发效率。(所有的功能操作都是通过SQL语句来完成的)
-
编写过的SQL代码无法保存。
在项目开发当中,通常为了提高开发效率,都会借助于现成的图形化管理工具来操作数据库。
目前MySQL主流的图形化界面工具有以下几种:

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

2). 创建连接


下载驱动, 可能会比较耗时, 耐心等待一会儿。
3). 测试连接
下载完驱动之后,可以点击 Test Connection 来测试一下是否可以正常的连接数据库。

然后点击 OK , 就已经连接上了MySQL数据库了。
默认情况下,连接上了MySQL数据库之后, 数据库并没有全部展示出来。 需要选择要展示哪些数据库。具体操作如下:

3.1.3 表操作
学习完了DDL语句当中关于数据库的操作之后,接下来我们继续学习DDL语句当中关于表结构的操作。
关于表结构的操作也是包含四个部分:创建表、查询表、修改表、删除表。
3.1.3.1 创建
-
语法:

- 注意: [ ] 中的内容为可选参数; 最后一个字段后面没有逗号
-
案例:创建tb_user表
- 对应的结构如下:

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

添加数据:

我们之前提到过:id字段是一行数据的唯一标识,不能有重复值。但是现在数据表中有两个相同的id值,这是为什么呢?
- 其实我们现在创建表结构的时候, id这个字段我们只加了一个备注信息说明它是一个唯一标识,但是在数据库层面呢,并没有去限制字段存储的数据。所以id这个字段没有起到唯一标识的作用。
想要限制字段所存储的数据,就需要用到数据库中的约束。
3.1.3.2 约束
-
概念:所谓约束就是作用在表中字段上的规则,用于限制存储在表中的数据。
-
作用:就是来保证数据库当中数据的正确性、有效性和完整性。(后面的学习会验证这些)
-
在MySQL数据库当中,提供了以下5种约束:

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
- 案例:创建tb_user表,对应的结构如下:

在上述的表结构中:现在我们加上一些限制

建表语句:
-- 创建表(+约束)
create table user(id int primary key comment 'ID,唯一标识', -- 主键约束username varchar(50) 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 user(id int primary key auto_increment comment 'ID,唯一标识', -- 主键约束且自动增长username varchar(50) not null unique comment '用户名', -- 非空且唯一name varchar(10) not null comment '姓名', -- 非空age int comment '年龄',gender char(1) default '男' comment '性别' -- 默认
) comment '用户信息表';


3.1.3.3 数据类型
在上面建表语句中,我们在指定字段的数据类型时,用到了int 、varchar、char,那么在MySQL中除了以上的数据类型,还有哪些常见的数据类型呢? 接下来,我们就来详细介绍一下MySQL的数据类型。
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
1). 数值类型
2). 字符串类型
char 与 varchar 都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性能会更高些。
3). 日期时间类型

3.1.3.4 表结构设计-案例
需求:根据产品原型/需求创建表((设计合理的数据类型、长度、约束)
产品原型及需求如下:
1). 列表展示

2). 新增员工

3). 需求说明及字段限制

-- 案例 :员工表单emp
-- 设计表基础字段:id 主键; create_time 创建时间; update_time 修改时间;
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 女', -- 在企业中性别一般用编号存储phone char(11) not null unique comment '手机号' ,job tinyint unsigned comment '职位, 1 班主任; 2 讲师; 3 学工主管; 4 教研主管; 5 咨询师', -- 这里的职位也用编号存储salary int unsigned comment '薪资',entry_date date comment '入职日期',image varchar(255) comment '图像',-- 存储图片的访问路径create_time datetime comment '创建时间',update_time datetime comment '修改时间'
) comment '员工表';
步骤:
-
阅读产品原型及需求文档,看看里面涉及到哪些字段。不仅要考虑页面展示字段,也要考虑录入员工需要哪些信息
-
查看需求文档说明,确认各个字段的类型以及字段存储数据的长度限制。
- 在页面原型中描述的基础字段的基础上,再增加额外的基础字段。
使用SQL创建表:
除了使用SQL语句创建表外,我们还可以借助于图形化界面来创建表结构,这种创建方式会更加直观、更加方便。
设计表流程:
阅读页面原型及需求文档
基于页面原则和需求文档,确定原型字段(类型、长度限制、约束)
再增加表设计所需要的业务基础字段(id(主键,唯一标识一条数据)、create_time、update_time)
create_time:记录的是当前这条数据插入的时间。
update_time:记录当前这条数据最后更新的时间。
3.1.3.5 表操作-其他操作
上面讲解了表结构的创建、数据类型、设计表的流程,接下来,再来讲解表结构的查询、修改、删除操作 。
查询、修改、删除数据库表的具体的语法:
-- 查询当前数据库所有表
show tables;-- 查看表结构
desc emp;-- 查询建表语句
show create table emp;-- 字段:添加字段qq varchar(13)
alter table emp add qq varchar(13) comment 'QQ'; -- 默认加在最后-- 字段:修改字段类型qq varchar(15)
alter table emp modify qq varchar(15) comment 'QQ'; -- 不加注释默认删除注释-- 字段:修改字段名 qq -> qq_num varchar(15)
alter table emp change qq qq_num varchar(15) comment 'QQ';-- 字段:删除字段 qq_num4
alter table emp drop column qq_num;-- 修改表名
alter table emp rename to employee;-- 删除表
drop table employee;
查询表结构

查询建表语句

关于表结构的查看、修改、删除操作,工作中一般都是直接基于图形化界面操作。在删除表时,表中的数据也会被全部删除
3.2 DML语句
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
-
添加数据(INSERT)
-
修改数据(UPDATE)
-
删除数据(DELETE),即删除某一条数据
3.2.1 增加(insert)
3.2.1.1 语法
3.2.1.2 案例演示
-- DML : 数据操作语言
-- DML : 插入数据 - insert
-- 1. 为 emp 表的 username, password, name, gender, phone 字段插入值
insert into emp (username, password, name, gender, phone) values('xuner','12345678','寻而',1,'15545679999');-- 2. 为 emp 表的 所有字段插入值
-- 方式一
insert into emp (id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time)values (null,'xiaomi','12345678','小米',1,'15578971114',1,6000,'2020-01-01','1.jpg',now(),now());-- null自动增长
-- 函数now,可以获取当前系统时间
-- 方式二 : 简化方式一
insert into emp values(null,'xiaomi2','12345678','小米2',1,'15578971116',1,6000,'2020-01-01','1.jpg',now(),now());-- 3. 批量为 emp 表的 username, password, name, gender, phone 字段插入数据
insert into emp (username, password, name, gender, phone) values('xuner2','12345678','寻2',1,'15545619999'),('xuner1','12345678','寻而1',1,'15545669999');
insert操作的注意事项:
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
- 字符串和日期型数据应该包含在引号中,会报警告但可执行。
- 插入的数据大小,应该在字段的规定范围内。
3.2.2 修改(update)
3.2.2.1 语法

3.2.2.2 案例演示
-- DML : 更新数据 - update
-- 1. 将 emp 表的ID为1员工 用户名更新为 'zhangsan', 姓名name字段更新为 '张三'
update emp set username = 'zhangsan',name = '张三' where id = 1;-- 2. 将 emp 表的所有员工的入职日期更新为 '2010-01-01'
update emp set entry_date = '2010-01-01';
注意事项:
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
在修改数据时,一般需要同时修改公共字段update_time,将其修改为当前操作时间。
3.2.3 删除(delete)
3.2.3.1 语法
3.2.3.2 案例演示
-- DML : 删除数据 - delete
-- 1. 删除 emp 表中 ID为1的员工
delete from emp where id = 1;-- 2. 删除 emp 表中的所有员工
delete from emp;
注意事项:
DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)。
当进行删除全部数据操作时,会提示询问是否确认删除所有数据,直接点击Execute即可。
3.3 DQL语句
3.3.1 介绍
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
查询关键字:SELECT
查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP所看到的展示信息,都是通过从数据库中查询得到的,而在这个查询过程中,还会涉及到条件、排序、分页等操作。

3.3.2 语法
DQL查询语句,语法结构如下:

我们今天会将上面的完整语法拆分为以下几个部分学习:
-
基本查询(不带任何条件)
-
条件查询(where)
-
分组查询(group by)
-
排序查询(order by)
-
分页查询(limit)
准备一些测试数据用于查询操作:
3.3.3 基本查询
在基本查询的DQL语句中,不带任何的查询条件。
语法如下:
-
查询多个字段
-
查询所有字段(通配符)
-
设置别名
-
去除重复记录

案例演示:
-
案例1:查询指定字段 name,entry_date并返回
-
案例2:查询返回所有字段
* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)
-
案例3:查询所有员工的 name, entry_date,并起别名(姓名、入职日期)
-
案例4:查询已有的员工关联了哪几种职位(不要重复)
-- =================== DQL: 基本查询 ======================
-- 1. 查询指定字段 name,entry_date 并返回
select name,entry_date from emp;-- 2. 查询返回所有字段
-- 方式一:推荐
select id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time from emp
-- 方式二:不推荐
select * from emp;-- 3. 查询所有员工的 name,entry_date, 并起别名(姓名、入职日期)
select name as 姓名,entry_date as 入职日期 from emp;
-- 别名中间有空格,就必须要加引号
select name as '姓 名',entry_date as 入职日期 from emp;
-- as也可省略
select name '姓 名',entry_date 入职日期 from emp;-- 4. 查询已有的员工关联了哪几种职位(不要重复)
select distinct job from emp;

3.3.4 条件查询
语法:

学习条件查询就是学习条件的构建方式,而在SQL语句当中构造条件的运算符分为两类:
-
比较运算符
-
逻辑运算符

-
案例1:查询 姓名 为 ‘杨逍’ 的员工
-
案例2:查询 薪资小于等于 5000 的员工信息
-
案例3:查询 没有分配职位 的员工信息
注意:查询为NULL的数据时,不能使用
= null或!=null。得使用is null或is not null。
-
案例4:查询 有职位 的员工信息
-
案例5:查询 密码不等于 ‘123456’ 的员工信息
-
案例6:查询 入职日期 在 ‘2000-01-01’ (包含) 到 ‘2010-01-01’(包含) 之间的员工信息
-
案例7:查询 入职时间 在 ‘2000-01-01’ (包含) 到 ‘2010-01-01’(包含) 之间 且 性别为女 的员工信息
-
案例8:查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
-
案例9:查询 姓名 为两个字的员工信息
-
案例10:查询 姓 ‘张’ 的员工信息
-
案例11:查询 姓名中包含 ‘二’ 的员工信息
-- =================== DQL: 条件查询 ======================
-- 1. 查询 姓名 为 柴进 的员工
select * from emp where name = '柴进';-- 2. 查询 薪资小于等于5000 的员工信息
select * from emp where salary<=5000;-- 3. 查询 没有分配职位 的员工信息
select * from emp where job is null;-- 4. 查询 有职位 的员工信息
select * from emp where job is not null;-- 5. 查询 密码不等于 '123456' 的员工信息
select * from emp where password != '123456';
select * from emp where password <> '123456';-- 6. 查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01'; -- between必须由小到大-- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01' && gender = 2;select * from emp where (entry_date between '2000-01-01' and '2010-01-01') and gender = 2;-- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from emp where job = 2 or job = 3 or job = 4;
select * from emp where job between 2 and 4;
select * from emp where job in (2,3,4);-- 9. 查询 姓名 为两个字的员工信息(_:单个字符;%:任意字符)
select * from emp where name like '__';-- 10. 查询 姓 '李' 的员工信息
select * from emp where name like '李%';-- 11. 查询 姓名中包含 '二' 的员工信息
select * from emp where name like '%二%';
3.3.5 聚合函数
之前我们做的查询都是横向查询,就是根据条件一行一行的进行判断,而使用聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算)
常用聚合函数:
注意 : 聚合函数会忽略空值,对NULL值不作为统计。
-
count :按照列去统计有多少行数据。
- 在根据指定的列统计的时候,如果这一列中有null的行,该行不会被统计在其中。
-
sum :计算指定列的数值和,如果不是数值类型,那么计算结果为0
-
max :计算指定列的最大值
-
min :计算指定列的最小值
-
avg :计算指定列的平均值

案例演示:
- 案例1:统计该企业员工数量
- 案例2:统计该企业员工的平均薪资
- 案例3:统计该企业员工的最低薪资
- 案例4:统计该企业员工的最高薪资
- 案例5:统计该企业每月要给员工发放的薪资总额(薪资之和)
-- 聚合函数
-- 注意:所有聚合函数不参与null的统计-- 1. 统计该企业员工数量,优先使用count(*),效率最高,常量性能最低
-- count(字段)
select count(id) from emp;
-- count(*)
select count(*) from emp;
-- count(常量)
select count(0) 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;
3.3.6 分组查询
-
分组: 按照某一列或者某几列,把相同的数据进行合并输出。
-
分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
-
分组查询通常会使用聚合函数进行计算。
-
语法:
案例演示:
-
案例1:根据性别分组 , 统计男性和女性员工的数量
-
案例2:查询入职时间在 ‘2015-01-01’ (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
-- =================== DQL: 分组查询 ======================
-- 分组
-- 注意:分组之后,select后的字段列表不能随意书写,能写的一般是分组字段 + 聚合函数
-- 1. 根据性别分组 , 统计男性和女性员工的数量
select gender,count(*) from emp group by gender ;-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job,count(*) from emp where entry_date <= '2015-01-01' group by job having count(*)>=2;
注意事项:
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
执行顺序:where > 聚合函数 > having;
where与having区别(面试题)
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。

3.3.7 排查查询
排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序。
语法:
-
排序方式:
-
ASC :升序(默认值)
-
DESC:降序
-
案例演示:
- 案例1:根据入职时间, 对员工进行升序排序
注意事项:如果是升序, 可以不指定排序方式ASC
-
案例2:根据入职时间,对员工进行降序排序
-
案例3:根据入职时间对公司的员工进行升序排序,入职时间相同,再按照更新时间进行降序排序
注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
-- =================== 排序查询 ======================
-- 1. 根据入职时间, 对员工进行升序排序
select * from emp order by entry_date asc;-- 2. 根据入职时间, 对员工进行降序排序
select * from emp order by entry_date desc;-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
select * from emp order by entry_date asc,update_time desc ;
3.3.8 分页查询
分页操作在业务系统开发时,也是非常常见的一个功能,日常我们在网站中看到的各种各样的分页条,后台也都需要借助于数据库的分页操作。

分页查询语法:

- 案例1:从起始索引0开始查询员工数据, 每页展示5条记录
- 案例2:查询 第1页 员工数据, 每页展示5条记录
- 案例3:查询 第2页 员工数据, 每页展示5条记录
- 案例4:查询 第3页 员工数据, 每页展示5条记录
-- =================== 分页查询 ======================
-- 起始索引 = (页码减一) * 每页展示记录数
-- 1. 从起始索引0开始查询员工数据, 每页展示5条记录
select * from emp limit 0,5;
select * from emp limit 5;-- 2. 查询 第1页 员工数据, 每页展示5条记录
select * from emp limit 0,5; -- 起始索引0就是第一页-- 3. 查询 第2页 员工数据, 每页展示5条记录 0-4第一页 5-9 第二页
select * from emp limit 5,5;-- 4. 查询 第3页 员工数据, 每页展示5条记录
select * from emp limit 10,5;
注意事项:
起始索引从0开始。
计算公式 :起始索引 = (查询页码 - 1)* 每页显示记录数
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
如果查询的是第一页数据(0),起始索引可以省略,直接简写为 limit 条数


相关文章:
【JavaWeb后端开发03】MySQL入门
文章目录 1. 前言1.1 引言1.2 相关概念 2. MySQL概述2.1 安装2.2 连接2.2.1 介绍2.2.2 企业使用方式(了解) 2.3 数据模型2.3.1 **关系型数据库(RDBMS)**2.3.2 数据模型 3. SQL语句3.1 DDL语句3.1.1 数据库操作3.1.1.1 查询数据库3.1.1.2 创建数据库3.1.1…...
Github 热点项目 Jumpserver开源堡垒机让服务器管理效率翻倍
Jumpserver今日喜提160星,总星飙至2.6万!这个开源堡垒机有三大亮点:① 像哆啦A梦的口袋,支持多云服务器一站式管理;② 安全审计功能超硬核,操作记录随时可回放;③ 网页终端无需装插件࿰…...
第七届传智杯全国IT技能大赛程序设计赛道 国赛(总决赛)—— (B组)题解
1.小苯的木棍切割 【解析】首先我们先对数列排序,找到其中最小的数,那么我们就保证了对于任意一个第i1个的值都会大于第i个的值那么第i2个的值也比第i个大,那么我们第i1次切木棍的时候一定会当第i个的值就变为了0的,第i1减去的应该…...
Netty前置基础知识之BIO、NIO以及AIO理论详细解析和实战案例
前言 Netty是什么? Netty 是一个基于 Java 的 高性能异步事件驱动网络应用框架,主要用于快速开发可维护的协议服务器和客户端。它简化了网络编程的复杂性,特别适合构建需要处理海量并发连接、低延迟和高吞吐量的分布式系统。 1)Netty 是…...
开源身份和访问管理(IAM)解决方案:Keycloak
一、Keycloak介绍 1、什么是 Keycloak? Keycloak 是一个开源的身份和访问管理(Identity and Access Management - IAM)解决方案。它旨在为现代应用程序和服务提供安全保障,简化身份验证和授权过程。Keycloak 提供了集中式的用户…...
深入理解 TCP 协议 | 流量、拥塞及错误控制机制
注:本文为 “TCP 协议” 相关文章合辑。 原文为繁体,注意术语描述差异。 略作重排,如有内容异常,请看原文。 作者在不同的文章中互相引用其不同文章,一并汇总于此。 可从本文右侧目录直达本文主题相关的部分ÿ…...
VSCode远程图形化GDB
VSCode远程图形化GDB 摘要一、安装VSCode1、使用.exe安装包安装VSCode2、VSCode 插件安装3、VSCode建立远程连接 二、core dump找bug1、开启core文件2、永久生效的方法3、编写测试程序4、运行结果5、查看core段错误位置6、在程序中开启core dump并二者core文件大小 三、gdbserv…...
软件工程师中级考试-上午知识点总结(上)
我总结的这些都是每年的考点,必须要记下来的。 1. 计算机系统基础 1.1 码 符号位0表示正数,符号位1表示负数。补码:简化运算部件的设计,最适合进行数字加减运算。移码:与前几种不同,1表示,0表…...
Python+CoppeliaSim+ZMQ remote API控制机器人跳舞
这是一个使用Python和CoppeliaSim(V-REP)控制ASTI人型机器人进行舞蹈动作的演示项目。 项目描述 本项目展示了如何使用Python通过ZeroMQ远程API与CoppeliaSim仿真环境进行交互,控制ASTI人型机器人执行预定义的舞蹈动作序列。项目包含完整的机…...
基于FreeRTOS和STM32的微波炉
一、项目简介 使用STM32F103C8T6、舵机、继电器、加热片、蜂鸣器、两个按键、LCD及DHT11传感器等硬件。进一步,结合FreeRTOS和状态机等软件实现了一个微波炉系统;实现的功能包含:人机交互、时间及功率设置、异常情况处理及固件升级等。 二、…...
维度建模工具箱 提纲与总结
这里写自定义目录标题 基本概念事实表和维度表BI(Business Intelligence) 产品 事实表事实表的粒度事实表的种类 维度表建模技术基本原则避免用自然键作为维度表的主键,而要使用类似自增的整数键避免过度规范化避免变成形同事实表的维度表 SCD(Slowly Changed Dimen…...
【沉浸式求职学习day21】【常用类分享,完结!】
沉浸式求职学习 String类(完结) 和 equals的区别 StringBuffer日期类DateCalendar File类 String类(完结) 上次讲了一些创建String类实例的方法。 今天要分享的第一个点是常考的关于String的面试题 和 equals的区别 首先是&…...
国防科大清华城市空间无人机导航推理!GeoNav:赋予多模态大模型地理空间推理能力,实现语言指令导向的空中目标导航
作者: Haotian Xu 1 ^{1} 1, Yue Hu 1 ^{1} 1, Chen Gao 2 ^{2} 2, Zhengqiu Zhu 1 ^{1} 1, Yong Zhao 1 ^{1} 1, Yong Li 2 ^{2} 2, Quanjun Yin 1 ^{1} 1单位: 1 ^{1} 1国防科技大学系统工程学院, 2 ^{2} 2清华大学论文标题:Geo…...
uniapp打ios包
uniapp在windows电脑下申请证书并打包上架 前言 该开发笔记记录了在window系统下,在苹果开发者网站生成不同证书,进行uniapp打包调试和上线发布,对window用户友好 注:苹果打包涉及到两种证书:开发证书 和 分发证书 …...
Redis 的指令执行方式:Pipeline、事务与 Lua 脚本的对比
Pipeline 客户端将多条命令打包发送,服务器顺序执行并一次性返回所有结果。可以减少网络往返延迟(RTT)以提升吞吐量。 需要注意的是,Pipeline 中的命令按顺序执行,但中间可能被其他客户端的命令打断。 典型场景&…...
(14)VTK C++开发示例 --- 将点投影到平面上
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 计算一个点在一个平面上的投影。 vtkPlane 是 VTK(Visualization Toolkit)库中的一个类&…...
快速搭建 Cpolar 内网穿透(Mac 系统)
1、Cpolar快速入门教程(官方) 链接地址:Cpolar 快速入门 2、官方教程详解 本地安装homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个是从 git 上拉取的&#x…...
【Flink SQL实战】 UTC 时区格式的 ISO 时间转东八区时间
文章目录 一、原始数据格式二、解决方案三、其他要求 在实际开发中,我们常常会遇到此类情况:数据源里的时间格式是类似 2025-04-21T09:23:16.025Z 这种带 TimeZone 标识的 ISO 8601 格式,而我们需要在 Flink SQL 中将其转换成北京时间显示。 …...
动态监控进程
1.介绍: top和ps命令很相似,它们都是用来显示正在执行的进程,top和ps最大的不同之处,在于top在执行中可以更新正在执行的进程. 2.基本语法: top [选项] 选项说明 ⭐️僵死进程:内存没有释放,但是进程已经停止工作了,需要及时清理 交互操作说明 应用案…...
HADOOP 3.4.1安装和搭建(尚硅谷版~)
目录 1.配置模版虚拟机 2.克隆虚拟机 3.在hadoop102安装JDK 4.完全分布式运行模式 1.配置模版虚拟机 1.安装模板虚拟机,IP地址192.168.10.100、主机名称hadoop100、内存2G、硬盘20G(有需求的可以配置4G内存,50G硬盘) 2.hado…...
第 4 篇:平稳性 - 时间序列分析的基石
第 4 篇:平稳性 - 时间序列分析的基石 在上一篇中,我们学习了如何将时间序列分解为趋势、季节性和残差。我们看到,很多真实世界的时间序列(比如 CO2 浓度)都包含明显的趋势(长期向上或向下)和/…...
DeepSeek赋能Nuclei:打造网络安全检测的“超级助手”
引言 各位少侠,周末快乐,幸会幸会! 今天唠一个超酷的技术组合——用AI大模型给Nuclei开挂,提升漏洞检测能力! 想象一下,当出现新漏洞时,少侠们经常需要根据Nuclei模板,手动扒漏洞文章…...
分享一个python启动文件脚本(django示例)
今天给大家分享一个python启动文件脚本 在日常开发中,我们常常需要运行多条命令来完成“静态收集”“数据库迁移”“启动服务”……如果把这些命令整合到一个脚本里就好了 一、整体流程概览 #mermaid-svg-wA6UnfATaUOfJoPn {font-family:"trebuchet ms"…...
从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!
我正在参加Trae「超级体验官」创意实践征文, 本文所使用的 Trae 免费下载链接: www.trae.ai/?utm_source… 前言 大家好,我是小Q,字节跳动近期推出了一款 AI IDE—— Trae,由国人团队开发,并且限时免费体…...
3200温控板电路解析
提示:文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问: 本文目标: 一、背景 最近重温3200温控板电路设计和芯片选型 3200代码仓 二、 2.1 按照顺序整理,主要是依靠自己想到的来整理 1、传感器是pt1000&…...
opencv图片颜色识别,颜色的替换
图片颜色识别 1. RGB颜色空间2. 颜色加法2.1使用numpy对图像进行加法2.2使用opencv加法(cv2.add) 3 颜色加权加法(cv2.addWeighted())4. HSV颜色空间5. 制作掩膜4. 与运算(cv2.bitwise_and)5.颜色的替换7 R…...
B实验-12
需要注意版本、页面源代码 两个文件一个目录:phpinfo robots phpmyadmin 实验12 靶机1 一个key在phpmyadmin,一个key在回收站 用两个扫描目录的工具扫,nmap给python版 情况1:弱口令 root root root 123456 …...
Python多技术融合在生态参量估算中的创新应用—以蒸散发与植被GPP估算为例
在全球气候变化背景下,精确估算陆地生态系统水碳通量成为生态研究的关键命题。本研究创新性地整合Python编程、遥感数据处理、机器学习算法及生态过程模型,构建了一套高效可靠的蒸散发(ET)与植被总初级生产力(GPP&…...
文件有几十个T,需要做rag,用ragFlow能否快速落地呢?
一、RAGFlow的优势 1、RAGFlow处理大规模数据性能: (1)、RAGFlow支持分布式索引构建,采用分片技术,能够处理TB级数据。 (2)、它结合向量搜索和关键词搜索,提高检索效率。 …...
【网工第6版】第5章 网络互联②
目录 ■ IPV6 ▲ IPV6报文格式 ◎ IPV6扩展报头(RFC2460) ◎ IPv6相关协议 ▲ IPV6地址分类 ◎ IPv6地址基础 ◎ IPv6地址举例 ◎ IPv6地址分类 ◎ 特殊地址对比IPv4 vs IPv6 ▲ 过渡技术 本章重要程度:☆☆☆☆☆ ■ IPV6 与IPv4…...
