数据表的基本操作

数据库是由多张数据表组成的。一个数据库中可以存在多张表,我们每一张数据表就存着具体的数据。

image.png

例如我们想象一个场景:

有一家企业A。公司里经常会发生人员流动那么我们就会拿一本小本子记起来。然后每一页纸写着一个人的个人信息。例如:姓名,性别,年龄,身份证号,电话号码,生日,家庭住址,入职时间等等更多的信息。一旦有新员工进来我们就填写一页纸,一旦有人离职我们撕掉一页纸。


这个场景中,我们的小本子就是我们的数据表姓名。。。等信息就是我们数据的字段

image.png

从我们刚刚到场景中我们我们可以了解到,我们的小本子上记录着都是有着一定的组织结构。然后每一页都往里面去填写相应的信息。

在MySQL中创建数据表的基本语法格式如下:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 表名

(字段名 字段类型 [字段属性]…) [表选项]

在上述语法中,可选项 TEMPORARY 表示临时表,仅在当前会话中可见,并且在会话关闭时自动删除。可选的“表选项”用于设置表的相关特性,如存储引擎(ENGINE)字符集(CHARSET)校对集(COLLATE)

删除数据表操作指的是删除指定数据库中已经存在的表。另外,在删除数据表的同时,存储在数据表中的数据都将被删除,基本语法格式如下。

1
DROP [TEMPORARY] TABLE [IF EXISTS] 数据表 1 [, 数据表 2] ;

从上述语法可知,删除数据表时,可同时删除多个数据表,多个数据表之间使用逗号分隔。可选项IF EXISTS用于在删除一个不存在的数据表时,防止产生错误。

通常情况下,要想操作数据表中的数据,首先要保证数据表中存在数据。MySQL 中使用 INSERT 语句向数据表中添加数据。根据操作的不同目的一般可以分为两种,一种是为所有字段添加数据,另外一种是为部分字段添加数据。下面将对这两种操作进行详细地讲解。

MySQL中,为所有字段插入记录时,可以省略字段名称,严格按照数据表结构(字段的位置)插入对应的值,基本语法格式如下。

1
INSERT [INTO] 数据表名 {VALUES|VALUE}( 1[,  2] );

从上述语法可知,关键字INTO是可选项,VALUESVALUE可以任选一种,通常情况下使用VALUE。值列表值 1 [,值 2] …中多个值之间使用逗号分隔

修改数据是数据库中常见的操作,通常用于对表中的部分记录进行修改。例如,商品在做活动时,需要在原价的基础上打折,此时就需要对商品价格的数据进行修改。MySQL提供了UPDATE语句修改数据。基本语法格式如下。

1
2
3
4
5
  UPDATE 数据表名

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

  [WHERE 条件表达式]

删除数据是指对表中存在的记录进行删除。例如,商品停产后,可以删除商品表中的相关数据。MySQL 中使用DELETE语句删除表中的记录,基本语法格式如下。

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

在上述语法中,数据表名指定要执行删除操作的表,WHERE条件为可选参数,用于设置删除的条件,满足条件的记录会被删除。

查询数据表中所有字段的数据,可以使用星号*通配符代替数据表中的所有字段名,基本语法格式如下。

1
2
3
4
5
6
7
SELECT 字段名, 字段名

FROM 数据表名

[WHERE 条件表达式]

[LIMIT N][ OFFSET M]

我们进行创建员工信息表。

首先我们先创建一个数据库;

1
2
3
mysql> create database p03;

Query OK, 1 row affected (0.01 sec)
1
2
3
mysql> use p03;

Database changed

需要注意的是,在操作数据表之前,应该使用USE 数据库名指定操作是在哪个数据库中进行,否则会抛出No database selected错误。

我们假定所需要的基本信息为: 员工编号,员工姓名,员工性别,员工联系方式。

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `employee`(
	`id` INT(11),
	`name` VARCHAR(255),
	`sex` VARCHAR(255),
	`mobile` VARCHAR(255),
	PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

到目前我们已经成功创建了数据表,可以通过show tables查看当前数据库的所有表进行验证我们的操作步骤:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
mysql> show tables;

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

| Tables_in_p03 |

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

| employee      |

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

1 row in set (0.00 sec)

回顾我们刚刚创建数据表的语法中

id INT(11) => 字段名为id, 字段类型为INT,他的长度是11.未填写其它的字段属性

name VARCHAR(255) => 字段名为name, 字段类型为VARCHAR,他的长度是255.未填写其它的字段属性

我们将在下一个章节中详细了解数据类型

在我们之前的数据表创建格式中相互对应。

到目前为止我们已经做的很好了,但是突然发现缺乏了入职时间,无法对员工们对工龄去计算。所以在我们原有的表结构中添加。

我们添加employee_date字段,并且我们该字段为date

我们可以通过语法ALTER TABLE进行修改,通过DESC完整数据表结构

1
2
3
4
5
mysql> alter table employee add employee_date date;

Query OK, 0 rows affected (0.08 sec)

Records: 0  Duplicates: 0  Warnings: 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> DESC employee# 下面是我们的完整输出表结构

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

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

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

| id            | int(11)      | NO   | PRI | NULL    |       |

| name          | varchar(255) | YES  |     | NULL    |       |

| sex           | varchar(255) | YES  |     | NULL    |       |

| mobile        | varchar(255) | YES  |     | NULL    |       |

| employee_date | date         | YES  |     | NULL    |       |

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

5 rows in set (0.01 sec)

我们已经创建好了数据表结构接着我们对表内数据进行增加

公司内部新来了一批雇员,他们的信息如下:

用户编号 姓名 性别 手机号 入职时间

1 张三 男 18000000000 2018-05-14

2 李四 男 18111111111 2020-01-20

3 王五 女 18222222222 2019-08-23

4 林六 男 18333333333 2020-06-06

5 陈七 女 18444444444 2018-04-19

我们开始进行单次数据添加:

1
2
3
mysql> INSERT INTO employee VALUES(1, '张三', '男', '18000000000', "2018-05-14");

Query OK, 1 row affected (0.01 sec)

或者指定列进行数据插入

1
2
3
mysql> INSERT INTO employee(id, name, sex, mobile, employee_date) VALUES(2, '李四', '男', '18111111111', "2020-01-20");

Query OK, 1 row affected (0.01 sec)

也可以使用批量插入数据:

1
2
3
4
5
mysql> INSERT INTO employee(id, name, sex, mobile, employee_date) VALUES(3, '王五', '女', '18222222222', "2019-08-23"),(4, '林六', '男', '18333333333', "2020-06-06"), (5, '陈七', '女', '18444444444', "2018-04-19");

Query OK, 3 rows affected (0.00 sec)

Records: 3  Duplicates: 0  Warnings: 0

我们可以查看当前所有员工的信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select * from employee;

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

| id | name   | sex  | mobile      | employee_date |

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

|  1 | 张三   |    | 18000000000 | 2018-05-14    |

|  2 | 李四   |    | 18111111111 | 2020-01-20    |

|  3 | 王五   |    | 18222222222 | 2019-08-23    |

|  4 | 林六   |    | 18333333333 | 2020-06-06    |

|  5 | 陈七   |    | 18444444444 | 2018-04-19    |

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

5 rows in set (0.00 sec)

张三在公司里待的资历最久,但是隔壁企业看中了张三的工作能力高薪挖走了人才,现在公司紧急招聘了一个新员工,来暂时顶替张三的位置。所以我们将张三的内容替换成新员工的信息。

员工信息: 赵九 女 1855555555 2020-10-01

根据员工信息我们得出SQL语句

1
2
3
4
5
mysql> update employee set name='赵九',sex='女',mobile='1855555555',employee_date='2020-10-01' where name='张三';

Query OK, 1 row affected (0.01 sec)

Rows matched: 1  Changed: 1  Warnings: 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select * from employee;

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

| id | name   | sex  | mobile      | employee_date |

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

|  1 | 赵九   |    | 1855555555  | 2020-10-01    |

|  2 | 李四   |    | 18111111111 | 2020-01-20    |

|  3 | 王五   |    | 18222222222 | 2019-08-23    |

|  4 | 林六   |    | 18333333333 | 2020-06-06    |

|  5 | 陈七   |    | 18444444444 | 2018-04-19    |

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

5 rows in set (0.00 sec)

可以看到赵九成功暂顶了张三的位置。