数据库拓展操作

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

目录
一、截断表:
操作目的:
操作内容:
性能影响:
根本语法:
例子:
二、插入查询结果:
根本语法:
例子:
三、聚合函数:
常用函数:
根本语法:
例子:
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 语句)要好得多。
删除表
删除表的操作涉及到更多的元数据处置惩罚,需要更新数据库的体系目录来移除表的界说信息,因此在某些情况下大概会比截断表稍微慢一些,尤其是当表存在大量相关依赖对象时。

根本语法:

  1. truncate table table_name;
复制代码
table_name 是要截断的表的名称。
        如果表中有自增列(如 MySQL 中的 AUTO_INCREMENT 列),截断表会将自增列的值重置为初始值(通常为 1)。这在需要重新开始计数的场景中非常有用。

例子:

  1. -- 创建测试表
  2. create table t_truncate (
  3. id INT PRIMARY KEY AUTO_INCREMENT,
  4. name VARCHAR(20)
  5. );
  6. -- 插入测试数据
  7. insert into t_truncate (name) values ('A'), ('B'), ('C');
  8. -- 查看测试表
  9. select * from t_truncate;
复制代码


  1. -- 截断表
  2. truncate table t_truncate;
  3. -- 查看表
  4. select * from t_truncate;
复制代码


  1. -- 继续写入数据(只写了name,没有写id)
  2. insert into t_truncate (name) values ('D');
  3. -- 查看表(自增主键从1开如计数)
  4. select * from t_truncate;
复制代码

如果是截断表,自增列被重置了,(如 上面的例子 id 重新从 1 开始计数)。
如果是删除表,表的自增列会随着表一起被删除。(这里不演示)。


   二、插入查询结果:

          插入查询结果指的是将一个查询语句的结果插入到另一个表中。好比将一个表的部分数据复制到另一个表,或者归并多个表的数据等。
下面演示的例子是吧一张表的数据去重后给到另一张表。

根本语法:

  1. insert into target_table
  2. select column1, column2, ...
  3. from source_table
  4. [where condition];
复制代码


  • target_table:要插入数据的目标表。
  • column1, column2, ...:从源表中选择的列,这些列会对应插入到目标表中。
  • source_table:查询数据的源表。
  • WHERE condition(可选):筛选源表数据的条件。

例子:

  1. -- 创建测试表
  2. create table t_recored (
  3.   id int,
  4.   name varchar(20)
  5. );
  6. -- 构造测试数据
  7. insert into t_recored VALUES
  8. (100, 'aaa'),
  9. (100, 'aaa'),
  10. (200, 'bbb'),
  11. (200, 'bbb'),
  12. (200, 'bbb'),
  13. (300, 'ccc');
  14. -- 查看结果
  15. select * from t_recored;
复制代码


  1. -- 创建一张新表,新表的结构与t_recored相同
  2. create table t_recored_new like t_recored;
  3. -- 查看新表的结构
  4. select * from t_recored_new;
复制代码

 可以看到,新表没有任何数据。
  1. -- 把原表数据去重后,写入去重结果到新表里
  2. insert into t_recored_new (id,name) select distinct id,name from t_recored;
  3. -- 查询新表中的记录,得到去重结果
  4. select * from t_recored_new;
复制代码

 这里,新表就得到了去重后的结果。
如果有需要,就把旧表的表名给到新表来后续维护。
  1. -- 先把旧表名变成 t_recored_old 让出 t_recored 这个名字,再把旧表名给到新表名
  2. rename table t_recored to t_recored_old,t_recored_new to t_recored;
  3. -- 查询结果
  4. select * from t_recored;
复制代码




   三、聚合函数:

  聚合函数是 SQL 中用于对一组值进行计算并返回单个值的函数,常用于统计和汇总数据。
常用函数:

函数分析
count(values)返回查询到的数据的数量
sum(values)返回查询到的数据的总和,不是数字没故意义
avg(values)返回查询到的数据的平均值,不是数字没故意义
max(values)返回查询到的数据的最大值,不是数字没故意义
min(values)返回查询到的数据的最小值,不是数字没故意义
count(*):统计全部记载的数量,无论该记载的列值是否为 null
count(列名):统计指定列中非 null 值的数量。
COUNT、SUM、AVG、MAX、MIN 这些常见的聚合函数,括号内一样平常只能写一个列名。

根本语法:

  1. select aggregate_function(column_name)
  2. from table_name
  3. [where condition]
复制代码


  • aggregate_function:聚合函数名,如 COUNT、SUM 等。
  • column_name:要进行聚合操作的列名。
  • table_name:要查询数据的表名。
  • where condition(可选):筛选记载的条件。

例子:

1.统计exam表中有多少记载:

  1. select count(*) from exam;
复制代码
2.查询 > 70 分以上的数学最低分:

  1. select min(math) from exam where math > 70;
复制代码




   四、Group by 分组查询:

   根本语法:

  1. select column1, aggregate_function(column2)
  2. from table_name
  3. [where condition]
  4. group by column1
  5. [having group_condition];
复制代码


  • column1:用于分组的列名,可以是一个或多个列,多个列名之间用逗号分隔。
  • aggregate_function(column2):对分组后的数据应用的聚合函数,column2 是要进行聚合操作的列。
  • table_name:要查询数据的表名。
  • where condition(可选):在分组之前筛选记载的条件。
  • group by column1:指定按照 column1 列进行分组。
  • having group_condition(可选):在分组之后对分组结果进行筛选的条件

        通常group by 和 having 共同使用的,就如上面所说,如果group by 分组后的结果还需筛选,就不能使用 where 筛选了,要使用 having

例子:

  1. -- 建立测试表
  2. create table emp (
  3. id bigint primary key auto_increment comment '编号',
  4. name varchar(20) not null comment '名字',
  5. role varchar(20) not null comment '角色',
  6. salary decimal(10, 2) not null comment '工资'
  7. );
  8. -- 插入数据
  9. insert into emp values (1, '马云', '老板', 1500000.00);
  10. insert into emp values (2, '马化腾', '老板', 1800000.00);
  11. insert into emp values (3, '小王', '员工', 10000.00);
  12. insert into emp values (4, '小新', '员工', 12000.00);
  13. insert into emp values (5, '刘孟德', '组长', 9000.00);
  14. insert into emp values (6, '张三', '组长', 8000.00);
  15. insert into emp values (7, '孙悟空', '游戏⻆⾊', 956.8);
  16. insert into emp values (8, '猪悟能', '游戏⻆⾊', 700.5);
  17. insert into emp values (9, '沙和尚', '游戏⻆⾊', 333.3);
  18. -- 查看测试表
  19. select * from emp;
复制代码

 1.统计每个角色的人数:

  1. -- 第一种写法
  2. select role, count(*) from emp group by role;
  3. -- 第二种写法
  4. select role, count(role) from emp group by role;
复制代码


 要注意的是:
  1. select name,role, count(role) from emp group by role;
复制代码
如许的写法会堕落,因为对 role 进行 group by 分组时,会有不同的 name 对应着同一个 role 。


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

  1. select role,avg(salary),max(salary),min(salary) from emp group by role;
复制代码

 3.表现平均工资低于1500的角色和它的平均工资:

  1. select role,avg(salary) from emp group by role having avg(salary) < 1500;
复制代码


 总结:

使用时,起首要知道对谁进行分组(group by),分组后要筛选什么条件的数据(having)。






   语法总结:

  1. select [DISTINCT(去重)] 列1, 列2, 聚合函数(...)
  2. from 表名
  3. [where 条件]
  4. [group by 分组列]
  5. [having 分组后条件]
  6. [order by 排序列 [ASC|DESC]]
  7. [limit 偏移量, 数量];
复制代码
 执行顺序:where → group by → having → select → order by

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表