RDBMS表中数据的基本操作

举报
tea_year 发表于 2023/12/28 19:47:09 2023/12/28
【摘要】 本章学习目标​ 熟练掌握插入数据​ 熟练掌握修改数据​ 熟练掌握删除数据前面讲解了如何对数据库和表进行操作,如果想操作表中的数据,还需要通过MySQL提供的数据库操作语言实现,本章将详细讲解对表中数据的插入、修改和删除。3.1​ 插入数据向数据表中插入数据有多种方式,包括为所有列插入数据、为指定列插入数据、批量插入数据等,在实际开发中,根据不同需求来决定数据插入的方式,接下来讲解几种基...


本章学习目标

​ 熟练掌握插入数据

​ 熟练掌握修改数据

​ 熟练掌握删除数据

前面讲解了如何对数据库和表进行操作,如果想操作表中的数据,还需要通过MySQL提供的数据库操作语言实现,本章将详细讲解对表中数据的插入、修改和删除。

3.1​ 插入数据

向数据表中插入数据有多种方式,包括为所有列插入数据、为指定列插入数据、批量插入数据等,在实际开发中,根据不同需求来决定数据插入的方式,接下来讲解几种基本的插入数据方式。

3.1.1​ 为所有列插入数据

通常情况下,向数据表中插入数据应包含表中所有字段,也就是为表中所有字段添加数据,为表中所有字段添加数据有以下两种方式。

1.INSERT语句中指定所有字段名

使用INSERT语句列出表的所有字段可以向表中插入数据,语法格式如下所示。

INSERT INTO 表名(字段名1,字段名2,……) VALUES(值1,值2,……);

以上示例中,“字段名1,字段名2”是数据表中的字段名称,这里必须列出表中所有字段的名称,“值1,值2”是每个字段要添加的数据,每个值的顺序、类型必须与字段名对应。

例3-1​ 在数据库qianfeng2中创建一个员工表emp,表结构如表3.1所示。

表3.1​ emp表

字段

数据类型

备注说明

id

INT

员工编号

name

VARCHAR(100)

员工姓名

gender

VARCHAR(10)

员工性别

birthday

DATE

员工生日

salary

DECIMAL(10,2)

员工工资

entry_date

DATE

员工入职日期

resume_text

VARCHAR(200)

员工简介

首先,创建数据库qianfeng2,SQL语句如下所示。

CREATE DATABASE qianfeng2;

然后使用该数据库,SQL语句如下所示。

mysql> USE qianfeng2;

Database changed

现在可以创建数据表emp,SQL语句如下所示。

mysql> CREATE TABLE emp(

-> id INT,

-> name VARCHAR(100),

-> gender VARCHAR(10),

-> birthday DATE,

-> salary DECIMAL(10,2),

-> entry_date DATE,

-> resume_text VARCHAR(200)

-> );

Query OK, 0 rows affected (0.13 sec)

以上执行结果证明表创建完成,为了进一步验证,可以使用DESC查看库中的emp表,SQL语句如下所示。

mysql> DESC emp;

+-------------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------------+---------------+------+-----+---------+-------+

| id | int(11) | YES | | NULL | |

| name | varchar(100) | YES | | NULL | |

| gender | varchar(10) | YES | | NULL | |

| birthday | date | YES | | NULL | |

| salary | decimal(10,2) | YES | | NULL | |

| entry_date | date | YES | | NULL | |

| resume_text | varchar(200) | YES | | NULL | |

+-------------+---------------+------+-----+---------+-------+

7 rows in set (0.01 sec)

从以上执行结果可看出,emp表成功创建。

例3-2​ 通过INSERT语句插入数据,SQL语句如下所示。

mysql> INSERT INTO emp(

-> id,

-> name,

-> gender,

-> birthday,

-> salary,

-> entry_date,

-> resume_text

-> ) VALUES(

-> 1,

-> 'lilei',

-> 'male',

-> '1991-05-10',

-> 4000,

-> '2013-06-10',

-> 'none'

-> );

Query OK, 1 row affected (0.07 sec)

以上执行结果证明插入数据完成,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 4000.00 | 2013-06-10 | none |

+------+-------+--------+------------+---------+------------+-------------+

1 row in set (0.00 sec)

从以上执行结果可看出,emp表中的数据成功插入,因为表中只插入了一条记录,所以只查询到了一条结果。

在插入数据时,INSERT语句中的字段顺序可以与数据库中表字段的顺序不一致,但VALUES中的值一定要和INSERT语句中的字段顺序对应,现在通过INSERT语句不按表字段顺序插入数据,SQL语句如下所示。

mysql> INSERT INTO emp(

-> resume_text,

-> entry_date,

-> salary,

-> birthday,

-> gender,

-> name,

-> id

-> )VALUES(

-> 'none',

-> '2014-10-20',

-> 6000,

-> '1988-03-15',

-> 'female',

-> 'lucy',

-> 2

-> );

Query OK, 1 row affected (0.03 sec)

以上执行结果证明插入数据完成,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 4000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 6000.00 | 2014-10-20 | none |

+------+-------+--------+------------+---------+------------+-------------+

2 rows in set (0.00 sec)

从以上执行结果可看出,emp表中的第二条数据成功插入,由此可看出,INSERT语句中字段顺序可以与数据表中字段顺序不一致,但一般不建议这样做。

2.INSERT语句中不指定字段名

使用INSERT语句为所有列插入数据时,也可以不指定字段名,语法格式如下所示。

INSERT INTO 表名 VALUES (值1,值2,……);

以上示例中,“值1,值2”是每个字段要添加的数据,每个值的顺序、类型必须与表中字段的顺序和类型都对应。

例3-3​ 前面在数据库qianfeng2中创建了员工表emp,使用INSERT语句不指定字段名的方式插入数据,SQL语句如下所示。

mysql> INSERT INTO emp

-> VALUES(

-> 3,

-> 'king',

-> 'female',

-> '1993-06-15',

-> 7000,

-> '2014-07-10',

-> 'none'

-> );

Query OK, 1 row affected (0.07 sec)

以上执行结果证明插入数据完成,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 4000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 6000.00 | 2014-10-20 | none |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

+------+-------+--------+------------+---------+------------+-------------+

3 rows in set (0.01 sec)

从以上执行结果可看出,emp表中的数据成功插入,使用这种方式来插入数据,VALUES中值的顺序必须与数据表中字段的顺序对应,否则会出现错误,接下来进行错误演示,SQL语句如下所示。

mysql> INSERT INTO emp

-> VALUES(

-> 'none',

-> '2013',

-> 5000,

-> '1992-01-01',

-> 'female',

-> 'lilei',

-> 4

-> );

Query OK, 1 row affected, 3 warnings (0.03 sec)

以上执行结果证明插入数据完成,但与之前不同的是,执行完成后,有三个警告,即3 warnings,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 4000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 6000.00 | 2014-10-20 | none |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

+------+-------+--------+------------+---------+------------+-------------+

4 rows in set (0.00 sec)

从以上执行结果可看出,插入的第四条数据明显和字段不对应,而是与插入时VALUES后边的值的顺序相对应。

3.1.2​ 为指定列插入数据

在一些实际场景中,可能表中只需要添加某几个字段的数据,其他字段用默认值即可,这就需要用到为指定列插入数据,语法格式如下所示。

INSERT INTO 表名(字段1,字段2,……) VALUES(值1,值2,……);

以上示例中,“字段名1,字段名2”是数据表中的字段名称,“值1,值2”是每个字段要添加的数据,每个值的顺序、类型必须与字段名对应。

例3-4​ 为emp表插入数据,且只插入前四个字段的数据,SQL语句如下所示。

mysql> INSERT INTO emp(

-> id,

-> name,

-> gender,

-> birthday

-> ) VALUES(

-> 5,

-> 'mary',

-> 'female',

-> '1995-07-10'

-> );

Query OK, 1 row affected (0.07 sec)

以上执行结果证明插入数据完成,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 4000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 6000.00 | 2014-10-20 | none |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | female | 1995-07-10 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

5 rows in set (0.00 sec)

从以上执行结果可看出,插入的第五条数据只有前四个字段有值,其他字段都是NULL,这是这些字段的默认值,可以通过SHOW CREATE TABLE语句查看字段的默认值,SQL语句如下所示。

mysql> SHOW CREATE TABLE emp\G;

*************************** 1. row ***************************

Table: emp

Create Table: CREATE TABLE `emp` (

`id` int(11) DEFAULT NULL,

`name` varchar(100) DEFAULT NULL,

`gender` varchar(10) DEFAULT NULL,

`birthday` date DEFAULT NULL,

`salary` decimal(10,2) DEFAULT NULL,

`entry_date` date DEFAULT NULL,

`resume_text` varchar(200) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.01 sec)

从以上执行结果可看出,salary、entry_date和resume_text字段的默认值都是NULL。另外,为指定列添加数据时,指定字段无须与数据表中定义的顺序一致,只要与VALUES中的值顺序一致即可,接下来演示这种情况,继续向emp插入数据,仍然只插入前四个字段的数据,但指定字段顺序与数据表中定义的不同,SQL语句如下所示。

mysql> INSERT INTO emp(

-> birthday,

-> gender,

-> name,

-> id

-> ) VALUES(

-> '1996-01-01',

-> 'male',

-> 'rin',

-> 6

-> );

Query OK, 1 row affected (0.04 sec)

以上执行结果证明插入数据完成,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 4000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 6000.00 | 2014-10-20 | none |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | female | 1995-07-10 | NULL | NULL | NULL |

| 6 | rin | male | 1996-01-01 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

6 rows in set (0.00 sec)

从以上执行结果可看出,指定字段顺序与数据表中定义的不同数据仍然插入成功,这是因为指定字段顺序与VALUES中的值对应。

3.1.3​ 批量插入数据

在实际开发中,可能会遇到向数据表中插入多条记录的情况,用INSERT语句可以一条一条地插入数据,但这样做明显比较麻烦,这时可以进行批量插入数据,提高工作效率。接下来分为两个方面讲解,一个是为所有列批量插入数据,另一个是为指定列批量插入数据。

1.为所有列批量插入数据

实际上,使用一条INSERT语句就可以实现数据的批量插入,与插入一条数据类似,批量插入时,语句中罗列多个VALUES即可,语法格式如下所示。

INSERT INTO 表名[(字段名1,字段名2,……)]

VALUES(值1,值2,……),

(值1,值2,……),

……

(值1,值2,……);

以上示例中,“字段名1,字段名2”是数据表中的字段名称,是可选的,“值1,值2”是每个字段要添加的数据,每个值的顺序、类型必须与字段名对应。

例3-5​ 在数据库qianfeng2中创建一个教师表teacher,如表3.2所示。

表3.2​ teacher表

字段

数据类型

备注说明

id

INT

教师编号

name

VARCHAR(50)

教师姓名

age

INT

教师年龄

首先使用qianfeng2数据库,SQL语句如下所示。

mysql> USE qianfeng2;

Database changed

现在可以创建数据表teacher,SQL语句如下所示。

mysql> CREATE TABLE teacher(

-> id INT,

-> name VARCHAR(50),

-> age INT

-> );

Query OK, 0 rows affected (0.16 sec)

以上执行结果证明表名修改完成,为了进一步验证,可以使用DESC查看库中的emp表,SQL语句如下所示。

mysql> DESC teacher;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id | int(11) | YES | | NULL | |

| name | varchar(50) | YES | | NULL | |

| age | int(11) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

3 rows in set (0.06 sec)

从以上执行结果可看出,teacher表成功创建。

例3-6​ 通过INSERT语句为所有列批量插入数据,SQL语句如下所示。

mysql> INSERT INTO teacher(

-> id,

-> name,

-> age) VALUES(

-> 1,

-> 'AA',

-> 20),(

-> 2,

-> 'BB',

-> 21);

Query OK, 2 rows affected (0.04 sec)

Records: 2 Duplicates: 0 Warnings: 0

以上执行结果证明插入数据完成,这是通过一条SQL语句插入了两条数据,为了进一步验证,可以使用SELECT语句查看teacher表中的数据,SQL语句如下所示。

mysql> SELECT * FROM teacher;

+------+------+------+

| id | name | age |

+------+------+------+

| 1 | AA | 20 |

| 2 | BB | 21 |

+------+------+------+

2 rows in set (0.00 sec)

从以上执行结果可看出,teacher表中的数据批量插入成功,另外,SQL语句中字段名是可以省略的,接下来演示省略字段名的情况,SQL语句如下所示。

mysql> INSERT INTO teacher VALUES(

-> 3,

-> 'CC',

-> 22),(

-> 4,

-> 'DD',

-> 23);

Query OK, 2 rows affected (0.03 sec)

Records: 2 Duplicates: 0 Warnings: 0

以上执行结果证明插入数据完成,这是省略字段名,通过一条SQL语句插入了两条数据,为了进一步验证,可以使用SELECT语句查看teacher表中的数据,SQL语句如下所示。

mysql> SELECT * FROM teacher;

+------+------+------+

| id | name | age |

+------+------+------+

| 1 | AA | 20 |

| 2 | BB | 21 |

| 3 | CC | 22 |

| 4 | DD | 23 |

+------+------+------+

4 rows in set (0.00 sec)

从以上执行结果可看出,teacher表中的数据批量插入成功。

2.为指定列批量插入数据

数据批量插入时,同样可以指定某几列,其他列自动使用默认值,这与前面学习为指定列插入一条数据类似。

例3-7​ 向teacher表批量插入数据,且只插入前两列数据,SQL语句如下所示。

mysql> INSERT INTO teacher(

-> id,

-> name

-> ) VALUES(

-> 5,

-> 'EE'),(

-> 6,

-> 'FF');

Query OK, 2 rows affected (0.13 sec)

Records: 2 Duplicates: 0 Warnings: 0

以上执行结果证明插入数据完成,这是指定前两个字段,通过一条SQL语句插入了两条数据,为了进一步验证,可以使用SELECT语句查看teacher表中的数据,SQL语句如下所示。

mysql> SELECT * FROM teacher;

+------+------+------+

| id | name | age |

+------+------+------+

| 1 | AA | 20 |

| 2 | BB | 21 |

| 3 | CC | 22 |

| 4 | DD | 23 |

| 5 | EE | NULL |

| 6 | FF | NULL |

+------+------+------+

6 rows in set (0.00 sec)

从以上执行结果可看出,teacher表中的数据批量插入成功,且只为前两列插入了数据,第三列使用的是默认值。

3.2​ 更新数据

前面讲解了如何插入数据,数据插入之后,如果想变更,这就需要更新数据表中的数据,MySQL中使用UPDATE语句可以更新表中的数据,语法格式如下所示。

UPDATE 表名

SET 字段名1=值1 [,字段名2=值2,……]

[WHERE条件表达式];

以上语法格式中,“字段名”用于指定要更新的字段名称,“值”用于表示字段更新的新数据,如果要更新多个字段的值,可以用逗号分隔多个字段和值,“WHERE条件表达式”是可选的,用于指定更新数据需要满足的条件,UPDATE语句可以更新表中的部分数据和全部数据,接下来对这两种情况详细讲解。

1.更新全部数据

当UPDATE语句中不使用WHERE条件语句时,会将表中所有数据的指定字段全部更新。

例3-8​ 将teacher表中的所有表示年龄的age字段更新为30,首先使用SELECT语句查看teacher表中的数据,SQL语句如下所示。

mysql> SELECT * FROM teacher;

+------+------+------+

| id | name | age |

+------+------+------+

| 1 | AA | 20 |

| 2 | BB | 21 |

| 3 | CC | 22 |

| 4 | DD | 23 |

| 5 | EE | NULL |

| 6 | FF | NULL |

+------+------+------+

6 rows in set (0.00 sec)

从以上执行结果可看到teacher表中一共六条数据,现在要将所有表示年龄的age字段更新为30,SQL语句如下所示。

mysql> UPDATE teacher

-> SET age=30;

Query OK, 6 rows affected (0.04 sec)

Rows matched: 6 Changed: 6 Warnings: 0

以上执行结果可看到执行完成后提示了“Changed:6”,说明成功更新了六条数据,为了进一步验证,可以使用SELECT语句查看teacher表中的数据,SQL语句如下所示。

mysql> SELECT * FROM teacher;

+------+------+------+

| id | name | age |

+------+------+------+

| 1 | AA | 30 |

| 2 | BB | 30 |

| 3 | CC | 30 |

| 4 | DD | 30 |

| 5 | EE | 30 |

| 6 | FF | 30 |

+------+------+------+

6 rows in set (0.00 sec)

从以上执行结果可看到teacher表中所有的age字段都更新为了30,证明更新成功。

2.更新部分数据

前面讲解了更新全部数据的方法,这种需求一般在实际开发中比较少,而大多数需求是更新表中的部分数据,使用WHERE子句可以指定更新数据的条件。

例3-9​ 将emp表中姓名为“lilei”的员工工资修改为5000,首先使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 4000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 6000.00 | 2014-10-20 | none |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | female | 1995-07-10 | NULL | NULL | NULL |

| 6 | rin | male | 1996-01-01 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

6 rows in set (0.00 sec)

从以上执行结果可看到,第一条数据的姓名为“lilei”,现在要将其工资修改为5000,也就是将salary字段的值修改为5000,SQL语句如下所示。

mysql> UPDATE emp

-> SET salary=5000

-> WHERE name='lilei';

Query OK, 1 row affected (0.03 sec)

Rows matched: 1 Changed: 1 Warnings: 0

以上执行结果可看到执行完成后提示了“Changed:1”,说明成功更新了一条数据,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 6000.00 | 2014-10-20 | none |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | female | 1995-07-10 | NULL | NULL | NULL |

| 6 | rin | male | 1996-01-01 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

6 rows in set (0.00 sec)

从以上执行结果可看到emp表中姓名为“lilei”的员工工资成功修改为5000。

例3-10​ 将emp表中id为2的员工工资修改为8000,resume_text修改为“excellent”,首先使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 6000.00 | 2014-10-20 | none |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | female | 1995-07-10 | NULL | NULL | NULL |

| 6 | rin | male | 1996-01-01 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

6 rows in set (0.00 sec)

从以上执行结果可看到,第二条数据的id为2,现在要将其工资修改为8000,也就是将salary字段的值修改为8000,将其resume_text修改为“excellent”,SQL语句如下所示。

mysql> UPDATE emp

-> SET salary=8000,resume_text='excellent'

-> WHERE id=2;

Query OK, 1 row affected (0.04 sec)

Rows matched: 1 Changed: 1 Warnings: 0

以上执行结果可看到执行完成后提示了“Changed:1”,说明成功更新了一条数据,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 8000.00 | 2014-10-20 | excellent |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | female | 1995-07-10 | NULL | NULL | NULL |

| 6 | rin | male | 1996-01-01 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

6 rows in set (0.00 sec)

从以上执行结果可看到emp表中id为2的员工工资成功修改为8000,resume_text成功修改为excellent。

例3-11​ 将emp表中所有女性的的工资在原有基础上增加1000元,首先使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 8000.00 | 2014-10-20 | excellent |

| 3 | king | female | 1993-06-15 | 7000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | male | 1995-07-10 | NULL | NULL | NULL |

| 6 | rin | male | 1996-01-01 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

6 rows in set (0.00 sec)

从以上执行结果可看到,第二条和第三条数据的gender字段值为female,现在要将这两个女性员工工资增加1000元,也就是将salary字段的值增加1000,SQL语句如下所示。

mysql> UPDATE emp

-> SET salary=salary+1000

-> WHERE gender='female';

Query OK, 2 rows affected (0.07 sec)

Rows matched: 2 Changed: 2 Warnings: 0

以上执行结果可看到执行完成后提示了“Changed:2”,说明成功更新了两条数据,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 9000.00 | 2014-10-20 | excellent |

| 3 | king | female | 1993-06-15 | 8000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | male | 1995-07-10 | NULL | NULL | NULL |

| 6 | rin | male | 1996-01-01 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

6 rows in set (0.00 sec)

从以上执行结果可看到emp表中所有gender字段值为female的员工工资增加了1000元。

3.3​ 删除数据

删除数据也是数据库的常见操作,例如前面的员工表emp,如果插入一条员工信息,员工离职后,需要在emp表中将其信息删除等。接下来详细讲解如何删除数据。

3.3.1​ 使用DELETE删除数据

MySQL中可以使用DELETE语句删除表中数据,语法格式如下所示。

DELETE FROM 表名 [WHERE 条件表达式];

以上语法中,WHERE条件语句是可选的,用于指定删除数据满足的条件,通过DELETE语句可以实现删除全部数据或者删除部分数据,接下来分别针对这两种情况进行详细的讲解。

1.删除全部数据

当DELETE语句中不使用WHERE条件语句时,会将表中数据删除。

例3-12​ 将teacher表中所有数据都删除,首先使用SELECT语句查看teacher表中的数据,SQL语句如下所示。

mysql> SELECT * FROM teacher;

+------+------+------+

| id | name | age |

+------+------+------+

| 1 | AA | 30 |

| 2 | BB | 30 |

| 3 | CC | 30 |

| 4 | DD | 30 |

| 5 | EE | 30 |

| 6 | FF | 30 |

+------+------+------+

6 rows in set (0.00 sec)

从以上执行结果可看到teacher表中一共六条数据,现在将表中全部数据删除,SQL语句如下所示。

mysql> DELETE FROM teacher;

Query OK, 6 rows affected (0.03 sec)

以上执行结果说明删除成功,为了进一步验证,可以使用SELECT语句查看teacher表中的数据,SQL语句如下所示。

mysql> SELECT * FROM teacher;

Empty set (0.00 sec)

从以上执行结果可看到teacher表中已经没有数据,证明删除成功。

2.删除部分数据

前面讲解了删除全部数据的方法,但在实际开发中大多数需求是删除表中的部分数据,使用WHERE子句可以指定删除数据的条件。

例3-13​ 将emp表中姓名为“rin”的员工记录删除,首先使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 9000.00 | 2014-10-20 | excellent |

| 3 | king | female | 1993-06-15 | 8000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | male | 1995-07-10 | NULL | NULL | NULL |

| 6 | rin | male | 1996-01-01 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

6 rows in set (0.00 sec)

从以上执行结果可看到,最后一条数据的姓名为“rin”,现在要将其删除,SQL语句如下所示。

mysql> DELETE FROM emp

-> WHERE name='rin';

Query OK, 1 row affected (0.03 sec)

以上执行结果说明成功删除了一条数据,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 9000.00 | 2014-10-20 | excellent |

| 3 | king | female | 1993-06-15 | 8000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | male | 1995-07-10 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

5 rows in set (0.00 sec)

从以上执行结果可看到emp表中姓名为“rin”的员工记录已经删除。

例3-14​ 将emp表中工资小于8500的女员工删除,首先使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 9000.00 | 2014-10-20 | excellent |

| 3 | king | female | 1993-06-15 | 8000.00 | 2014-07-10 | none |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | male | 1995-07-10 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

5 rows in set (0.00 sec)

从以上执行结果可看到,其中女员工有两个,女员工中工资小于8500的只有king,现在要将其删除,SQL语句如下所示。

mysql> DELETE FROM emp

-> WHERE gender='female'

-> AND salary<8500;

Query OK, 1 row affected (0.07 sec)

以上执行结果说明成功删除了一条数据,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 9000.00 | 2014-10-20 | excellent |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | male | 1995-07-10 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

4 rows in set (0.00 sec)

从以上执行结果可看到emp表中工资低于8500的女员工记录已经删除。

3.3.2​ 使用TRUNCATE删除数据

在MySQL中还有一种方式可以删除表中的所有数据,这种方式需要用到TRUNCATE关键字,语法格式如下所示。

TRUNCATE [TABLE] 表名;

以上所示语法非常简单,接下来通过一个案例来演示TRUNCATE的用法。

例3-15​ 利用TRUNCATE关键字将emp表中所有数据删除,首先使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+------+-------+--------+------------+---------+------------+-------------+

| id | name | gender | birthday | salary | entry_date | resume_text |

+------+-------+--------+------------+---------+------------+-------------+

| 1 | lilei | male | 1991-05-10 | 5000.00 | 2013-06-10 | none |

| 2 | lucy | female | 1988-03-15 | 9000.00 | 2014-10-20 | excellent |

| 0 | 2013 | 5000 | 1992-01-01 | 0.00 | 0000-00-00 | 4 |

| 5 | mary | male | 1995-07-10 | NULL | NULL | NULL |

+------+-------+--------+------------+---------+------------+-------------+

4 rows in set (0.00 sec)

从以上执行结果可看到,emp表中一共有四条记录,现在要利用TRUNCATE关键字将其全部删除,SQL语句如下所示。

mysql> TRUNCATE TABLE emp;

Query OK, 0 rows affected (0.18 sec)

以上执行结果说明操作成功,为了进一步验证,可以使用SELECT语句查看emp表中的数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

Empty set (0.00 sec)

从以上执行结果可看到emp表中全部数据成功删除。

TRUNCATE语句和DELETE语句都能实现删除表中的所有数据,但两者有一定区别,它们的区别如下。

​ DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句。

​ DELETE语句后面可以跟WHERE子句,指定条件从而实现删除部分数据,TRUNCATE语句只能用于删除表中所有的数据。

​ 使用TRUNCATE语句删除表中数据后,再次向表中添加记录时,自增的字段默认值重置为1,而使用DELETE语句删除表中数据后,再次向表中添加记录时,自增的字段值为删除时该字段的最大值加1。

以上就是MySQL数据表中数据的操作,大家不需要死记硬背,应该多练习,在实践中快速提升熟练程度。

3.4​ 本章小结

本章主要针对如何操作数据表中的数据进行讲解,首先讲解了插入数据,分为为所有列插入数据指定列插入数据和批量插入数据,接着讲解了更新数据,更新数据分为所有列更新数据和为指定列更新数据,最后讲解了如何删除数据。通过本章的学习,大家能够掌握表中数据的基本操作,为以后的数据库控制打下良好的基础。

3.5​ 习题

1.思考题

(1) 请简述如何为所有列插入数据。

(2) 请简述如何为指定列插入数据。

(3) 请简述如何批量插入数据。

(4) 请简述如何更新指定列的数据。

(5) 请简述DELETE和TRUNCATE的区别。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。