mysql 常见数据处理 dml

学习完,mysql正则表达式查询,把常见的数据处理,做一个汇总,便于查看。

数据操纵语言(Data Manipulation Language, DML)。

1,新增数据:

1,单个插入:

sql 复制代码
insert into table (id, value) 
values(1,2);

2,多个插入:

sql 复制代码
insert into table (id, value) 
values(1,2),(2,3),(3,4)...;

3,复制表格插入:

0,只复制表结构

语法:

sql 复制代码
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2;
-- 或者
CREATE TABLE 新表 LIKE 旧表;

例子:

sql 复制代码
CREATE TABLE staff LIKE employee;
1,指定字段:
sql 复制代码
insert into table2(field1,field2,...) 
select value1,value2,... from table1;
2,复制全部:
sql 复制代码
insert into table2 select * from table1;
3,复制部分数据:
sql 复制代码
insert into table2 select * from table1 where 条件 ;
复制代码
比如:
sql 复制代码
INSERT into WARNING_NOTICE(mod, is_sms, is_mail)  
SELECT mod, '0BT', '0BT' FROM ws_open_model WHERE state = 'A';

2,修改数据:

1,更新单个字段:

sql 复制代码
 UPDATE open_transfer_link SET on_after_create_type = 'java'  
 WHERE link_id = 8;

2,更新多个字段:

sql 复制代码
UPDATE open_transfer_link SET on_after_create_type = 'java', 
 on_after_create = "processService.turnAfter()"
WHERE link_id = 8;

3,联合更新:

join
sql 复制代码
 UPDATE table_a a
LEFT JOIN
table_b  b
ON a.id= b.id
SET a.name = b.name
WHERE a.name != '';
直接关联的
sql 复制代码
-- 写一起的方式
UPDATE staff sf, tenant t, role_assign ra 
SET ra.effect_type = t.tenant_level, ra.effect_id = t.tenant_id 
WHERE sf.staff_id = t.create_staff_id
AND sf.tenant_id = t.tenant_id;
修改这个,mysql支持直接关联的,update直接带其它表的,pg的就不支持,平时写的时候,用join的方式去写。
用子查询的方式:

把目标值查出来。用in的方式:

sql 复制代码
UPDATE fc_basic  fb SET  fb.timeout = 0
WHERE fb.id IN (SELECT fb.id FROM  sc_table sc
WHERE fb.id = sc.id
AND fb.state = 'F' 
AND fb.timeout = 1) ;  

4,数据表修改优化

MySQL 的 ALTERTABLE 操作性能对大表来说是个问题。MySQL 执行修改表结构操作的方法是,用新的结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表。

这一操作需要花费大量时间,如果内存不足而表数据很大,并且索引较多的情况,会造成长时间的锁表。有极端的情况,有些 ALTERTABLE 操作需要花费数个小时甚至数天才能完成。

这里推荐两种小技巧:

1,先把数据库拷贝到一台非生产服务器上,在上面做修改表操作,此时的修改不会影响生产库。修改完毕以后在做数据库的切换,把非生产数据库切换成生产库。不过需要注意的时候,在做表结构修改的时候,生产库会生成一些数据。这里需要通过脚本根据时间区间导入这部分数据。

2,"影子拷贝",即生成一张表结构相同的不同名新数据表(更改数据结构以后的表)。

然后导入原表的数据到新表,导入成功以后停止数据库,修改原表和新表的名字,最终将数据访问指向新表。

在运行正常以后,将原表删除。这里有现成的工具可以协助完成上述操作,"online schema change","openark toolkit"

如果只是删除或者更改某一列的默认值,那么直接可以使用 Alert table modify column 和 Alert table alert column 来实现。

3,删除数据:

1,删除全部数据:

TRUNCATE TABLE 表名:是全删,主键对应的字段会重新置为1,全表删除效率比delete要快。

1,删除数据,但id不变:
sql 复制代码
delete from 表名;
2,删除数据,id重置:
sql 复制代码
TRUNCATE TABLE 表名;

2,根据条件删除数据:

sql 复制代码
DELETE FROM person WHERE id=11;

删除数据一定要注意,把条件放到一行。换行的,如果没选到,容易造成误删。

注意:

疑问1:插入记录时可以不指定字段名称吗?

不管使用哪种 INSERT语法,都必须给出 VALUES的正确数目。如果不提供字段名,则必须给每个字段提供一个值,否则将产生一条错误消息。如果要在INSERT操作中省略某些字段,这些字段需要满足一定条件:该列定义为允许空值;或者表定义时给出默认值,如果不给出值,将使用默认值。

疑问2:更新或者删除表时必须指定WHERE子句吗?

在前面章节中可以看到,所有的UPDATE和DELETE 语句全都在WHERE子句中指定了条件。如果省略WHERE子句,则UPDATE 或DELETE将被应用到表中所有的行。因此,除非确实打算更新或者删除所有记录,否则要注意使用不带WHERE子句的UPDATE或DELETE语句。建议在对表进行更新和删除操作之前,使用SELECT 语句确认需要删除的记录,以免造成无法挽回的结果。

总结:

使用ddl操作数据的时候,尤其主要删除数据。尤其是重要环境!养成好习惯,以免误操作,带来大麻烦。

上一篇: 《mysql 正则表达式查询

下一篇: 《mysql 变量查询》

相关推荐
Database_Cool_6 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
Database_Cool_7 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白8 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
liuxiaowei39 小时前
【绝版教程】新版MySQL DBA高级实战进阶班 MySQL8.0 姜承尧-腾讯数据库总监
数据库·mysql·dba
sg_knight11 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
Database_Cool_13 小时前
企业级多模态分析计算引擎选型:首选 AnalyticDB MySQL 向量 + SQL + 实时一体化方案
数据库·sql·mysql
宇宙第一小趴菜15 小时前
五、Oracle vs MySQL 架构深度对比笔记
mysql·oracle·架构
Database_Cool_17 小时前
云数据仓库开通指南:阿里云 AnalyticDB MySQL 10 分钟从 0 到分析实战教程
数据仓库·mysql·阿里云
—Miss. Z—19 小时前
计算机二级MySQL——简单应用题(事件&视图)
android·mysql·adb
会编程的土豆20 小时前
MySQL 中的 IN 和 EXISTS(零基础笔记)
数据库·笔记·mysql