七、插入、更新与删除数据

一、插入数据

在使用数据库之前,数据库中必须要有数据,MySQL中使用INSERT语句向数据库表插入新的数据记录。可以插入的方式有插入完整的记录、插入记录的一部分、插入多条记录、插入另一个查询的结果。

1、为表的所有字段插入数据

使用基本的INSERT语句插入数据要求指定表名称和插入到新纪录中的值。基本语法格式为:

INSERT INTO table_name(column_list) VALUES(value_list);

table_name指定要插入数据的表名,column_list指定要插入数据的那些列,value_list指定每个列所对应的插入数据。注意,使用该语句时字段列和数据值的数量必须相同。

本章将使用样例表person,创建语句如下:

CREATE TABLE person(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	name CHAR(40) NOT NULL DEFAULT '',
	age INT NOT NULL DEFAULT 0,
	info CHAR(50) NULL,
	PRIMARY KEY(id)
)

向表中所有字段插入值的方法有两种:一种是指定所有字段名,另一种是完全不指定字段名。

INSERT INTO person(id,name,age,info) VALUES (1,'Green',21,'Lawyer');

INSERT语句后面的列名称顺序可以不是person表定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以。

INSERT INTO person(age,name,id,info) VALUES (22,'Suse',2,'dancer');

使用INSERT插入数据时,允许列名称列表column_list为空,此时,值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。

INSERT INTO person VALUES (3,'Mary',24,'Musician');

2、为表的指定字段插入数据

为表的指定字段插入数,就是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。

INSERT INTO person(name,age,info) VALUES('Willam',20,'sports man');
INSERT INTO person(name,age) VALUES('Laura',25);

3、同时插入多条记录

INSERT语句可以同时向数据表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号分隔开,基本语法格式如下:

INSERT INTO table_name(column_list)
VALUES (value_list1),(value_list2),...,(value_listn);
INSERT INTO person(name,age,info)
VALUES 
('Evans',27,'secretary'),
('Dale',22,'cook'),
('Edison',28,'singer');

使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些信息的含义如下:

  • Records:表明插入的记录条数。
  • Duplicates:表明插入时被忽略的记录,原因可以是这些记录包含了重复的主键。
  • Warnings:表明有问题的数据值,例如发生数据类型转换。
 INSERT INTO person
 VALUES (9,'Harry',21,'magician'),
 (NULL,'Harriet',19,'pianist');

一个同时插入多行记录的INSERT语句等同于多个单行插入的INSERT语句,但是多行的INSERT语句在处理过程中效率更高。因为MySQL执行单条INSERT语句插入多行数据比使用多条INSERT语句快,所以在插入多条记录时最好使用单条INSERT语句的方式插入。

4、将查询结果插入到表中

INSERT语句用来给数据表插入记录时指定插入记录的列值。INSERT还可以将SELECT语句查询的结果插入到表中,如果想要从另一个表合并个人信息到person表,不需要把每一条记录的值一个一个输入,只需要使用一条INSERT语句和一条SELECT语句组成的组合语句即可快速地从一个或多个表向一个表插入多行。基本语法格式如下:

INSERT INTO table_name1(column_list1)
SELECT (column_list2) FROM table_name2 WHERE (condition)

table_name1指定待插入数据的表;column_list1指定待插入表中要插入数据的哪些列;table_name2指定插入数据是从哪个表中查询出来的;column_list2指定数据来源表的查询列,该列表必须和column_list1列表的字段个数相同,数据类型相同;condition指定SELECT语句的查询条件。

CREATE TABLE person_old(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	name CHAR(40) NOT NULL DEFAULT '',
	age INT NOT NULL DEFAULT 0,
	info CHAR(50) NULL,
	PRIMARY KEY(id)
)
INSERT INTO person(id,name,age,info)
SELECT id,name,age,info FROM person_old;

这个例子中使用的person_old表和person表的定义相同,事实上,MySQL不关心SELECT返回的列名,它根据列的位置进行插入,SELECT的第1列对应待插入表的第1列,第2列对应待插入表的第2列…即使不同结果的表之间也可以方便地转移数据。

二、更新数据

表中有数据之后,接下来可以对数据进行更新操作,MySQL中使用UPDATE语句更新表中地记录,可以更新特定地行或者同时更新所有的行。基本语法结构如下:

UPDATE table_name
SET column_name1 = value1,column2=value2,......,column_namen=valuen
WHERE (condition);
UPDATE person SET age=15,name='LiMing' WHERE id=11;

保证UPDATE以WHERE子句结束,通过WHERE子句指定被更新的记录所需要满足的条件,如果忽略WHERE子句,MySQL将更新表中所有的行。

三、删除数据

从数据表中删除数据使用DELETE语句,DELETE语句允许WHERE子句指定删除条件。DELETE语句基本语法格式如下:

DELETE FROM table_name [WHERE <condition>];
DELETE FROM person WHERE id=11;

删除person表中所有记录

DELETE FROM person;

如果想删除表中所有记录,还可以使用TRUNCATE TABLE语句。TRUNCATE将直接删除原来的表,并重新创建一个表,其语法结构为TRUNCATE TABLE table_name。TRUNCATE直接删除表而不是删除记录,因此执行速度比DELETE快。

四、为表增加计算列

什么叫计算列呢?简单来说就是某一列的值是通过别的列计算得来的。例如,a列值为1、b列值为2,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。

增加计算列的语法格式如下

col_name data_type [GENERATED ALWAYS]  AS  (expression)
[VIRTUAL| STORED] [UNIQUE [KEY]] [COMMENT comment]
[NOT NULL | NULL] [[PRIMARY] KEY ]

在MySQL8.0中,CREATE TABLE和ALTER TABLE都支持增加计算列。下面以CREATE TABLE为例进行讲解。

CREATE TABLE tb1(
	id int(9) NOT NULL AUTO_INCREMENT,
	a int(9) DEFAULT NULL,
	b int(9) DEFAULT NULL,
	c int(9) GENERATED ALWAYS AS ((a+b)) VIRTUAL,
	PRIMARY KEY ('id')
);

你可能感兴趣的:(MySQL)