首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据库造神计划第八天---增删改查(CRUD)(4)

数据库造神计划第八天---增删改查(CRUD)(4)

作者头像
寻星探路
发布2025-12-17 18:42:14
发布2025-12-17 18:42:14
2070
举报
文章被收录于专栏:CSDN博客CSDN博客

一、插入查询结果

把一个查询语句的结果,作为另一个插入语句的插入的数据

1、语法

代码语言:javascript
复制
 INSERT INTO table_name [(column [, column ...])] SELECT ...

2、示例

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

代码语言:javascript
复制
# 创建测试表,并构造数据
CREATE TABLE t_recored (id int, name varchar(20));
# 插⼊测试数据
INSERT INTO t_recored VALUES
 (100, 'aaa'),
 (100, 'aaa'),
 (200, 'bbb'),
 (200, 'bbb'),
 (200, 'bbb'),
 (300, 'ccc');
# 查看结果
select * from t_recored;

实现思路:原始表中的数据⼀般不会主动删除,但是真正查询时不需要重复的数据,如果每次查询都使用DISTINCT进行去重操作,会严重效率。可以创建⼀张与 t_recored 表结构相同的表,把去重的记录写⼊到新表中,以后查询都从新表中查,这样真实的数据不丢失,同时又能保证查询效率

代码语言:javascript
复制
# 创建⼀张新表,表结构与t_recored相同
create table t_recored_new like t_recored;
# 新表中没有记录
selec * from t_recored_new;
# 原表中的记录去重后写⼊到新表
insert into t_recored_new select distinct * from t_recored;
# 查询新表中的记录,实现去重
select * from t_recored_new;
代码语言:javascript
复制
# 新表与原来重命名
rename table t_recored to t_recored_old, t_recored_new to t_recored;
# 查询重命名后表中的记录,实现需求且原来中的记录不受影响
select * from t_recored;
代码语言:javascript
复制
select * from t_recored_old;

二、聚合函数

针对查询结果进行一些行级别的"统计"!!!

先查询,再聚合!!!

1、常用函数

2、示例

代码语言:javascript
复制
#创建表结构
CREATE TABLE exam (
    id BIGINT,
    name VARCHAR(20) COMMENT '同学姓名',
    chinese float COMMENT '语⽂成绩',
    math float COMMENT '数学成绩',
    english float COMMENT '英语成绩'
);

#插⼊测试数据 
INSERT INTO exam (name, chinese, math, english) VALUES
    (1, '唐三藏', 134, 98, 56),
    (3, '猪悟能', 176, 98, 90),
    (4, '曹孟德', 140, 90, 67),
    (5, '刘⽞德', 110, 115, 45),
    (6, '孙权', 140, 73, 78),
    (7, '宋公明', 150, 95, 30),
    (8, '张飞', 54 ,0 ,NULL);
2.1COUTN(有多少记录)

(1)统计exam表中有多少记录

代码语言:javascript
复制
# 使⽤ * 做统计
select count(*) from exam;
代码语言:javascript
复制
# 使⽤常量做统计
select count(1) from exam;

(2)统计有多少学生参加数学考试

代码语言:javascript
复制
# 使⽤指定列做统计
select count(math) from exam;

(3)统计有多少学生参加英语考试

代码语言:javascript
复制
# 查看表中的记录
select * from exam;

(张飞没参加英语考试)

代码语言:javascript
复制
# NULL 的数据不会计⼊结果
select count(english) from exam;

(4)统计语文成绩小于50分的学生个数

代码语言:javascript
复制
# 加⼊where条件
select count(chinese) from exam where chinese < 10;

一个 sq| 中有条件,有 order by,有 limit 有聚合函数执行顺序如何的?? 1)遍历表的每一行 2)执行 where,把每一行代入条件 3)获取到列, 表达式求值,定义别名操作, 4)执行 order by 对结果排序 5)执行 limit 进行限制长度 6)再进行聚合

2.2SUM(和)

#注:sum 操作会直接排除 null 值!!!

(1)统计所有学生数学成绩总分

代码语言:javascript
复制
 select sum(math) from exam;

(2)统计所有学生英语成绩总分

代码语言:javascript
复制
# 值为NULL的列不参与统计
select sum(english) from exam;

(3)不能统计非数值的列

代码语言:javascript
复制
select sum(name) from exam;
2.3AVG(平均)

(1)统计英语成绩的平均分

代码语言:javascript
复制
# NULL值不参与统计
select avg(english) from exam;

(2)统计平均总分

代码语言:javascript
复制
select avg(chinese + math + english) as 总分 from exam;
2.4MAX(最大)

(1)查询英语最高分

代码语言:javascript
复制
select max(english) from exam;
2.5MIN(最小)

(1)查询>70分以上的数学最低分

代码语言:javascript
复制
select min(math) from exam where math > 70;

(2)查询数据成绩的最高分与英语成绩的最低分

代码语言:javascript
复制
# 可以使⽤多个聚合函数
select max(math), min(english) from exam;

三、group by分组查询

group by子句的作用是通过⼀定的规则将⼀个数据集划分成若干个小的分组,然后针对若干个分组进行数据处理,比如使用聚合函数对分组进行统计。

1、语法

代码语言:javascript
复制
SELECT {col_name | expr} ,... , aggregate_function (aggregate_expr)
    FROM table_references
    GROUP BY { col_name | expr}, ...
    [H AVING where_condition]

col_name|expr:要查询的列或表达式,可以有多个,必须在 据 GROUP BY 子句中作为分组的依

aggregate_function:聚合函数,比如COUNT(),SUM(),AVG(),MAX(),MIN()

aggregate_expr:聚合函数传入的列或表达式,如果列或表达式不在 GOURP BY 子句中,必须包含中聚合函数中

2、示例

准备测试表及数据职员表emp,列分别为:id(编号),name(姓名),role(角色),salary(薪水)

代码语言:javascript
复制
 drop table if exists emp;
 create table emp (
     id bigint primary key auto_increment,
     name varchar(20) not null,
     role varchar(20) not null,
     salary decimal(10, 2) not null
 );

 insert into emp values (1, '⻢云', '⽼板', 1500000.00);
 insert into emp values (2, '⻢化腾', '⽼板', 1800000.00);
 insert into emp values (3, '张三', '程序员', 10000.00);
 insert into emp values (4, '李四', '程序员', 12000.00);
 insert into emp values (5, '王五', '程序员', 9000.00);
 insert into emp values (6, '赵六', '程序员', 8000.00);
 insert into emp values (7, '孙悟空', '游戏⻆⾊', 956.8);
 insert into emp values (8, '猪悟能', '游戏⻆⾊', 700.5);
 insert into emp values (9, '沙和尚', '游戏⻆⾊', 333.3);
 
select * from emp;

统计每个角色的人数

代码语言:javascript
复制
select role, count(*) from emp group by role;

统计每个角色的平均工资,最高工资,最低工资

代码语言:javascript
复制
select role, ROUND(avg(salary),2) as 平均⼯资, ROUND(max(salary),2) as 最⾼⼯资, ROUND(min(salary),2) as 最低⼯资 from emp group by role;

3、having子句

使用GROUPBY对结果进行分组处理之后,对分组的结果进行过滤时,不能使用WHERE 子句,而要使用 HAVING 子句

显示平均工资低于1500的角色和它的平均工资

代码语言:javascript
复制
select role, avg(salary) from emp group by role having avg(salary) < 1500;

where 同样可以使用 where 的条件是在聚合之前使用的条件 having 的条件是在聚合之后使用的条件

4、Having与Where的区别

(1)Having用于对分组结果的条件过滤

(2)Where用于对表中真实数据的条件过滤

由于内容较多,会分为多篇讲解,预知后续内容,请看后续博客!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、插入查询结果
    • 1、语法
    • 2、示例
  • 二、聚合函数
    • 1、常用函数
    • 2、示例
      • 2.1COUTN(有多少记录)
      • 2.2SUM(和)
      • 2.3AVG(平均)
      • 2.4MAX(最大)
      • 2.5MIN(最小)
  • 三、group by分组查询
    • 1、语法
    • 2、示例
    • 3、having子句
    • 4、Having与Where的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档