mysql DML
DML-INSERT
插入完整的行;
插入行的一部分;
插入多行;
插入某些查询的结果【权限】可针对每个表或每个用户,禁止使用INSERT语句。
单行插入:
# 需要按顺序填写,且不能省略,可以用NULL代替
INSERT INTO table_name VALUES(col1_val, col2_val, );
高度依赖于表中列的定义次序,并且还依赖于其次序容易获得的信息。需要知道次序信息,麻烦,不安全。
INSERT INTO table_name(col1_name, col2_name, ...) VALUES(col1_val, col2_val, ...);
在表名后的括号里明确地给出了列名,并对应赋值。即使表的结构改变,此INSERT语句仍然能正确工作。推荐使用。
提高整体性能:如果数据检索是最重要的(通常是这样),则你可以通过在INSERT
和INTO
之间添加关键字LOW_PRIORITY
,指示MySQL降低INSERT语句的优先级,如下所示:(对UPDATE
和DELETE
也适用)
INSERT LOW_PRIORITY INTO ...
多行插入:
# 重复提交
INSERT INTO table_name(col1_name, col2_name, ...) VALUES(col1_val, col2_val, ...);
INSERT INTO table_name(col1_name, col2_name, ...) VALUES(col1_val, col2_val, ...);
INSERT INTO table_name(col1_name, col2_name, ...) VALUES(col1_val, col2_val, ...);
进一步,提高性能,
INSERT INTO table_name(col1_name, col2_name, ...)
VALUES(col1_val, col2_val, ...), (col1_val, col2_val, ...),(col1_val, col2_val, ...) ...;
使用()
代表一行数据。这样可以提高性能。因为MySQL用单条INSERT语句处理多个插入比使用多条INSERT语句快。
插入检索出的数据:
将一条SELECT
语句的结果插入表中。
这就是所谓的INSERT SELECT,顾名思义,它是由一条INSERT语句和一条SELECT语句组成的。
INSERT INTO table_name(col1_name, col2_name, ...)
VALUES SELECT col1_name, col2_name, ... FROM table_name_new
规则:
列名不需要匹配,只根据列位置匹配。具体地说,SELECT
查询的第一列的数据会插入到INSERT
中table_name()
指定的第一列。
SELECT
子句符合查询语法就行,可以使用数据过滤的等子句。
INSERT
子句符合插入语法就行。
DML-UPDATE,DELETE
UPDATE:
更新表中特定行;更新表中所有行
DELETE:
删除表中特定行;删除表中所有行
UPDATE
UPDATE table_name
SET column_name = column_val[,column_name = column_val, ...]
WHERE conditions
UPDATE语句由3部分组成,分别是:
- 要更新的表;
UPDATE table_name
- 指定列名和它们的新值;
SET column_name = column_val[,column_name = column_val, ...]
- 确定要更新行的过滤条件。
WHERE conditions
在UPDATE
语句中可以使用子查询,进行数据的更新。
IGNORE关键字 更新多行时如果出错默认回滚恢复到初始值,使用IGNORE
可以忽略错误,继续进行更新:
UPDATE IGNORE table_name ...
DELETE
按行删除数据
删除的是表内容(表中数据),不是表本身
DELETE FROM table_name
WHERE conditons
更快的删除方式:当删除表中所有数据时可以用。
TRUNCATE TABLE
相当于删除原来的表再重新创建一个同样的表,比逐行删除快。
TRUNCATE
属于DDL。
使用注意
在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
MySQL没有撤销(undo)按钮。所以数据不会回复。