第 2 章 数据库和表的基本操作
本章学习目标
熟练掌握 MySQL 支持的数据类型
熟练掌握数据库的基本操作
熟练掌握数据表的基本操作
上一章讲解了数据库的基本概念和 MySQL 的安装等内容,本章将继续讲解 MySQL 支
持的数据类型、数据库和数据表的基本操作。
2.1 MySQL 支持的数据类型
学习怎样使用 MySQL 操作数据库,首先要了解其支持的数据类型,MySQL 支持所有
标准的 SQL 数据类型,主要包括数值类型、日期时间类型和字符串类型,接下来详细讲解
这三种数据类型。
2.1.1 数值类型
MySQL 支持所有标准 SQL 中的数值类型,其中包括严格数据类型,例如 INTEGER、
SMALLINT、DECIMAL 和 NUMBERIC,以及近似数值数据类型,例如 FLOAT、REAL 和
DOUBLE PRESISION,并在此基础上进行扩展,扩展后增加了 TINYINT、MEDIUMINT 和
BIGINT 这三种长度不同的整型,另外还增加了 BIT 类型,用来存放位数据。
MySQL 中不同数值类型所对应的字节大小和取值范围是不同的,具体如表 2.1 所示。
表 2.1
MySQL 数值类型
数据类型
字节数
无符号数的取值范围
有符号数的取值范围
TINYINT
SMALLINT
MEDIUMINT
INT / INTEGER
BIGINT
FLOAT
DOUBLE
1
2
3
4
8
4
8
DECIMAL(M,D) M+2
0~255
0~65535
0~16777215
0~4294967295
0~18446744073709551615
-128~127
-32768~32767
-8388608~8388607
-2147483648~2147483647
-9223372036854775808~
9223372036854775807
0 和 1.175494351E-38~
3.402823466E+38
-3.402823644E+38~
-1.175494351E-38
0 和 2.2250738585072014E-308~
1.7976931348623157E+308
-1.7976931348623157E+308~
2.2250738585072014E-308
0 和 2.2250738585072014E-308~
1.7976931348623157E+308
-1.7976931348623157E+308~
2.2250738585072014E-308
表 2.1 中可以看出,占用字节最小的是 TINYINT,占用字节数最大的是 BIGINT,
DECIMAL 类型的取值范围与 DOUBLE 类型相同。
MySQL 中支持的五个主要整数类型是 TINYINT、SMALLINT、MEDIUMINT、INT 和
BIGINT。这些类型在很大程度上是相同的,只是它们存储值的大小是不相同的。
MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类
型用于表示单精度浮点数值,而 DOUBLE 数值类型用于表示双精度浮点数值。
2.1.2 字符串类型
MySQL 提 供 了 八 个 基 本 的 字 符 串 类 型 , 分 别 为 CHAR 、VARCHAR 、BINARY、
VARBINARY、BLOB、TEXT、ENUM 和 SET 类型,可以存储的范围从简单的一个字符到
巨大的文本块或二进制字符串数据,常见的字符串类型所对应的字节大小和取值范围如表
2.2 所示。
表 2.2
MySQL 字符串类型
数据类型
字节数
类型描述
CHAR
VARCHAR
TINYBLOB
TINYTEXT
BLOB
TEXT
MEDIUMBLOB
MEDIUMTEXT
LOGNGBLOB
LONGTEXT
VARBINARY(M)
BINARY(M)
0~255
0~255
0~255
0~255
0~65535
0~65535
0~16777215
0~16777215
0~4294967295
0~4294967295
0~M
0~M
定长字符串
可变长字符串
不超过 255 个字符的二进制字符串
短文本字符串
二进制形式的长文本数据
长文本数据
二进制形式的中等长度文本数据
中等长度文本数据
二进制形式的极大文本数据
极大文本数据
允许长度 0~M 个字节的定长字节符串,值
的长度+1 个字节
允许长度 0~M 个字节的定长字节符串
表 2.2 列出了常见的字符串类型,其中有些类型比较相似,接下来详细讲解一些容易混
淆的类型。
1.CHAR 和 VARCHAR 类型
CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大
小修饰符的范围是 0~255,比指定长度大的值将被截短,而比指定长度小的值将会用空格作
填补。
CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二
进制方式参与运算,而不是以传统的区分大小写的方式。
CHAR 类型的一个变体是 VARCHAR 类型。它是一种可变长度的字符串类型,并且也
必须带有一个范围在 0~255 之间的指示器。CHAR 和 VARCHGAR 不同之处在于 MYSQL
数据库处理这个指示器的方式,CHAR 把这个大小视为值的大小,在长度不足的情况下就用
空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度(增
加一个额外字节来存储字符串本身的长度)来存储值,所以短于指示器长度的 VARCHAR
类型不会被空格填补,但长于指示器的值仍然会被截短。
VARCHAR 类型可以根据实际内容动态改变存储值的长度,因此在不能确定字段需要多
少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率,VARCHAR 类型
在使用 BINARY 修饰符时与 CHAR 类型完全相同。
2.TEXT 和 BLOB 类型
对于字段长度超过 255 的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储
数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等
二进制数据类型。
TEXT 类型和 BLOB 类型的相同点具体如下。
在 TEXT 或 BLOB 列的存储或检索过程中,不存在大小写转换,当未运行在严格
模式时,如果为 BLOB 或 TEXT 列分配一个超过该列类型的最大长度值时,值会
被截取。如果截掉的字符不是空格,将会产生一条警告。
BLOB 和 TEXT 列都不能有默认值。
当保存或检索 BLOB 和 TEXT 列的值时不删除尾部空格。
对于 BLOB 和 TEXT 列的索引,必须指定索引前缀的长度。
TEXT 类型和 BLOB 类型的不同点具体如下。
TEXT 值是大小写不敏感的,而 BLOB 是大小写敏感的。
TEXT 被视为非二进制字符串,而 BLOB 被视为二进制字符串。
TEXT 列有一个字符集,并且根据字符集的校对规则对值进行排序和比较,BLOB
列没有字符集。
可以将 TEXT 列视为 VARCHAR 列,在大多数情况下,可以将 BLOB 列视为足够
大的 VARBINARY 列。
BLOB 可以储存图片,而 TEXT 不可以,TEXT 只能储存纯文本文件。
2.1.3 日期时间类型
在处理日期和时间类型的值时,MySQL 带有不同的数据类型可供选择。它们可以被分
成简单的日期、时间类型和混合的日期、时间类型。根据要求的精度,子类型在每个分类型
中都可以使用,并且 MySQL 带有内置功能,可以将多样化的输入格式变为一个标准格式。
日期和时间类型同样有对应的字节数和取值范围等,如表 2.3 所示。
表 2.3
MySQL 日期和时间类型
数据类型
字节数
取值范围
日期格式
零值
YEAR
DATE
TIME
DATETIME
TIMESTAMP
1
4
3
8
4
1901~2155
YYYY
0000
1000-01-01~9999-12-3
YYYY-MM-DD
0000-00-00
-838:59:59~838:59:59
HH:MM:SS
00:00:00
1000-01-01 00:00:00~
9999-12-31 23:59:59
1970-01-01 00:00:01~
2038-01-19 03:14:07
YYYY-MM-DD
HH:MM:SS
YYYY-MM-DD
HH:MM:SS
0000-00-00 00:00:00
0000-00-00 00:00:00
表 2.3 中,每种日期和时间类型都有一个有效范围。如果插入的值超过这个范围,系统
会报错,并将 0 值插入到数据库中,不同的日期与时间类型有不同的 0 值,上表中已经详细
列出。接下来详细讲解上表中的几种数据类型。
1.YEAR
YEAR 类型使用 1 个字节来表示年份,MySQL 中以 YYYY 的形式来显示 YEAR 类型
的值,为 YEAR 类型的字段赋值表示方法如下。
使用 4 位字符串和数字表示。其范围是 1901~2155。输入格式为'YYYY'或 YYYY。
例如,输入‘2008’或者 2008,可直接保存 2008。如果超过了范围,就会插入 0000。
使用两位字符串表示。‘00’~‘69’转换为 2000~2069,‘70’~‘99’转换为 1970~1999。
例如,输入‘35’,YEAR 值会转换成 2035,输入‘90’,YEAR 值会转换成 1990。
使用两位数字表示。1~69 转换为 2001~2069,70~99 转换为 1970~1999。这里就不
再举例。
另外,一般用 YEAR 类型来表示年份,所以在对该字段进行相关操作的时候,最好使
用四位字符串或者数字表示,不要使用两位的字符串和数字。
有时可能会插入 0 或者‘0’。这里要严格区分 0 和‘0’,如果向 YEAR 类型的字段插
入 0,存入该字段的年份是 0000;如果向 YEAR 类型的字段插入‘0’,存入的年份是 2000。
2.TIME 类型
TIME 类型使用 3 个字节来表示时间。MySQL 中以 HH:MM:SS 的形式显示 TIME 类型
的值。其中,HH 表示时,取值范围为 0~23,MM 表示分,取值范围为 0~59,SS 表示秒,
取值范围是 0~59。
TIME 类型的范围可以从‘-838:59:59’~‘838:59:59’。虽然小时的范围是 0~23,
但是为了表示某种特殊需要的时间间隔,将 TIME 类型的范围扩大了。而且还支持了负值。
TIME 类型的字段赋值表示方法如下。
表示‘D HH:MM:SS’格式的字符串。其中,D 表示天数,取值范围是 0~34。保
存时,小时的值等于(D*24+HH)。例如,输入‘2 11:30:50’,TIME 类型会转
换为 59:30:50。当然,输入时可以不严格按照这个格式,可以是‘HH:MM:SS’、
'HH:MM'、'D HH:MM'、'D HH'、'SS'等形式。例如,输入‘30’,TIME 类型会自
动转换为 00:00:30。
表示‘HHMMSS’格式的字符串或 HHMMSS 格式的数值,例如,输入‘123456’,
TIME 类型会转换成 12:34:56。如果输入 0 或者‘0’,那么 TIME 类型会转换为
0000:00:00。
使 用 current_time 或 者 current_time() 或 者 now() 输 入 当 前 系 统 时 间 , 这 些 属 于
MySQL 的函数,会在以后的章节讲解。
还需注意的是,一个合法的 TIME 值,如果超出了 TIME 的范围,将被截取为范围最接
近的端点。举个例子,‘880:00:00’将会被转换为 838:59:59。另外,无效的 TIME 值,
在命令行下无法被插入到表中。
3.DATE 类型
DATE 类型使用 4 个字节来表示日期。MySQL 中是以 YYYY-MM-DD 的形式显示 DATE
类型的值。其中,YYYY 表示年,MM 表示月,DD 表示日。DATE 类型的范围是‘1000-01-01’
~‘9999-12-31’。DATE 类型的字段赋值表示方法如下。
表示‘YYYY-MM-DD’或‘YYYYMMDD’格式的字符串,DATE 类型可以表达
的范围是‘1000-01-01’~‘9999-12-31’。例如,输入‘4008-2-8’,DATE 类型将
转换为 4008-02-08;输入‘40080308’,DATE 类型将转换为 4008-03-08。
MySQL 中还支持一些不严格的语法格式,任何标点都可以用来做间隔符。如
‘YYYY/MM/DD’、‘YYYY@MM@DD’和‘YYYY.MM.DD’等分隔形式。例
如,输入‘2011.3.8’,DATE 类型将转换为 2011-03-08。
表示‘YY-MM-DD’或者‘YYMMDD’格式的字符串,其中‘YY’的取值,‘00’
~‘69’转换为 2000~2069,‘70’~‘99’转换为 1970~1999,与 YEAR 类型类似。
例如,输入‘35-01-02’,DATE 类型将转换为 2035-01-02,输入‘800102’,DATE
类型将转换为 1980-01-02。
同 样 的 , MySQL 中 也 支 持 一 些 不 严 格 的 语 法 格 式 , 如 ‘ YY/MM/DD ’,
‘YY@MM@DD’,‘YY.MM.DD’等分隔形式。例如,输入‘89@3@8’,DATE
类型将转换为 1989-03-08。
YYYYMMDD 或 YYMMDD 格式的数字表示。其中,‘YY’的取值,‘00’~‘69’
转换为 2000~2069,‘70’~‘99’转换为 1970~1999。与 year 类型类似。例如,输
入 20080808,DATE 类型将转换为 2008-08-08;输入 790808,DATE 类型将转换为
1979-08-08;输入 0,那么 DATE 类型会转化为 0000-00-00。
使用 current_date 或 now()输入当前系统时间,这些属于 MySQL 的函数,会在以后
的章节讲解。
在实际开发中,如果只需要记录日期,选择 DATE 类型是最合适的,因为 DATE 类型
只占用 4 个字节,需要注意的是,虽然 MySQL 支持 DATE 类型的一些不严格的语法格式,
但是,在实际应用中,最好还是选择标准形式。日期中使用“-”做分隔符,时间用“:”做
分隔符,中间用空格隔开,格式如 2016-03-17 16:27:55。当然如果有特殊需要,可以使用“@”,
“*”等特殊字符做分隔符。
4.DATETIME 类型
DATETIME 类 型 使 用 8 个 字 节 来 表示 日 期 和 时 间 。MySQL 中 以 ‘YYYY-MM-DD
HH:MM:SS’的形式来显示 DATETIME 类型的值。从其形式上可以看出,DATETIME 类型
可以直接用 DATE 类型和 TIME 类型组合而成。DATETIME 类型的字段赋值表示方法如下。
表示‘YYYY-MM-DD HH:MM:SS’或‘YYYYMMDDHHMMSS’格式的字符串。
这种方式可以表达的范围是‘1000-01-01 00:00:00’~‘9999-12-31 23:59:59’。例如,
输入‘2008-08-08 08:08:08’,DATETIME 类型会自动转换为 2008-08-08 08:08:08,
输入‘20080808080808’,同样转换为 2008-08-08 08:08:08。
MySQL 中还支持一些不严格的语法格式,任何的标点都可以用来做间隔符。情况
与 DATE 类型相同,而且时间部分也可以使用任意的分隔符隔开,这与 TIME 类型
不同,TIME 类型只能用‘:’隔开。例如,输入‘2008@08@08 08*08*08’,数据
库中 DATETIME 类型统一转换为 2008-08-08 08:08:08。
表示‘YY-MM-DD HH:MM:SS’或‘YYMMDDHHMMSS’格式的字符串。其中
‘YY’的取值,‘00’~‘69’转换为 2000~2069,‘70’~‘99’转换为 1970~1999。
与 YEAR 类型和 DATE 类型相同。例如,输入‘69-01-01 11:11:11’,数据库中插
入 2069-01-01 11:11:11 , 输 入 ‘ 70-01-01 11:11:11 ’, 数 据 库 中 插 入 1970-01-01
11:11:11。
使用 now()来输入当前系统日期和时间,这属于 MySQL 的函数,会在后面的章节
讲解。
DATETIME 类型用来记录日期和时间,其作用等价于 DATE 类型和 TIME 类型的组合。
一个 DATETIME 类型的字段可以用一个 DATE 类型的字段和一个 TIME 类型的字段代替。
但是如果需要同时记录日期和时间,选择 DATETIME 类型是个不错的选择。
5.TIMESTAMP 类型
TIMESTAMP 类 型 使 用 4 个 字 节 来 表 示 日 期 和 时 间 。TIMESTAMP 类 型 的 范 围 是
1970-01-01 08:00:01~2038-01-19 11:14:07。MySQL 中也是以‘YYYY-MM-DD HH:MM:SS’
的形式显示 TIMESTAMP 类型的值。从其形式可以看出,TIMESTAMP 类型与 DATETIME
类型显示的格式是一样的。给 TIMESTAMP 类型的字段赋值的表示方法基本与 DATETIME
类型相同。值得注意的是,TIMESTAMP 类型范围比较小,没有 DATETIME 类型的范围那
么大。因此输入值时要保证在 TIMESTAMP 类型的有效范围内。
2.2 数据库的基本操作
前面讲解了 MySQL 支持的数据类型,接下来详细讲解数据库的相关操作。
2.2.1 创建和查看数据库
创建数据库就是在数据库系统中划分一块存储数据的空间,在 MySQL 中,创建数据库
的语法格式如下所示。
CREATE DATEBASE 数据库名称;
以上示例中是创建数据库的语法,这里要注意的是,数据库名称是唯一的,不能重复。
例 2-1 创建一个名为 qianfeng 的数据库,SQL 语句如下所示。
CREATE DATABASE qianfeng;
执行结果如下所示。
mysql> CREATE DATABASE qianfeng;
Query OK, 1 row affected (0.01 sec)
以上执行结果证明 SQL 语句运行成功,为了验证数据库系统中是否创建了名为 qianfeng
的数据库,需要查看数据库,查看数据库的 SQL 语句如下所示。
SHOW DATABASES;
例 2-2 查看所有已存在的数据库,SQL 语句如下所示。
mysql> SHOW DATABASES;
+--------------------+
| Database
|
+--------------------+
| information_schema |
| mysql
|
| performance_schema |
| qianfeng
|
| test
|
+--------------------+
5 rows in set (0.00 sec)
从以上执行结果中可看出,数据库中一共存在五个数据库,其中有四个 MySQL 自动创
建的库,还有一个名为 qianfeng 的库是例 2-1 创建的数据库。
另外,还可以查看已经创建的数据库信息,语法格式如下所示。
SHOW CREATE DATABASE 数据库名称;
例 2-3 查看创建的数据库 qianfeng 的信息,SQL 语句如下所示。
mysql> SHOW CREATE DATABASE qianfeng;
+----------+---------------------------------
----------------------------------+
| Database | Create Database
+----------+---------------------------------
----------------------------------+
| qianfeng | CREATE DATABASE `qianfeng`
/*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------
|
---------------------------------+
1 row in set (0.00 sec)
以上执行结果显示了数据库 qianfeng 的创建信息,例如编码方式为 utf8。
除了以默认编码方式创建数据库,还可以指定编码方式创建数据库,例如创建一个名为
qianfeng2 的数据库,编码指定为 gbk,SQL 语句如下所示。
mysql> CREATE database qianfeng2 character set gbk;
Query OK, 1 row affected (0.00 sec)
执行成功后,可以查看数据库 qianfeng2 的信息,SQL 语句如下所示。
mysql> SHOW CREATE DATABASE qianfeng2;
+----------+---------------------------------
----------------------------------+
| Database | Create Database
+----------+---------------------------------
----------------------------------+
| qianfeng | CREATE DATABASE `qianfeng2`
/*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+----------------------------------
---------------------------------+
1 row in set (0.00 sec)
从执行结果可看出,新创建的数据库 qianfeng2,编码方式为 gbk。
|
2.2.2 使用数据库
创建数据库后,如果在创建的数据库中进行操作,还需要切换到该数据库,具体语法格
式如下。
USE 数据库名;
例 2-4 切换到数据库 qianfeng,SQL 语句如下所示。
mysql> USE qianfeng;
Database changed
看到 Database changed 提示,证明已经切换到了数据库 qianfeng,另外,在使用数据库
时,还可以查看当前使用的是哪个数据库,SQL 语句如下所示。
mysql> SELECT database();
+------------+
| database() |
+------------+
| qianfeng
|
+------------+
1 row in set (0.00 sec)
从执行结果可看出,此时使用的是数据库 qianfeng。
2.2.3 修改数据库
前面讲解了如何创建和查看数据库,数据库创建完成后,编码也就确定了,若想修改数
据库的编码,可以使用 ALTER DATABASE 语句实现,具体语法格式如下。
ALTER DATABASE 数据库名称 DEFAULT CHARACTER
SET 编码方式 COLLATE 编码方式_bin;
例 2-5 将数据库 qianfeng 的编码修改为 gbk,SQL 语句如下所示。
mysql> ALTER DATABASE qianfeng DEFAULT CHARACTER
SET gbk COLLATE gbk_bin;
Query OK, 1 row affected (0.01 sec)
修改完成后,可以查看是否修改成功,SQL 语句如下所示。
mysql> SHOW CREATE DATABASE qianfeng;
+----------+---------------------------------
----------------------------------+
| Database | Create Database
+----------+---------------------------------
----------------------------------+
| qianfeng | CREATE DATABASE `qianfeng`
/*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+----------------------------------
---------------------------------+
1 row in set (0.00 sec)
从以上执行结果可看出,数据库 qianfeng 的编码为 gbk,说明数据库的编码修改成功。
|
2.2.4 删除数据库
删除数据库就是将数据库系统中已经存在的数据库删除,删除后,数据库中所有数据会
被清除,为数据库分配的空间也将被回收,删除数据库的语法格式如下。
DROP DATABASE 数据库名称;
例 2-6 将数据库 qianfeng 删除,SQL 语句如下所示。
mysql> DROP DATABASE qianfeng;
Query OK, 0 rows affected (0.01 sec)
删除完成后,为了验证删除数据库的操作是否成功,可以查看数据库系统中的所有库,
SQL 语句如下所示。
mysql> SHOW DATABASES;
+--------------------+
| Database
|
+--------------------+
| information_schema |
| mysql
|
| performance_schema |
| test
|
+--------------------+
4 rows in set (0.00 sec)
从以上执行结果可看出,数据库系统中已经不存在名称为 qianfeng 的数据库,证明数据
库的删除操作成功。
2.3 数据表的基本操作
前面讲解了对数据库的操作,接下来还需要学习对数据表的操作。