mysql语句之insert语句DML事务的结束
INSERT语句
DML:数据操纵语言。用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括insert、delete、update和select等(增删改查)
DATA MANIPULATION LANGUAGE(数据操纵语言)
由INSERT、UPDATE、DELETE等语句构成,用来修改表中的数据,带VALUES子句的INSERT语句。
INSERT [INTO] tbl_name[(col_name,…)]
{VALUES | VALUE} (expr ,…),(…),…
用来把一个新行插入到表中
为和其它数据库保持一致,不要省略INTO关键字以及使用VALUES而不是value关键字
插入一行时,要求必须对该行所有的列赋值。但是赋值方式可以是显式赋值(直接给出值)和隐式赋值(由MySQL自动赋值)
1、在表名后面列出所有的列名
例1: 插入一个新的球队到teams表中
INSERT INTO teams(teamno,playerno,division)
VALUES(3,6,‘third’);
2、在表名后面省略所有的列名
这种写法要求VALUES子句中的值必须按照列在表结构中的顺序来一一赋值
INSERT INTO teams
VALUES(4,104,‘third’);
3、在表名后面只列出部分的列名
所有没有明确赋值的列,将通过隐式赋值自动得到null值
例2: 添加一个新球员
INSERT INTO players(playerno,NAME,initials,sex,joined,street,town)
VALUES(611,‘Jones’,‘GG’,‘M’,1997,‘Green Way’,‘Stratford’);
例4: 创建一个表,存储球员数量和罚款总额
CREATE TABLE totals(
numberplayers INTEGER NOT NULL,
sumpenalties DECIMAL(9,2) NOT NULL
);
INSERT INTO totals(numberplayers,sumpenalties)
VALUES((SELECT count(*) FROM players),
(SELECT sum(amount) FROM penalties));
注意:子查询必须放在单独的小括号中。
一条INSERT语句可以插入多个行:
例5:添加4个新的球队
INSERT INTO teams(teamno,playerno,division)
VALUES (6,7,‘third’),
(7,27,‘fourth’),
(8,39,‘fourth’),
(9,112,‘sixth’);
注意:这种语法只要有1行出错,则插入全部取消
INSERT语句中可以使用IGNORE选项来当INSERT语句出错时,不显示错误消息。INSERT语句不会执行
例6:向teams表中再次添加1号球队
INSERT IGNORE INTO teams VALUES(1,39,‘second’);
例题: 把那些罚款额大于平均罚款额的所有罚款添加到penalties表中。
表:penalties表
字段:所有字段
条件:罚款额大于平均罚款数额
子查询:平均罚款数
INSERT INTO penalties
SELECT paymentno + 100,playerno,payment_date,amount
FROM penalties
WHERE amount > (SELECT avg(amount)
FROM penalties);
=============UPDATE语句 =====
UPDATE [IGNORE] table_reference
SET col_name1=expr1 [, col_name2=expr2,],…
[WHERE where_condition]
[ORDER BY …]
[LIMIT row_count]
将满足WHERE条件的所有行的一个或多个列值改为新的值。没有WHERE子句则修改所有的行
例1: 把95号球员的联盟会员号码改为2000
UPDATE players
SET leagueno = 2000
WHERE playerno = 95;
共 1 行受到影响
例2: 把所有的罚款增加5%
UPDATE penalties
SET amount = amount*1.05;
共 8 行受到影响
例3: 把住在Stratford的球员的获胜局数设为0
UPDATE matches
SET won = 0
WHERE playerno IN(SELECT playerno
FROM players
WHERE town=‘Stratford’);
共 4 行受到影响
UPDATE语句中可以使用ORDER BY子句,要求以排序的顺序来依次更新行。这在某些场景可能有用。例如,如果想要把所有罚款的罚款编号都加1,如果从罚款编号为1的行开始更新,要么就会发生主键值重复异常。如果从罚款编号最大的行开始更新,就没有问题。
UPDATE语句中可以使用LIMIT子句,指定一次更新的行数。
例7:把4个最高的罚款额增加5%(罚款额相同则更新编号小的球员)
UPDATE penalties
SET amount= amount *1.05
ORDER BY amount DESC, playerno ASC
LIMIT 4;
IGNORE选项用于当UPDATE语句出错时,不显示错误消息。
更新多个表中的值
MySQL允许我们使用1条UPDATE语句就更新两个或多个表中的行
语法:
UPDATE [IGNORE] table_references
SET col_name1=expr1 [, col_name2=expr2,],…
[WHERE where_condition]
其中, table_references可以使用任何合法的连接语法。不能使用ORDER BY和LIMIT子句
=REPLACE语句==
替代已有的行
REPLACE语句是INSERT语句的一个变种。当添加新行时,如果主键值重复,那么就覆盖表中已有的行。如果没有主键值重复,则插入该行。
语法:
REPLACE [INTO] tbl_name [(col_name,…)]
VALUES (expr,…),(…),…
或者
REPLACE [INTO] tbl_name [(col_name,…)]
SELECT …
例题:添加一个新的球员。如果主键值已经存在,则覆盖该行
REPLACE INTO players(playerno,NAME,initials,
sex,joined,street,town)
VALUES(611,‘john’,‘GG’,‘M’,1977,‘Green Way’, ‘Startford’);
共 1 行受到影响
========DELETE语句 ===========
语法:
DELETE [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY …]
[LIMIT row_count]
从表中删除满足WHERE条件的所有行。没有WHERE条件,则删除表中的所有行
例 1: 删除44号球员的罚款
DELETE FROM penalties
WHERE playerno=44;
共 3 行受到影响 。
带子查询
例2: 删除球员,条件是他们加入俱乐部的年份晚于来自于Stratford的球员加入俱乐部的平均年份
CREATE TABLE players_copy2
AS SELECT * FROM players;
DELETE FROM players
WHERE joined > (
SELECT avg(joined)
FROM players_copy2
WHERE town = ‘Stratford’);
注意,在WHERE子句的子查询中,不允许访问要删除行的表。
用在DELETE语句中的ORDER BY子句和LIMIT子句的含义和用在UPDATE语句中是类似的
====TRUNCATE语句:清空=
清空一张(大)表更有效的方法是使用TRUNCATE语句,它比DELETE快得多
语法:
TRUNCATE [TABLE] tbl_name
示例:
Truncate table committee_members;
=truncate和delete相比的区别:=
速度:
truncate的删除速度更快。(对于大文件),删除表结构;对于小文件的话:delete删除比较快。
整张表删除:理解为删除表空间里的数据,没有删除表结构文件里的数据。
delete:
一行一行的删除。
产生日志:
二进制文件:
truncate:删除数据不产生二进制日志。