RDBMS表中数据的基本操作
本章学习目标
熟练掌握插入数据
熟练掌握修改数据
熟练掌握删除数据
前面讲解了如何对数据库和表进行操作,如果想操作表中的数据,还需要通过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的区别。
- 点赞
- 收藏
- 关注作者
评论(0)