数据的增删改
1.插入数据
1.1 插入方式
1)插入完整的行;
2)插入行的一部分;
3)插入多行;
4)插入某些查询的结果。
1.2 插入完整的行
-- 方式1.
INSERT INTO 表名
VALUES (NULL, 列值1, 列值2, 列值3, ....);
-- 方式2.
INSERT INTO 表名(列名1,列名2,列名3, ....)
VALUES (列值1, 列值2, 列值3, ....);
-- 降低INSERT语句的优先级,保证其他select语句的性能
INSERT LOW_PRIORITY INTO 表名(列名1,列名2,列名3, ....)
VALUES (列值1, 列值2, 列值3, ....);
【说明】
1)INSERT 语句一般不会像SELECT语句一样产生输出;
2)VALUES后面第一个NULL往往是因为给主键设置自增,因此可以指定为NULL,MySQL将忽略这个字段;
3)方式2 在列名中不给出主键对应的列,因此在VALUES中不必给出对应的NULL;
4)方式2 在指定列名时可以只给出部分列名,不必给出表中所有的列名;但省略的列必须符合如下条件:
a.该列被定义允许为NULL(无值或空值);
b.该列在表中有默认值;
5)【重点】方式2显式的给出列名,较方式1更加安全,即使之后表的结构:列的顺序发生改变,方式2的语句也不会出现问题,而方式1 列值会匹配不上对应的列;
6)在INSERT 和INTO之间加入关键字 LOW_PRIORITY 可以降低插入语句的优先级,提高正在等待处理的SELECT语句的优先级(性能);因为SELECT语句是更为频繁的操作。
1.3 插入多个行
-- 方式1.使用多个INSERT INTO 表名(列名列表) VALUES(列值列表);语句一次性提交;
INSERT INTO 表名(列名1,列名2,列名3, ....)
VALUES (列值11, 列值12, 列值13, ....);
INSERT INTO 表名(列名1,列名2,列名3, ....)
VALUES (列值21, 列值22, 列值23, ....);
INSERT INTO 表名(列名1,列名2,列名3, ....)
VALUES (列值31, 列值32, 列值33, ....);
-- 方式2.在列固定且列次序固定的情况下
-- 使用INSERT INTO 表名(列名列表) VALUES (列值列表1),(列值列表2),...;
-- 来完成多行的插入
【说明】使用
INSERT INTO 表名(列名列表) VALUES (列值列表1),(列值列表2),…;
用逗号分隔(列值列表),这种插入方式【性能更高,速度更快】
1.4 插入检索出的数据
-- 将检索出来的结果插入表中
INSERT INTO 表2(列名21,列名22,...)
SELECT (列名11,列名12,...) FROM 表1 [WHERE ...]
【说明】
1)这个例子,当where子句不存在的时候,可以实现将表1中的数据导入表2中;
2)插入检索出来的数据用的是 INSERT INTO…SELECT语句,中间没有VALUES关键字!
3)表2中主键如果和表1中的主键一样,设置了自增之类的,在列名列表中可以忽略该列;
4)表1、表2其实只要对应列的数据类型相互兼容即可,不用管它们列名是否一样。
1.5 INSERT、INSERT IGNORE、REPLACE
即将出入数据库的新数据,与原来存在与数据库中的数据不重复(冲突)的情况下,三者都是将新数据插入数据库;
当重复(冲突)的情况下:
a.INSERT语句报错;
b.INSERT IGNORE 忽略新数据;
c.REPLACE替换原数据
2.更新(修改)数据
2.1 修改的类型
1)修改表中特定的行;
2)修改表中所有行;
2.2 修改表中特定的行
-- 更新表中特定的行
UPDATE [IGNORE] 表名
SET 需要修改值的列的列名1 = 新的列值1,
需要修改值的列的列名2 = 新的列值2
WHERE 条件子句
【说明】
1)当更新多个列的时候,只需要一个set命令,每个“列=值”对之间用逗号隔开即可;【通过将某列值设置为NULL可以达到删除某列的目的】
2)UPDATE可以使用检索出来的数据在SET处对列数据进行更新;
3)【IGNORE关键字】
a.在不使用IGNORE关键字的情况下,如果在更新过程中发生错误,更新操作将被取消,数据回退到执行更新操作之前;
b.使用IGNORE关键字的情况下,如果在更新过程中发生错误,将继续更新;
4)注意!如果where语句没有设置,将会更新所有的行,这是非常危险的。
3.删除数据
3.1 删除的类型
1)删除表中特定的行;
2)删除表中所有的行;
3.2 删除表中特定的行
-- 更新表中特定的行
DELETE [IGNORE] FROM 表名
WHERE 条件子句;
3.3 删除表中所有的行
-- 更新表中特定的行
DELETE [IGNORE] FROM 表名;
-- TRUNCATE关键字删除所有行
TRUNCATE TABLE 表名;
【说明】
1)删除是删除表的内容,而不会删除表的结构,不会删除表本身,即使表中的数据全部删除,表仍然存在,表的结构也仍然存在。
2)删除表中所有的行,TRUNCATE TABLE语句更加高效;
3)TRUNCATE TABLE原理:TRUNCATE TABLE是直接删除原来的表,并重新创建一个和原来表结构一模一样的表。而不是像DELETE FROM语句是逐行删除表中的数据,因此效率更高;
3.更新和删除的指导原则
1)尽量带上where子句执行;
2)保证每个表都有主键,尽可能像where子句那样使用;
3)在对更新或者删除语句使用where子句之前,一定要使用select语句测试where子句的正确性,确保它过滤出来的是正确的行。