数据库拓展操作
目录一、截断表:
操作目的:
操作内容:
性能影响:
根本语法:
例子:
二、插入查询结果:
根本语法:
例子:
三、聚合函数:
常用函数:
根本语法:
例子:
1.统计exam表中有多少记载:
2.查询 > 70 分以上的数学最低分:
四、Group by 分组查询:
根本语法:
例子:
1.统计每个角色的人数:
2.统计每个角色的平均工资,最高工资,最低工资:
3.表现平均工资低于1500的角色和它的平均工资:
总结:
语法总结:
一、截断表:
截断表和删除表是数据库中两种删除数据的操作,但是又有不同之处:
操作目的:
截断表:
重要目的是快速清空表中的全部数据,但保留表的结构,包罗表的界说、列名、数据类型、约束条件(如主键、外键、唯一约束等)以及索引等,以便后续可以继续向该表中插入新的数据。
删除表:
是要将整个表从数据库中彻底移除,包罗表的结构和表中的全部数据,删除后该表将不复存在,不能再对其进行任何数据操作。
操作内容:
截断表:
仅删除表中的数据行,不会删除表的界说和相关的数据库对象。例如,在 MySQL 中使用 TRUNCATE TABLE table_name; 语句,只是把 table_name 表中的数据清空。
删除表:
会删除表的全部信息,不仅包罗数据,还包罗表的元数据(如列界说、约束、索引等)。在 MySQL 里执行 DROP TABLE table_name; 后,table_name 表及其相关的一切都会被删除。
性能影响:
截断表:
由于是直接释放数据页,不需要逐行删除数据,所以在处置惩罚大量数据时,截断表的性能通常比逐行删除(如使用 DELETE 语句)要好得多。
删除表:
删除表的操作涉及到更多的元数据处置惩罚,需要更新数据库的体系目录来移除表的界说信息,因此在某些情况下大概会比截断表稍微慢一些,尤其是当表存在大量相关依赖对象时。
根本语法:
truncate table table_name; table_name 是要截断的表的名称。
如果表中有自增列(如 MySQL 中的 AUTO_INCREMENT 列),截断表会将自增列的值重置为初始值(通常为 1)。这在需要重新开始计数的场景中非常有用。
例子:
-- 创建测试表
create table t_truncate (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
-- 插入测试数据
insert into t_truncate (name) values ('A'), ('B'), ('C');
-- 查看测试表
select * from t_truncate;
https://i-blog.csdnimg.cn/direct/d6cd236aa40342178a803b087f7d6be4.png
-- 截断表
truncate table t_truncate;
-- 查看表
select * from t_truncate; https://i-blog.csdnimg.cn/direct/30267879c1604225a875d986231ade32.png
-- 继续写入数据(只写了name,没有写id)
insert into t_truncate (name) values ('D');
-- 查看表(自增主键从1开如计数)
select * from t_truncate;
https://i-blog.csdnimg.cn/direct/87b4bafaabd24758ae8e08804652c627.png
如果是截断表,自增列被重置了,(如 上面的例子 id 重新从 1 开始计数)。
如果是删除表,表的自增列会随着表一起被删除。(这里不演示)。
二、插入查询结果:
插入查询结果指的是将一个查询语句的结果插入到另一个表中。好比将一个表的部分数据复制到另一个表,或者归并多个表的数据等。
下面演示的例子是吧一张表的数据去重后给到另一张表。
根本语法:
insert into target_table
select column1, column2, ...
from source_table
;
[*]target_table:要插入数据的目标表。
[*]column1, column2, ...:从源表中选择的列,这些列会对应插入到目标表中。
[*]source_table:查询数据的源表。
[*]WHERE condition(可选):筛选源表数据的条件。
例子:
-- 创建测试表
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;
https://i-blog.csdnimg.cn/direct/ca541181b3a14befa20ba680495c8997.png
-- 创建一张新表,新表的结构与t_recored相同
create table t_recored_new like t_recored;
-- 查看新表的结构
select * from t_recored_new;
https://i-blog.csdnimg.cn/direct/cc64958b9e404a97a8ec8e04b2cad097.png
可以看到,新表没有任何数据。
-- 把原表数据去重后,写入去重结果到新表里
insert into t_recored_new (id,name) select distinct id,name from t_recored;
-- 查询新表中的记录,得到去重结果
select * from t_recored_new; https://i-blog.csdnimg.cn/direct/4689854371d34c1fa5bc06e97254d6c8.png
这里,新表就得到了去重后的结果。
如果有需要,就把旧表的表名给到新表来后续维护。
-- 先把旧表名变成 t_recored_old 让出 t_recored 这个名字,再把旧表名给到新表名
rename table t_recored to t_recored_old,t_recored_new to t_recored;
-- 查询结果
select * from t_recored; https://i-blog.csdnimg.cn/direct/875231931dfa40b79b4a24bd880f0e03.png
三、聚合函数:
聚合函数是 SQL 中用于对一组值进行计算并返回单个值的函数,常用于统计和汇总数据。
常用函数:
函数分析count(values)返回查询到的数据的数量sum(values)返回查询到的数据的总和,不是数字没故意义avg(values)返回查询到的数据的平均值,不是数字没故意义max(values)返回查询到的数据的最大值,不是数字没故意义min(values)返回查询到的数据的最小值,不是数字没故意义 count(*):统计全部记载的数量,无论该记载的列值是否为 null。
count(列名):统计指定列中非 null 值的数量。
COUNT、SUM、AVG、MAX、MIN 这些常见的聚合函数,括号内一样平常只能写一个列名。
根本语法:
select aggregate_function(column_name)
from table_name
[*]aggregate_function:聚合函数名,如 COUNT、SUM 等。
[*]column_name:要进行聚合操作的列名。
[*]table_name:要查询数据的表名。
[*]where condition(可选):筛选记载的条件。
例子:
1.统计exam表中有多少记载:
select count(*) from exam; 2.查询 > 70 分以上的数学最低分:
select min(math) from exam where math > 70;
四、Group by 分组查询:
根本语法:
select column1, aggregate_function(column2)
from table_name
group by column1
;
[*]column1:用于分组的列名,可以是一个或多个列,多个列名之间用逗号分隔。
[*]aggregate_function(column2):对分组后的数据应用的聚合函数,column2 是要进行聚合操作的列。
[*]table_name:要查询数据的表名。
[*]where condition(可选):在分组之前筛选记载的条件。
[*]group by column1:指定按照 column1 列进行分组。
[*]having group_condition(可选):在分组之后对分组结果进行筛选的条件
[*]
通常group by 和 having 共同使用的,就如上面所说,如果group by 分组后的结果还需筛选,就不能使用 where 筛选了,要使用 having 。
例子:
-- 建立测试表
create table emp (
id bigint primary key auto_increment comment '编号',
name varchar(20) not null comment '名字',
role varchar(20) not null comment '角色',
salary decimal(10, 2) not null comment '工资'
);
-- 插入数据
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; https://i-blog.csdnimg.cn/direct/a8b9fafda29c4588aef20159987d34d7.png
1.统计每个角色的人数:
-- 第一种写法
select role, count(*) from emp group by role;
-- 第二种写法
select role, count(role) from emp group by role;
https://i-blog.csdnimg.cn/direct/686368f95b6f43009ef2434840285d43.png
要注意的是:
select name,role, count(role) from emp group by role; 如许的写法会堕落,因为对 role 进行 group by 分组时,会有不同的 name 对应着同一个 role 。
2.统计每个角色的平均工资,最高工资,最低工资:
select role,avg(salary),max(salary),min(salary) from emp group by role; https://i-blog.csdnimg.cn/direct/0b1f7d2e70484f8698c6550fce1100db.png
3.表现平均工资低于1500的角色和它的平均工资:
select role,avg(salary) from emp group by role having avg(salary) < 1500; https://i-blog.csdnimg.cn/direct/ea24e0e881444a1e8f6327be7d3972e0.png
总结:
使用时,起首要知道对谁进行分组(group by),分组后要筛选什么条件的数据(having)。
语法总结:
select 列1, 列2, 聚合函数(...)
from 表名
]
; 执行顺序:where → group by → having → select → order by
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]