1、数据插入
2、数据更新
3、数据删除
4、更新和删除的指导原则
1、数据插入-INSERT
插入数据可以使用以下几种方式:插入完整的行
插入行的一部分
插入多行
插入某些查询的结果Syntax:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
通常我们最常使用的 INSERT INTO 语句是这样的:
INSERT INTO table_name(column1, column2, column3, ...)
VALUES(value1, value2, value3,...)
总是使用列的列表:
一般不要使用没有明确给出列的列表的INSERT语句。使用列的列表能使SQL代码继续发挥作用,即使表结构发生了变化。
什么意思呢?举个例子就明白了。# 假设我的表结构如下
mysql> DESC t1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
# 那么当我想插入一条数据
# 方式一:没有使用列表(不推荐)
mysql> INSERT INTO t1 VALUES(1, 'zhangsan');
# 方式二:使用列的列表
mysql> INSERT INTO t1(id, name) VALUES(1, 'zhangsan');
这么做有什么好处呢?方式一 高度依赖于表中列默认定义的次序,不能保证下一次表结构变动后各个列保持完全相同的次序。因此,编写这种语句很不安全,应该避免使用。
省略列:
如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件。该列定义为允许NULL值
在表定义中给出默认值。
如果对表中不允许NULL值且没有默认值的列不给出值,则mysql将产生一条错误消息,并且相应的行插入不成功。
插入检索出的数据:INSERT INTO table1(MM, MM) SELECT NN, NN FROM table2 WHERE xx
MySQL不关心SELECT返回的列名是否和要插入表的列名相同,它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一个列,第二列将用来填充第二个列,依次类推。
提高整体性能:
1、指定INSERT语句的优先级
数据库经常被多个客户同时访问,对处理什么请求以及用什么次序处理进行管理是mysql的任务。INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的SELECT(通常是最重要)的性能。
可以在INSERT 和 INTO 之间添加关键字 LOW_PRIORITY, 指示MYSQL降低INSERT语句的优先级,这也适用于UPDATE / DELETE语句。
2、一次插入多个列INSERT INTO table_name(col1, col2 ..) VALUES(val1, val2, ...) [,(val1, val2), ...]
单条INSERT语句可以有多组值,每组值用一对圆括号括起来,用逗号分隔。单条INSERT语句处理多个插入比使用多条INSERT语句更快。
实例:# 为了演示,我们创建一个表,方便示例
mysql> CREATE TABLE t2(id INT NOT NULL AUTO_INCREMENT,
-> name VARCHAR(30) NOT NULL,
-> email VARCHAR(200) DEFAULT '',
-> PRIMARY KEY(id));
# 插入一条数据, 可以通过select语句查看是否插入成功
mysql> INSERT INTO t2(name, email)
-> VALUES('zhangsan', 'zhangsan@qq.com');
Query OK, 1 row affected (0.08 sec)
mysql> SELECT * FROM t2;
+----+----------+-----------------+
| id | name | email |
+----+----------+-----------------+
| 1 | zhangsan | zhangsan@qq.com |
+----+----------+-----------------+
1 row in set (0.00 sec)
# 插入多条数据
mysql> INSERT INTO t2(name, email)
-> VALUES('lisi', 'lisi@qq.com'),('wangwu', 'wangwu@qq.com');
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
关于insert语句的几点说明:
其实也不是啥说明了,都是书上面的例子,不过懒的敲了,而且感觉没有啥太大意义,都是需要大家理解的。给不给例子是一样的。
1.因为之前我在日志中介绍创建表结构的时候,字段是可以有默认值的,在MySQL4.0.3及更高版本都支持一个DEFAULT关键字,在我们使用 insert 语句的时候,可以使字段的值等于DEFAULT关键字,来使其等于数据库创建的时候的default值。
2.AUTOINCREMENT自增字段,这个我们是不用给出值的,因为系统会自动为该字段来进行自增,但是如果您愿意,也是可以给出值的。
3. UNIQUE这个我们也说过,就是字段唯一的意思,比如说用户的id设置UNIQUE,已经存在一条用户id为1的数据,如果此时您再想插入一条用户id为1的数据是不会成功的,系统会出错的。
4.如果数据库字段允许存在NULL值的话,我们在insert插入语句中,也是可以将字段值设为NULL的。
2、数据更新
可使用两种方式使用UPDATE:更新表中的特定行
更新表中的所有行
语法: UPDATE 表名 SET 字段=值,字段=值 WHERE 条件
Syntax:
Single-table syntax:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
我们通常使用的UPDATE 语句如下
UPDATE table_name
SET column1=value, column2=value2, ...
WHERE some_column=some_value
SET子句指示修改哪些列和要给予哪些值。 WHERE子句指定应更新哪些行。如果省略了WHERE子句,表中每一个单独的行都会受到UPDATE语句的影响,这是相当危险的,其后果是让你欲哭无泪。
在UPDATE语句中使用子查询:
UPDATE语句中可以使用子查询,使得能用SELECT语句检索出的数据更新列数据。
假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price;另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中价格字段的80%。
在Mysql中我们有几种手段可以做到这一点,一种是update table1 t1, table2 t2 ...的方式:UPDATE product p, productPrice pp
SET pp.price = pp.price * 0.8 WHERE p.productId = pp.productId
AND p.dateCreated
另外一种方法是使用inner join然后更新:UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8 WHERE p.dateCreated
另外我们也可以使用left outer join来做多表update,比方说如果ProductPrice表中没有产品价格记录的话,将Product表的isDeleted字段置为1,如下sql语句:UPDATE product p
LEFT JOIN productPrice pp
ON p.productId = pp.productId
SET p.deleted = 1 WHERE pp.productId IS null
另外,上面的几个例子都是两张表之间做关联,但是只更新一张表中的记录,其实是可以同时更新两张表的,如下sql:UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8, p.dateUpdate = CURDATE() WHERE p.dateCreated
两张表做关联,更新了ProductPrice表的price字段和Product表字段的dateUpdate两个字段。
3、数据删除
可使用两种方式使用DELETE:从表中删除特定的行
从表中删除所有行
语法:DELETE FROM 表名 WHERE 条件(oracal中就可以不要from)
DELETE不需要列名或通配符。DELETE删除整行而不是删除列。Syntax:
Single-table syntax:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
通常使用的语法是:
DELETE FROM table_name
WHERE some_column = some_value
语法是清晰明了的,和日常口语类似,指出想从哪个表中删除数据,还有要删除哪些数据。和UPDATE语句一样,不要使用没有WHERE子句的DELETE,这是一个危险的做法。因为如果不指定WHERE子句,DELETE将删除表中所有的记录,而且是立即删除。
连哭的时间都没有,因为你需要马上向老大汇报情况,并且立即找出MySQL日志,回滚记录。
DELETE删除表的内容而不是表结构
DELETE语句从表中删除行,甚至是删除表中的所有行。但是,DELETE不删除表本身。
更快的删除:
如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的行)
如果想要删除表中的所有数据,TRUNCATE 语句要比 DELETE语句块。因为TRUNCATE删除表,然后根据表结构重新建立它。而DELETE是一条一条的删除表中的记录而已。这也是为什么当向一个使用DELETE清空的表中插入数据时,MySQL会记住前面产生的AUTO_INCREMENT序列,并且继续使用后续的编号。而TRUNCATE删除表并重建后,AUTO_INCREMENT从1重新编号。
4、更新和删除的指导原则
UPDATE和DELETE语句一般都具有WHERE子句,如果省略了WHERE子句,则UPDATE或DELETE将被应用到表中所有的行。