MySQL表CRUD(三)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL表CRUD

四、Delete

4.1 删除数据

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...];

SQL中大写的表示关键字,[ ]中代表的是可选项

在删除数据之前需先找到待删除的记录,delete语句中的where、order by和limit用来定位数据

删除孙悟空同学的考试成绩


在删除数据之前,先查看孙悟空同学相关信息,然后在delete语句中指明删除孙悟空对应的记录,并在删除后再次查看确保数据被删除


ed9f7df84bea4b908e9483630075f609.png


删除整张表数据


创建一张测试表,表中包含一个自增长的主键id和姓名


59e3c1450e134edfb2a03d30dd054f4d.png


向表中插入一些测试数据用于删除


0ed3f71eec5e4d63a7d6962ab7c9452b.png


delete语句中只指明要删除数据的表名,而不通过where、order by和limit指明筛选条件,这时将会删除整张表的数据


7e4e1b8f52d841298b09093bc679aa27.png


再向表中插入一些数据,在插入数据时不指明自增长字段的值,这时会发现插入数据对应的自增长id值是在之前的基础上继续增长的


ee6bfdf2b4d24ba287c939f70707fa47.png


查看创建表时的相关信息,存在AUTO_INCREMENT=n的字段,该字段表示下一次插入数据时自增长字段的值应该为n


8e7019d918ad4f7488841840519696ef.png


通过delete语句删除整表数据,不会重置AUTO_INCREMENT=n字段,因此删除整表数据后插入数据,对应的自增长id值会在原来的基础上继续增长


67ceebab953c467f8d81a70886b8ce3f.png


4.2 截断表

TRUNCATE [TABLE] table_name;

SQL中大写的表示关键字,[ ]中代表的是可选项

truncate只能对整表操作,不能像delete一样针对部分数据操作

truncate实际上不对数据操作,所以比delete更快

truncate在删除数据时不经过真正的事务,所以无法回滚

truncate会重置AUTO_INCREMENT=n字段

创建一张测试表,表中包含一个自增长的主键id和姓名

eba47ad0cfa34f55bfd2b609cb594f6a.png



向表中插入一些测试数据用于删除


22de3b52a59e484eac00e7c857bf5f28.png


在truncate语句中只指明要删除数据的表名,此时会删除整张表数据,但由于truncate不对数据操作,因此执行truncate语句后看到影响行数为0

62137278a4e149f09485c66e47f80339.png



再向表中插入一些数据,在插入数据时不指明自增长字段的值,这时会发现插入数据对应的自增长id值是重新从1开始增长的


4437fdec1b6b4a2eb665683c362d8da3.png


查看创建表时的相关信息时也可以看到,有一个AUTO_INCREMENT=n字段,该字段表示下一次插入数据时自增长字段的值应该为n


cdc2197de5c64c8dbbd07cba7656dffd.png


使用truncate语句删除整表数据时,会重置AUTO_INCREMENT字段,因此截断表后插入数据对应的自增长id值会重新从1开始增长


五、插入查询结果

INSERT [INTO] table_name [(column1 [, column2] ...)] SELECT ... [WHERE ...] [ORDER BY ...] [LIMIT ...];

SQL中大写的表示关键字,[ ]中代表的是可选项

SQL的作用是将筛选出来的记录插入到指定的表中

SQL中的column,表示将筛选出的记录的各个列插入到表中的哪一列

删除表中重复的记录,重复的数据只能有一份


创建一张测试表,表中包含id和姓名


17cd809527f8490e8068e63107142468.png


向测试表中插入一些测试数据,数据中存在重复的记录


e313f5ac5be740f58801bddbc848a315.png


现在要求删除测试表中重复的数据,思路如下:


创建一张临时表,该表的结构与测试表的结构相同

以去重的方式查询测试表中的数据,并将查询结果插入到临时表中

将测试表重命名为其他名字,再将临时表重命名为测试表的名字,实现原子去重操作

由于临时表的结构与测试表相同,因此在创建临时表的时候可以借助like进行创建


9b07d99f384a42f88382f81ddd82fbbb.png


通过插入查询语句将去重查询后的结果插入到临时表中,由于临时表和测试表的结构相同,并且select进行的是全列查询,因此在插入时不用在表名后指明column列表


ee171964414d4b7e8ca1df4a2685ccb4.png


将测试表重命名为其他名字(相当于对去重前的数据进行备份,若不需要可直接删除),将临时表重命名为测试表的名字,这时便完成了表中数据的去重操作


188c55f446734ab0b5c95e20298d8515.png


六、聚合函数

聚合函数对一列值执行计算并返回单一的值


49a8cdc4e9eb4eab8e771ea8c00e48c6.png


统计班级共有多少同学


使用之前的学生表进行演示,表中数据如下:


d60c13d6915a45d3b6c8d696b5e72641.png


在select语句中使用count函数,并将*作为参数传递给count函数,这时便能统计出表中的记录条数


938e79d258c54e389011e4b295976143.png


在select语句中使用count函数,并将表达式作为参数传递给count函数,这时也可以统计出表中的记录条数

97413953ed8e4e47991bb210fb62bd4b.png



相当于在查询表中数据时,自行新增了一列列名为特定表达式的列,用count函数统计该列中有多少个数据,等价于统计表中有多少条记录


a71bfb45725d4a7aaf35cd63ff318bba.png


统计班级收集的QQ号有多少个


在select语句中使用count函数统计qq列中数据的个数,这时便能统计出表中QQ号的个数


4cfa4dfad8c94c60ada9bba84d411153.png


若count函数的参数是一个确定的列名,那么count函数将会忽略该列中的NULL值


统计本次考试数学成绩的分数个数


使用之前的成绩表来进行演示


88139abd4cd44fc5b084bb35a89ac491.png


在select语句中使用count函数统计math列中数据的个数,这时便能统计出表中的数学成绩的个数


67838f7e73644d368b001d3b0be1e503.png


统计本次考试数学成绩的分数个数(去重)


在使用count函数时(包括其他聚合函数),在传递的参数之前加上distinct,这时便能统计出表中数学成绩去重后的个数


a9ce1e40255c4de2828fe58e3de05b2e.png


统计数学成绩总分


在select语句中使用sum函数统计math列中数据的总和,这时便能统计出表中的数学成绩的总和


723c2ff634434b96a2dc7f8b9c72ac27.png


统计不及格的数学成绩总分


在where子句中指明筛选条件为数学成绩小于60分,在select语句中使用sum函数统计math列中数据的总和


737142bad68046d3bdff985002693c23.png


由于当前没有数学不及格的同学,因此求和结果为NULL


统计平均总分


在select语句中使用avg函数计算总分的平均值


7769b3d389064a4588093f782effe9c1.png


返回英语最高分


在select语句中使用max函数查询英语成绩最高分


8ecc5487ed214616b3e933e835ccbdf2.png


返回70分以上的英语最低分


在where子句中指明筛选条件为英语成绩大于70分,在select语句中使用min函数查询英语成绩最低分



e24ae4c23cf04c30ab12be9eab05655e.png

七、分组查询

SELECT column1 [, column2], ... FROM table_name [WHERE ...] GROUP BY column [, ...] [order by ...] [LIMIT ...];

SQL中大写的表示关键字,[ ]中代表的是可选项

查询SQL中各语句的执行顺序为:where、group by、select、order by、limit

group by后面的列名,表示按照指定列进行分组查询

7.1 分组查询测试表 —— 雇员信息表

雇员信息表内容


雇员信息表中包含三张表,分别是员工表(emp)、部门表(dept)和工资等级表(salgrade)


员工表(emp)中包含如下字段:


雇员编号(empno)

雇员姓名(ename)

雇员职位(job)

雇员领导编号(mgr)

雇佣时间(hiredate)

工资月薪(sal)

奖金(comm)

部门编号(deptno)

部门表(dept)中包含如下字段:


部门编号(deptno)

部门名称(dname)

部门所在地点(loc)

工资等级表(salgrade)中包含如下字段:


等级(grade)

此等级最低工资(losal)

此等级最高工资(hisal)

雇员信息表SQL

DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `scott`;
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',
  `dname` varchar(14) DEFAULT NULL COMMENT '部门名称',
  `loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
  `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
  `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
  `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);
DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (
  `grade` int(11) DEFAULT NULL COMMENT '等级',
  `losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',
  `hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);
insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);


显示每个部门的平均工资和最高工资


在group by子句中指明按照部门号进行分组,在select语句中使用avg函数和max函数,分别查询每个部门的平均工资和最高工资

6f625d67762445f599d06018978b399f.png



上述SQL会先将表中的数据按照部门号进行分组,然后各自在组内做聚合查询得到每个组的平均工资和最高工资


显示每个部门的每种岗位的平均工资和最低工资


在group by子句中指明依次按照部门号和岗位进行分组,在select语句中使用avg函数和min函数,分别查询每个部门的每种岗位的平均工资和最低工资


b2f46548a5004ad9936825e5ff637cdb.png


group by子句中可以指明按照多个字段进行分组,各个字段之间使用逗号隔开,分组优先级与书写顺序相同

如上述SQL中,当两条记录的部门号相同时,将会继续按照岗位进行分组

7.2 HAVING条件

SELECT ... FROM table_name [WHERE ...] [GROUP BY ...] [HAVING ...] [order by ...] [LIMIT ...];

SQL中大写的表示关键字,[ ]中代表的是可选项

SQL中各语句的执行顺序为:where、group by、select、having、order by、limit

having子句中可以指明一个或多个筛选条件

having子句和where子句的区别


where子句放在表名后面,而having子句必须搭配group by子句使用,放在group by子句的后面

where子句是对整表的数据进行筛选,having子句是对分组后的数据进行筛选

where子句中不能使用聚合函数和别名,而having子句中可以使用聚合函数和别名

SQL中各语句的执行顺序


根据where子句筛选出符合条件的记录

根据group by子句对数据进行分组

将分组后的数据依次执行select语句

根据having子句对分组后的数据进行进一步筛选

根据order by子句对数据进行排序

根据limit子句筛选若干条记录进行显示

显示平均工资低于2000的部门和它的平均工资


先统计每个部门的平均工资

然后通过having子句筛选出平均工资低于2000的部门


b4d390c504ff41d5b9ee6aa5e78a038f.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
6天前
|
关系型数据库 MySQL 数据库
MySQL 表的CRUD与复合查询
【9月更文挑战第26天】本文介绍了数据库操作中的 CRUD(创建、读取、更新、删除)基本操作及复合查询。创建操作使用 `INSERT INTO` 语句插入数据,支持单条和批量插入;读取操作使用 `SELECT` 语句查询数据,可进行基本查询、条件查询和排序查询;更新操作使用 `UPDATE` 语句修改数据;删除操作使用 `DELETE FROM` 语句删除数据。此外,还介绍了复合查询,包括连接查询(如内连接、左连接)和子查询,以及聚合函数与分组查询,并提供了示例代码。
|
2月前
|
前端开发 Java 关系型数据库
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
166 0
|
3月前
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
|
3月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表
|
3月前
|
运维 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在处理MySQL表新增数据记录时,没有正确触发变更事件,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
关系型数据库 MySQL
蓝易云 - 如何修复MySQL中损坏的表
最后,为了防止数据丢失,定期备份数据是非常重要的。
144 3
|
4月前
|
SQL 关系型数据库 MySQL
ClickHouse(23)ClickHouse集成Mysql表引擎详细解析
ClickHouse的MySQL引擎允许执行`SELECT`查询从远程MySQL服务器。使用`MySQL('host:port', 'database', 'table', 'user', 'password'[,...])`格式连接,支持简单`WHERE`子句在MySQL端处理,复杂条件和`LIMIT`在ClickHouse端执行。不支持`NULL`值,用默认值替换。系列文章涵盖ClickHouse安装、集群搭建、表引擎解析等主题。[链接](https://zhangfeidezhu.com/?p=468)有更多
184 0
|
4月前
|
SQL 缓存 关系型数据库
MySQL操作全攻略:库、表、数据、事务全面指南
MySQL操作全攻略:库、表、数据、事务全面指南
|
4月前
|
SQL 关系型数据库 MySQL
经验大分享:MySQL(三)数据库表的查询操作【重要】
经验大分享:MySQL(三)数据库表的查询操作【重要】
45 0
下一篇
无影云桌面