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', '[email protected]');
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM t2;
+----+----------+-----------------+
| id | name     | email           |
+----+----------+-----------------+
|  1 | zhangsan | [email protected] |
+----+----------+-----------------+
1 row in set (0.00 sec)
# 插入多条数据
mysql> INSERT INTO t2(name, email) 
    -> VALUES('lisi', '[email protected]'),('wangwu', '[email protected]');
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语句检索出的数据更新列数据。


mysql 多表 update sql语句总结

假定我们有两张表,一张表为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 < '2004-01-01'

另外一种方法是使用inner join然后更新:

UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8 WHERE p.dateCreated < '2004-01-01'

另外我们也可以使用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 < '2004-01-01'

两张表做关联,更新了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将被应用到表中所有的行。

MySQL入门-11:数据的增、删、改_第1张图片