DML语言{数据操纵语言}
- 插入语句
- 不指定字段插入:
- 指定字段名插入:
- 同时插入多行数据:
- 将A表查询结果插入到B表
- 查看插入数据的行数
- IGNORE插入时忽略错误。
- 插入默认值
- 使用set插入数据
- ON DUPLICATE KEY UPDATE
- INSERT DELAYED提交到内存排队
- 修改数据
- 先备份数据表
- 修改其中某个字段的值
- 多个字段同时修改值的时候用逗号隔开
- 修改非空约束的列
- 更改列的位置
- 删除语句
- delete子句中使用order by子句
- 清空表数据
- delete和truncate的区别
- drop删除表
- 删除其中某一行数据
- 同时删除多行数据:
插入语句
expression
是指一个可以计算出结果的代码段,通常由数据、操作符和函数组成。
不指定字段插入:
-- 不指定字段插入:
insert into 表名 values (1,'lsii',56,'13512345678');
指定字段名插入:
-- 指定字段名插入:
insert into student (name,age,stuphone) values ('lsii',56,'13512345678');
同时插入多行数据:
-- 同时插入多行数据:
insert into student values
(2,'wangwu',46,'13612345678'),
(3,'sadfsa',34,'13412345678');
将A表查询结果插入到B表
-- 将A表查询结果插入到B表
insert into product2(pname, price)
SELECT pname,
price
from product;
查看插入数据的行数
-- 查看插入数据的行数
select row_count();
IGNORE插入时忽略错误。
忽略错误
,不会插入错误
的值。
插入默认值
如果列有默认值
,且其他值没有非空约束和唯一约束。
那么插入空行
,也会插入一行默认值数据。
使用set插入数据
ON DUPLICATE KEY UPDATE
MySQL 8的 ON DUPLICATE KEY UPDATE
语法,如果插入的数据会导致一个唯一性索引
或主键
冲突,则对应的现有行将被更新
为新插入的值。否则,将插入新行。
-- 创建库
create database mydb;
-- 进入库
use mydb;
-- 创建T表,a列为主键约束
CREATE TABLE t(a INT(3) PRIMARY KEY, b INT(3), c INT(3));
-- 正常插入一行数据
INSERT INTO t(a,b,c) VALUES (1, 2, 3);
-- 再插入一行数据--主键冲突
INSERT INTO t(a,b,c) VALUES (1, 2, 4);
-- 如果主键冲突或唯一性索引,则更新为新插入的值,否则,插入新行
INSERT INTO t(a,b,c) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c=4;
INSERT INTO t(a,b,c) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
INSERT DELAYED提交到内存排队
MySQL8
已经移除
了INSERT DELAYED
这个命令。
在MySQL5.7及之前
的版本中,INSERT DELAYED
是一种优化方式,它可以让INSERT语句在后台异步执行,而不阻塞其他查询操作。这种方式在高并发环境下可以提高系统的吞吐量。
但是,在MySQL 5.7之后的版本中,这个命令已经被废弃,因为MySQL引入了更好的优化策略来处理高并发情况。其中一种常用的优化方式是使用INSERT … ON DUPLICATE KEY UPDATE语句。
如果你正在升级到MySQL 8,建议不要再使用INSERT DELAYED命令,而应该使用新的优化方式来提高系统性能。
修改数据
先备份数据表
修改
数据表之前,先备份数据表
-- 修改某个字段的值之前先备份数据表
CREATE TABLE your_table_backup AS SELECT * FROM your_table;
修改其中某个字段的值
-- 修改其中某个字段的值
update 表名 set id = 4 where age=56;
多个字段同时修改值的时候用逗号隔开
-- 多个字段同时修改值的时候用逗号隔开
update student set id = 4,name='augus' where age=56;
修改非空约束的列
如果把非空约束
的字段更新为NULL
会报错。
更改列的位置
# 将表中的列名1移动到第一列
ALTER TABLE 表名 MODIFY COLUMN 列名1 int(5) FIRST;
# 将表中的列名1移动到列名2的后面
ALTER TABLE 表名 MODIFY COLUMN 列名1 int(5) AFTER 列名2;
删除语句
delete子句中使用order by子句
如果DELETE
语句包括一个ORDER BY子句
,则各行按照子句中指定的顺序
进行删除,此子句只在与LIMIT联用
时才起作用。
-- 使用timestamp_column进行分组,并删除第一(最旧的)行
-- 排序默认升序
DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp_column
LIMIT 1;
清空表数据
delete和truncate的区别
delete
是只删除表的数据,自增长约束,是从断点处开始;truncate
类似于drop table
完全删除表,然后再创建该表,自增长约束,是从1开始。
drop删除表
-- 删除指定表
drop table 表名;
删除其中某一行数据
-- 删除其中某一行数据
delete from 表名 where name='fengliu';
同时删除多行数据:
-- 同时删除多行数据:
delete from 表名 where name in ('lisi','wangwu');