2. 创建与管理数据表
2. 创建与管理数据表
在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。
每一行代表唯一的记录,每一列称为一个字段,每一列都有一个与其它列不重复的名称,称为字段名。数据表中的一列由一组字段值组成,若某个字段的值出现重复,该字段称为普通字段,若某个字段的值不允许重复,该字段称为索引字段。
MYSQL 常用数据类型
MySQL 中常用的数据类型有数值类型、字符串类型、日期和时间类型、二进制数据类型、逻辑类型。
数值类型
类型 | 存储要求 | 取值范围(有符号) | 取值范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT[(M)] | 1byte | -128~127 | 0~255 | 小整数值 |
SMALLINT[(M)] | 2byte | -32768~32767 | 0~65535 | 大整数值 |
MEDIUMINT[(M)] | 3byte | -8388608~8388607 | 0~16777215 | 大整数值 |
INT 或 INTEGER[(M)] | 4byte | -2147683648~2147683647 | 0~4294967295 | 大整数值 |
BIGINT[(M)] | 8byte | -9223372036854775808~9223373036854775807 | 0~18446744073709551615 | 极大整数值 |
FLOAT[(M,D)] | 4byte | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE[(M,D)] | 8byte | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度浮点数值 |
DECIMAL(M,D) | mbyte | 依赖于 M 和 D 的值 | 依赖于 M 和 D 的值 | 小数值 |
MySQL 的 5 种整型:TINYINT
、SMALLINT
、MEDIUMINT
、INT
、BIGINT
。这些整数型可定义为 UNSIGNED
(无符号),从而禁用负值。
MySQL 中的 3 种浮点类型不能定义为 UNSIGNED
。
M:一个 1~255 的整数,表示用来显示列中的字符数。
D:一个 0~30 的整数,表示小数位数。
字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16777215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4294967295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4294967295 bytes | 极大文本数据 |
定长字符串存储长度固定,需要在创建的时候指定。
日期和时间类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038 年 1 月 19 日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
插入当前系统时间,可以插入 CURRENT_TIME
、CURRENT_DATE
、NOW()
。
创建数据表
创建数据表之前应该先使用:
USE 数据库名
指定操作的数据库。
在 MySQL 中,可以使用:CREATE TABLE
语句创建表。其语法格式为:
CREATE TABLE <表名> ([表定义选项]) [表选项] [分区选项];
其中,[表定义选项]
的格式为:
<列名 1> <类型 1> [,…] <列名 n> <类型 n>
CREATE TABLE
命令语法比较多,其主要是由表创建定义(create-definition)、表选项(table-options)和分区选项(partition-options)所组成的。
CREATE TABLE
语句的主要语法及使用说明如下:
CREATE TABLE
:用于创建给定名称的表,必须拥有表CREATE
的权限。<表名>
:指定要创建表的名称,在CREATE TABLE
之后给出,必须符合标识符命名规则。表名称被指定为
db_name.tbl_name
,以便在特定的数据库中创建表。无论是否有当前数据库,都可以通过这种方式创建。在当前数据库中创建表时,可以省略
db-name
。如果使用加引号的识别名,则应对数据库和表名称分别加引号。
例如,
'mydb'.'mytbl'
是合法的,但'mydb.mytbl'
不合法。<表定义选项>
:表创建定义,由列名(col_name)、列的定义(column_definition)以及可能的空值说明、完整性约束或表索引组成。默认的情况是,表被创建到当前的数据库中。若表已存在、没有当前数据库或者数据库不存在,则会出现错误。
提示
使用 CREATE TABLE
创建表时,必须指定以下信息:
- 要创建的表的名称不区分大小写,不能使用 SQL 语言中的关键字,如
DROP
、ALTER
、INSERT
等。 - 数据表中每个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。
查看数据表结构
数据表建好之后可以查看表结构的定义,查看表结构可以使用:
DESCRIBE
和SHOW CREATE TABLE
语句。DESCRIBE/DESC
语句可以查看表的字段信息,包括字段名、字段数据类型、是否为主键、是否有默认值等,语法规则如下:DESCRIBE <表名>;
或简写成:
DESC <表名>;
其中,各个字段的含义如下:
Null
:表示该列是否可以存储NULL
值。Key
:表示该列是否已编制索引。PRI
表示该列是表主键的一部分,UNI
表示该列是UNIQUE
索引的一部分,MUL
表示在列中某个给定值允许出现多次。Default
:表示该列是否有默认值,如果有,值是多少。Extra
:表示可以获取的与给定列有关的附加信息,如AUTO_INCREMENT
等。查看表的详细结构
SHOW CREATE TABLE
语句可以用来显示创建表时的 CREATE TABLE
语句,语法格式如下:
SHOW CREATE TABLE <表名>\G;
提示:使用 SHOW CREATE TABLE
语句不仅可以查看创建表时的详细语句,而且可以查看存储引擎和字符编码。如果不加\G
参数,显示的结果可能非常混乱,加上\G
参数之后,可使显示的结果更加直观,易于查看;但是在图形化工具上使用可能会报错!
管理数据表
修改表结构
在 MySQL 中可以使用 ALTER TABLE
语句来改变原有表的结构,例如增加或删减列、更改原有列类型、重新命名列或表等。
其语法格式如下:
ALTER TABLE <表名> [修改选项]
修改选项的语法格式如下:
{
ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME TO <新表名>
| CHARACTER SET <字符集名>
| COLLATE <校对规则名>
}
修改表名
MySQL 通过 ALTER TABLE
语句来实现表名的修改,语法规则如下:
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
其中,TO
为可选参数,使用与否均不影响结果。
修改表字符集
MySQL 通过 ALTER TABLE
语句来实现表字符集的修改,语法规则如下:
ALTER TABLE 表名 [DEFAULT] CHARACTER SET <字符集名> [DEFAULT] COLLATE <校对规则名>;
其中,DEFAULT
为可选参数,使用与否均不影响结果。
SELECT
语句查询的结果创建表
利用 在 CREATE
语句后指定一个 SELECT
语句
例如:
CREATE TABLE someBook(
bid INT,
bname VARCHAR(80)
)
SELECT bid bname FROM bookInfo;
执行结果是将 bookInfo
表中 bid
列和 bname
列中的数据复制到 someBook
中。
复制表的数据:
CREATE TABLE book1 SELECT * FROM bookInfo;
创建一个一样的空表:
CREATE TABLE book2 SELECT * FROM bookInfo WHERE 0;
DROP TABLE
语句删除数据表
用 使用 DROP TABLE
语句可以删除一个或多个数据表,语法格式如下:
DROP TABLE [IF EXISTS] 表名 1 [ ,表名 2, 表名 3 ...]
对语法格式的说明如下:
表名 1, 表名 2, 表名 3 ...
表示要被删除的数据表的名称。DROP TABLE
可以同时删除多个表,只要将表名依次写在后面,相互之间用逗号隔开即可。IF EXISTS
用于在删除数据表之前判断该表是否存在。如果不加IF EXISTS
,当数据表不存在时 MySQL 将提示错误,中断 SQL 语句的执行;加上IF EXISTS
后,当数据表不存在时 SQL 语句可以顺利执行,但是会发出警告(warning)。
提示
用户必须拥有执行
DROP TABLE
命令的权限,否则数据表不会被删除。表被删除时,用户在该表上的权限不会自动删除。