羊蹓狼 发表于 2024-11-1 17:19:06

【MySQL 保姆级讲授】表数据的操作--下(8)

1. 列值更新 UPDATE

1.1 界说

UPDATE 语句在 SQL 中用于修改表中已有的记载。它允许你更改一个或多个列的值,可以针对表中的所有记载,也可以通过WHERE 子句指定特定的记载。
注意:更新指定列的时候肯定要用条件子句(where)。
语法:
   UPDATE table_name
SET column1 = value1, column2 = value2, …
;
注意事项


[*]WHERE 子句的重要性:如果不使用 WHERE 子句,UPDATE 语句会更新表中的所有记载。这大概会导致意外的数据修改,因此务必谨慎使用。
[*]变乱处理:对于重要的更新操作,发起使用变乱来确保数据的同等性和完整性。如果更新失败,可以回滚变乱以规复到更新前的状态。
[*]性能思量:大规模的更新操作大概会影响数据库性能,特别是在没有适当索引的情况下。确保表上有适当的索引,而且在生产环境中测试更新操作的性能影响。
1.2 示例

使用该表的数据
https://i-blog.csdnimg.cn/direct/9af51ae483a5413a96102d1ec449b4a4.png

[*] 将李白的英语结果更改为60分
命令:update score set english=60 where name ='李白';
https://i-blog.csdnimg.cn/direct/ee60f4a509a4486481a6adcad395113a.png
[*] 将李华的数学和英语都改为70分
命令:update score set math=70, english=70 where name ='李华';
https://i-blog.csdnimg.cn/direct/5a220ee6c84447848d9ccf5a888d0e01.png
[*] 将总结果倒数前三的同砚英语加10分。
查询:select name, chinese+math+english total from score order by total asc limit 3;
https://i-blog.csdnimg.cn/direct/bde5c1da215b4e6f8e63754fc26c70b3.png
更新倒数前三的门生:
命令:update score set english=english +10 order by chinese+math+english limit 3;
https://i-blog.csdnimg.cn/direct/0d934bca8a9641319cadc119d62af093.png
https://i-blog.csdnimg.cn/direct/abeccee8be16438fa8923e0af65948b2.png
[*] 将所有同砚的语文结果翻一倍。
命令:update score set chinese=chinese*2 ;
https://i-blog.csdnimg.cn/direct/726fa9bd393f447d89885c48fa34f9dd.png
注意:更新全表的语句要慎用。
2. 删除数据 DELETE

2.1 界说

DELETE 语句在 SQL 中用于从表中删除记载。它可以删除表中的单个记载、多个记载,或者在没有 WHERE 子句的情况下删除所有记载。
语法:
   DELETE FROM table_name
;
注意事项


[*]WHERE 子句的重要性:如果不使用 WHERE 子句,DELETE 语句会删除表中的所有记载。这大概会导致意外的数据丢失,因此务必谨慎使用。
[*]变乱处理:对于重要的删除操作,发起使用变乱来确保数据的同等性和完整性。如果删除失败,可以回滚变乱以规复到删除前的状态。
[*]性能思量:大规模的删除操作大概会影响数据库性能,特别是在没有适当索引的情况下。确保表上有适当的索引,而且在生产环境中测试删除操作的性能影响。
[*]外键约束:如果表有外键约束,删除主表中的记载时,大概必要处理从表中的相关记载。可以通过设置级联删除(ON DELETE CASCADE)来自动删除从表中的相关记载。
2.2 示例

使用该表操作
https://i-blog.csdnimg.cn/direct/2cc128f2c54a4d2081c90fa93a76d3a0.png

[*] 删除李华地点的一行
命令:delete from score where name='李华';
https://i-blog.csdnimg.cn/direct/8ab0b480e49241cfb41cb9adacce6576.png
[*] 删除全部数据
命令:delete from score;
https://i-blog.csdnimg.cn/direct/bd3f4eab082a4754b313fd3d4cb939a1.png
命令:select * from score;
https://i-blog.csdnimg.cn/direct/f32ca972447549f58ac276c98b770eec.png
[*] 创建一个自增类型的表,插入数据后在删除所有数据。
命令:create table t1(id int unique auto_increment, name varchar(10));
命令:insert into table t1 (name) values('李华', '李明', '李刚');
https://i-blog.csdnimg.cn/direct/f1ac402ed08e417f9ac45cb142f932aa.png
查询创建表命令:show create table t1;
https://i-blog.csdnimg.cn/direct/6a70db1b18394b7da622869080bdb26a.png
删除全部数据命令:delete from t1;
查看创建表
https://i-blog.csdnimg.cn/direct/6da0c26e22a74145a9f10fcb01885a94.png
此时的auto_increment仍旧是4
插入数据:insert into t1 (name) values(‘李华’);
再次查看数据:select * from t1;
https://i-blog.csdnimg.cn/direct/6fcb2c7a4630432cbe3406d26ba8b4f1.png
同砚们可以发现,删除表的全部数据后,auto_increment的值仍旧存在,当插入数据的是时候,auto_increment类型的字段仍旧会按计数值自增。
3. 截断表 TRUNCATE

3.1 界说

TRUNCATE 语句在 SQL 中用于删除表中的所有记载,但它与 DELETE 语句有一些重要的区别。TRUNCATE 通常比 DELETE 更快,而且在某些情况下具有差异的行为。
语法:
   TRUNCATE TABLE table_name;
注意:这个操作慎用

[*]只能对整表操作,不能像 DELETE 一样针对部分数据操作;
[*]实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
[*]会重置 AUTO_INCREMENT 项
3.2 示例


[*]准备测试表
命令:create table t1 (id int unique auto_increment, name varchar(10));
命令:insert into t1 (name) values('李明'), ('李华');
命令:select * from t1;
https://i-blog.csdnimg.cn/direct/2148bf6cc2de466494583bb3d2a8ec34.png
[*]删除表数据
查看创建表命令:show table t1;
https://i-blog.csdnimg.cn/direct/e6a8bcf271c84e6e93044b771875374d.png
删除表数据,在次查看创建表
命令:truncate table t1;
命令:show table t1;
https://i-blog.csdnimg.cn/direct/32b76e0efb5b471b87436f478970fe75.png
此时已经不存在auto_increment的值了
再次插入数据,然后查询数据
命令:insert into t1 (name) values('李华');
命令:select * from t1;
https://i-blog.csdnimg.cn/direct/84841baf459b4fcf915d52378a992766.png
同砚们可以看到,插入数据后,id是从1开始的。所以,truncate删除数据也把auto_increment的值也清空了。
3.3 日记

TRUNCATE 通常只记载一个操作,而 DELETE 会为每条删除的记载记载一个操作。
日记:

[*]bin log:用于主从复制,记载所有对数据库的更改操作(如 INSERT、UPDATE、DELETE),以便从库可以同步这些更改。
[*]redo log:确保变乱的持久性。当数据库崩溃后,可以通过重做日记将未完成的变乱重新实行,以规复数据到同等状态。
[*]undo log:当变乱必要回滚时,使用撤销日记来规复数据到变乱开始前的状态。
4.插入查询结果

4.1 界说

插入查询结果(也称为子查询插入或 INSERT … SELECT 语句)是一种在 SQL 中非常有用的技术,它允许你将一个查询的结果插入到另一个表中。这种操作通常用于批量插入数据、从一个表复制数据到另一个表、或者将复杂查询的结果存储到新表中。
语法:
   INSERT INTO target_table (column1, column2, …)
SELECT column1, column2, …
FROM source_table
;
4.2 示例

办理问题:删除表t1中的的重复复记载,重复的数据只能有一份
https://i-blog.csdnimg.cn/direct/e3c06773d3f641df9b147d965b33f399.png
同砚们是不是想到了distinct,但distinct是对查询的结果取重,问题想办理的是原表的数据去重。
办理思路:
(1)用like创建一个新表
(2)用distinct查询到的数据插入到新表中
(3)用renaem更改新表和旧表的名字

[*]CREATE TABLE ... LIKE 语法,它允许你基于现有的表结构创建一个新表。这种语法重要用于复制现有表的结构,而不复制数据。
命令:create table new_t1 like t1;
https://i-blog.csdnimg.cn/direct/984349a4abc84db78e63a46058e90bd8.png
[*]用distinct查询的结果插入到new_t1表中
省略插入的列表示插入全列。
命令:insert into new_t1 select distinct id, name from t1;
https://i-blog.csdnimg.cn/direct/29198bcadfc1413697c7c19f11f2ba15.png
[*]修改表名
命令:rename table t1 to old_t1;
命令:rename table new_t1 to t1;
https://i-blog.csdnimg.cn/direct/ba9aae10794143cf951438e60cbf224c.png
查看修改后的数据:select * from t1;
https://i-blog.csdnimg.cn/direct/30bc98224411429eada4f0cf0d0373d2.png
5. 聚合函数

5.1 界说

函数说明COUNT( expr)返回查询到的数据的 数量SUM( expr)返回查询到的非空数据的 总和,不是数字没有意义AVG( expr)返回查询到的非空数据的 匀称值,不是数字没有意义MAX( expr)返回查询到的非空数据的 最大值,不是数字没有意义MIN( expr)返回查询到非空数据的 最小值,不是数字没有意义 count解释:


[*]count(column_name):计算指定列中的非 NULL 值的数量
[*]count(*):计算所有行的数量(包括 NULL 值)
5.2 示例

对t1表进行操作
https://i-blog.csdnimg.cn/direct/6be4ac9468ca4deea4b07302d6a07d4f.png

[*] 使用count(*)做统计,不受 NULL影响
命令:select count(*) from t1;
https://i-blog.csdnimg.cn/direct/fb91a67cff5c48d2b1e16477e4053846.png
[*] 使用count(name),不统计统计非NULL
命令:select count(name) from t1;
https://i-blog.csdnimg.cn/direct/80b4893cc7bd4b9aa852600e7d011a33.png
[*] 使用count(distinct id) ,去重id 的数量。
命令:select count(distinct id) from t1;
https://i-blog.csdnimg.cn/direct/a50032f48d5846d3b05fec6d320ed713.png
[*] sun(score)统计分数的和
命令:select sun(score) from t1;
https://i-blog.csdnimg.cn/direct/c87672cd0adc4fd79be64eae695bd558.png
[*] 统计score小于70分的和
命令:select sun(score) from t1 where score<70;
https://i-blog.csdnimg.cn/direct/d413bde74abf45bd9cb51606bff092d3.png
[*] 统计score小于70分的和,没有结果返回为空。
命令:select sum(score) from t1 where score < 30;
https://i-blog.csdnimg.cn/direct/88c04bfc1f6d4ef8be7d118caef348d0.png
[*] avg()统计匀称分
命令:select avg(score) from t1;
https://i-blog.csdnimg.cn/direct/ecee283d9f494cd5ac8b10da013233a1.png
8.max 统计最高分
命令:select max(score) from t1;
https://i-blog.csdnimg.cn/direct/17a03014e82749568711b136139dffe7.png

[*]min()找出高于或便是60的最低分
select min(score) from t1 where score >=60;
https://i-blog.csdnimg.cn/direct/10c59dd119d7471d93a845d95dad3285.png
6. 分组聚合 GROUP BY

6.1 界说

GROUP BY 子句在 SQL 中用于将数据按照一个或多个列进行分组。它的重要作用是将具有相同值的行组合在一起,以便可以对每个组实行聚合函数(如 SUM、COUNT、AVG 等)或其他操作。GROUP BY 通常与聚合函数一起使用,以生成汇总陈诉。
语法:
   SELECT column1, column2, aggregate_function(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2;
说明:


[*]column1, column2:用于分组的列。
[*]aggregate_function(column3):对每个组应用的聚合函数,例如 SUM、COUNT、AVG 等。
[*]table_name:要查询的表名。
[*]condition:可选的 WHERE 子句,用于筛选数据。
注:查询的信息只能是进行分组的字段名和被聚合的字段名。
6.2 示例

对表emp进行操作
https://i-blog.csdnimg.cn/direct/a3d895c16cca43e58b28707b17696e6a.png

[*] 查询每个部分的最高工资和匀称工资
命令:select department, max(salary), avg(salary) from emp group by deparment;
https://i-blog.csdnimg.cn/direct/89ddeca2153e418a85c43af05637211e.png
错误示例:
命令:select department,name, max(salary), avg(salary) from emp group by deparment;
https://i-blog.csdnimg.cn/direct/e2d0a23e2d44418086ac39f9f4ae89e8.png
查询的信息不是随意可查询的,只能是进行分组的字段名和被聚合的字段名。
[*] 每个部分的差异性别的匀称工资和最高工资
命令:select department,gender, max(salary),avg(salary) from emp group by department, gender;
https://i-blog.csdnimg.cn/direct/4910c9c7c1b84cada6ead1b0572d55ba.png
[*] 查询匀称工资低于1万的部分
命令:select department, avg(salary) from emp group by department having avg(salary) < 10000;
https://i-blog.csdnimg.cn/direct/cc5f40336f6c49908bdf31b739a61311.png
7. where VS having

7.1 where VS having

先看两个命令:


[*] having:select name, salary sal from emp having sal>10000;
https://i-blog.csdnimg.cn/direct/9f31b184479e41ebb10c41ea45fd9882.png
[*] where:select name, salary sal from emp having sal>10000;
https://i-blog.csdnimg.cn/direct/d602b89818564037adf38cf856aec30d.png
这是为什么呢?
答:子句的实行次序差异,从上可以看出,where比having的优先级更高。
https://i-blog.csdnimg.cn/direct/6df41d326c804ccebe5c73adfbe0757f.png
7.2 “ MySQL统统为表 ”

扫除女生,只用男生做部分分组和薪资聚合,找出匀称薪资大于1万的部分
命令:
   select department, avg(salary)
from emp
where gender !=‘女’
group by department
having avg(salary) > 10000;
https://i-blog.csdnimg.cn/direct/d51eddc3bb3743ecbbc964ce08d5e3e0.png
实行的步调:
https://i-blog.csdnimg.cn/direct/c95cc49d493744eb851cdf871f2c03a0.png
换种角度来看:
不要单纯的以为,只有磁盘上表结构导入到mysql,真实存在的表才叫做表。
实在,在sql语句实行中,中间筛选出来的、最闭幕果,都可以看做为逻辑上的表。“MySQL统统为表”
未来只要我们能处理好单表的CURD,所有的sql场景,我们全部都能用同一的方式进行。
好比:

[*]from emp :相称于对表的第一步操作,提取表数据,然后表现出表1
[*]where gender !='女':对表1进行筛选,筛选出不为女生的数据,筛选后的表为表2
[*]group by deparment:对表2进行分组,分组后的表为表3
[*]select department, avg(salary):对表3进行查询和聚合,操作后的表为表4
[*]having avg(salary):对表4进行筛选,筛选后的表为表5,表5作为末了的实行结果表现出来。
https://i-blog.csdnimg.cn/direct/05552f535e8846ef966e371ec195ca98.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【MySQL 保姆级讲授】表数据的操作--下(8)