mysql 子查询优先级_MySQL入门-11:数据的增、删、改

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将被应用到表中所有的行。

93ae37b1076b3f9631ae514aafe1c0e1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值