在使用数据库之前,数据库中必须要有数据,MySQL中使用INSERT语句向数据库表插入新的数据记录。可以插入的方式有插入完整的记录、插入记录的一部分、插入多条记录、插入另一个查询的结果。
使用基本的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');
为表的指定字段插入数,就是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。
INSERT INTO person(name,age,info) VALUES('Willam',20,'sports man');
INSERT INTO person(name,age) VALUES('Laura',25);
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会返回一些在执行单行插入时没有的额外信息,这些信息的含义如下:
INSERT INTO person
VALUES (9,'Harry',21,'magician'),
(NULL,'Harriet',19,'pianist');
一个同时插入多行记录的INSERT语句等同于多个单行插入的INSERT语句,但是多行的INSERT语句在处理过程中效率更高。因为MySQL执行单条INSERT语句插入多行数据比使用多条INSERT语句快,所以在插入多条记录时最好使用单条INSERT语句的方式插入。
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')
);