MySQL表CRUD(三)

本文涉及的产品
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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之DataWorks还有就是对于mysql中的表已经存在数据了,第一次全量后面增量同步的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
38 2
|
4天前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用合集之mysql通过flink cdc同步数据,有没有办法所有表共用一个dump线程
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
8 0
|
6天前
|
SQL 关系型数据库 MySQL
MySQL第三战:CRUD,函数1以及union&union all
MySQL第三战:CRUD,函数1以及union&union all
|
6天前
|
SQL 存储 关系型数据库
【MySQL】DDL的表操作详解:创建&查询&修改&删除
【MySQL】DDL的表操作详解:创建&查询&修改&删除
|
6天前
|
存储 SQL 关系型数据库
mysql查询数据库表大小怎么操作
mysql查询数据库表大小怎么操作
|
6天前
|
SQL 关系型数据库 MySQL
使用Python的pymysql库连接MySQL,执行CRUD操作
使用Python的pymysql库连接MySQL,执行CRUD操作:安装pymysql,然后连接(host='localhost',user='root',password='yourpassword',database='yourdatabase'),创建游标。查询数据示例:`SELECT * FROM yourtable`;插入数据:`INSERT INTO yourtable...`;更新数据:`UPDATE yourtable SET...`;删除数据:`DELETE FROM yourtable WHERE...`。
29 0
|
6天前
|
存储 SQL 关系型数据库
MySQL表的增删改查---多表查询和联合查询
MySQL表的增删改查---多表查询和联合查询
|
6天前
|
存储 关系型数据库 MySQL
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
22 0
|
6天前
|
存储 关系型数据库 MySQL
|
6天前
|
关系型数据库 MySQL
MySQL 实例employee表综合查询
MySQL 实例employee表综合查询