实验3 表的基本操作

更新于 2026年10月10日 版权声明
实验3 表的基本操作 图示

表(Table)是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似,都是按照行和列的格式组织的,每行代表一条记录,每列代表记录中的一个字段。

【实验目的】

①掌握表的创建方法。

②掌握表结构的修改方法。

③掌握复制表结构的方法。

④掌握删除表的方法。

【知识要点】

(1)MySQL 数据类型

MySQL支持的数据类型包括数值类型、日期和时间类型、字符串类型、空间类型和JSON数据类型。

1)数值类型

数值类型包括整数类型(精确值)、定点类型(精确值)、浮点类型(近似值)和位值类型。

MySQL支持的整数类型所需的存储空间和范围见表3.1。

表3.1 MySQL 支持的整数类型所需的存储空间和范围

图示

定点类型(精确值)包括DECIMAL和NUMERIC,MySQL以二进制格式进行存储,在列声明中,可以指定精度和小数位数。例如:salary DECIMAL(5, 2),其中5是精度,表示值存储的有效位数;2是小数位数,表示可以在小数点后存储的位数,因此可以存储在列中的值域为-999.99到999.99。

浮点类型(近似值)包括FLOAT和DOUBLE,单精度值FLOAT使用4个字节,双精度值DOUBLE使用8个字节。

位值类型有BIT,存储二进制位值,BIT(M)能存储M位的值,M可以是1到64。

2)日期和时间类型

日期和时间类型包括DATE、TIME、DATETIME、TIMESTAMP和YEAR。

DATE:用于具有日期部分但没有时间部分的值。MySQL以'YYYY-MM-DD'格式检索和显示值,支持的范围从' 1000-01-01'到 ' 9999-12-31'。

DATETIME:用于同时包含日期和时间部分的值。MySQL以'YYYY-MM-DD hh:mm:ss[.fraction]'格式检索和显示值。支持的范围从'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

TIMESTAMP:用于带时区同时包含日期和时间部分的值。有效范围是'1970-01-01 00:00:01.000000' UTC至'2038-01-19 03:14:07.999999' UTC。TIMESTAMP的值存储的是自'1970-01-01 00:00:00' UTC(格林尼治标准时间)到当前时间的秒数。MySQL将值从当前时区转换为UTC以进行存储,并从UTC转换回当前时区以进行检索。

TIME:MySQL以'hh:mm:ss'格式检索和显示值(或'hhh:mm:ss'格式表示大小时值)。 值的范围可以从'-838:59:59' 到 '838:59:59'。小时部分可能非常大,因为该类型不仅可以用于表示一天中的时间(必须小于24小时),还可以表示两个事件之间的经过时间或时间间隔(可能远大于24小时,甚至为负数)。

YEAR:该类型是用于表示年份值的1字节类型。MySQL 以 YYYY 格式显示值,范围为 '1901'到'2155',还有'0000'。

3)字符串类型

字符串类型包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

CHAR和VARCHAR:这两个数据类型相似,但在存储和检索方式上有所不同,在最大长度和是否保留尾随空格方面也有所不同。CHAR和VARCHAR声明的长度表示要存储的最大字符数,CHAR是固定长度,会根据定义的长度分配空间,长度可以是0~255。比如CHAR(30)表示最多可以容纳30 个字符,存储不足30个字符的值时,将使用指定长度的空格对值进行右填充。CHAR适合存储很短的字符串,或者所有的值都接近同一个长度。VARCHAR用于存储可变长度的字符串,比定长类型更节省空间,长度可以是0~65535,VARCHAR需要使用1或2个额外字节记录字符串的长度,如果列的最大长度小于或等于255字节,则只使用1个字节表示;如果列长度大于255字节,则需要使用2个字节表示长度。

BINARY和VARBINARY:它们存储的是二进制字符串。二进制字符串和常规的字符串非常相似,但是二进制字符串存储的是字节码而不是字符。

BLOB和TEXT:都是为了存储很大数据而设计的字符串数据类型,分别采用二进制和字符方式存储。二进制类型包括TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB;字符类型包括TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT。与其他类型不同,MySQL把每个BLOB和TEXT值当作一个独立的对象处理。存储引擎在存储时通常会做特殊处理,当BLOB和TEXT值太大时,InnoDB会使用专门的外部存储区域来进行存储,此时每个值在行内需要1~4个字节存储一个指针,然后在外部存储区域存储实际值。BLOB和TEXT之间仅有的不同是,BLOB存储的是二进制数据,没有排序规则和字符集;而TEXT存储的是字符,有排序规则和字符集。

ENUM类型即枚举类型,它的取值范围需要在创建表时通过枚举方式(一个个地列出来)显式指定。对1至255个成员的枚举需要1个字节存储;对于255至65 535个成员,需要2个字节存储,最多允许有65 535个成员。ENUM忽略了大小写,也支持通过下标(从1开始,下标越界时报错)插入数据,其中特殊值0表示空值。

SET类型是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时,各成员之间需要用逗号(“,”)间隔开,所以SET成员值本身不能包含逗号。ENUM只能取一个值,而SET可以取多个值。

4)空间数据类型

MySQL的空间类型是建立在OpenGIS Geometry Model之上,其中Geometry 是顶级类,它具有所有类型都拥有的属性。

MySQL空间数据类型主要有两类。一类是代表单个值的GEOMETRY、POINT、LINESTRING、POLYGON。其中GEOMETRY可以是任意(POINT、LINESTRING 和POLYGON)类型;另一类是集合类型,如MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION。集合类型中的元素必须为同一参考系。

5)JSON数据类型

直接存储JSON格式的字符串,JSON数据列会自动验证JSON的数据格式,如果格式不正确会报错。JSON数据类型会采取最优化的存储格式,会把JSON格式的字符串转换成内部格式,以便能够快速地读取其中的元素。

(2)创建表的语法格式

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

    (create_definition, ...)

    [table_options]

    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

    [(create_definition, ...)]

    [table_options]

    [partition_options]

    [IGNORE | REPLACE]

    [AS] query_expression

create_definition: {

    col_name column_definition

  | {INDEX | KEY} [index_name] [index_type] (key_part, ...)

      [index_option] ...

  | {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part, ...)

      [index_option] ...

  | [CONSTRAINT [symbol]] PRIMARY KEY

      [index_type] (key_part, ...)

      [index_option] ...

  | [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]

      [index_name] [index_type] (key_part, ...)

      [index_option] ...

  | [CONSTRAINT [symbol]] FOREIGN KEY

      [index_name] (col_name, ...)

      reference_definition

  | check_constraint_definition

}

column_definition: {

    data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)}]

      [VISIBLE | INVISIBLE]

      [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]

      [COMMENT 'string']

      [COLLATE collation_name]

      [COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]

      [ENGINE_ATTRIBUTE [=] 'string']

      [SECONDARY_ENGINE_ATTRIBUTE [=] 'string']

      [STORAGE {DISK | MEMORY}]

      [reference_definition]

      [check_constraint_definition]

  | data_type

      [COLLATE collation_name]

      [GENERATED ALWAYS] AS (expr)

      [VIRTUAL | STORED] [NOT NULL | NULL]

      [VISIBLE | INVISIBLE]

      [UNIQUE [KEY]] [[PRIMARY] KEY]

      [COMMENT 'string']

      [reference_definition]

      [check_constraint_definition]

}

key_part: {col_name [(length)] | (expr)} [ASC | DESC]

index_type:

    USING {BTREE | HASH}

index_option: {

    KEY_BLOCK_SIZE [=] value

  | index_type

  | WITH PARSER parser_name

  | COMMENT 'string'

  | {VISIBLE | INVISIBLE}

  |ENGINE_ATTRIBUTE [=] 'string'

  |SECONDARY_ENGINE_ATTRIBUTE [=] 'string'

}

check_constraint_definition:

    [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

reference_definition:

    REFERENCES tbl_name (key_part, ...)

      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]

      [ON DELETE reference_option]

      [ON UPDATE reference_option]

reference_option:

    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:

    table_option [[,] table_option] ...

table_option: {

    AUTOEXTEND_SIZE [=] value

  | AUTO_INCREMENT [=] value

  | AVG_ROW_LENGTH [=] value

  | [DEFAULT] CHARACTER SET [=] charset_name

  | CHECKSUM [=] {0 | 1}

  | [DEFAULT] COLLATE [=] collation_name

  | COMMENT [=] 'string'

  | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}

  | CONNECTION [=] 'connect_string'

  | {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'

  | DELAY_KEY_WRITE [=] {0 | 1}

  | ENCRYPTION [=] {'Y' | 'N'}

  | ENGINE [=] engine_name

  | ENGINE_ATTRIBUTE [=] 'string'

  | INSERT_METHOD [=] {NO | FIRST | LAST}

  | KEY_BLOCK_SIZE [=] value

  | MAX_ROWS [=] value

  | MIN_ROWS [=] value

  | PACK_KEYS [=] {0 | 1 | DEFAULT}

  | PASSWORD [=] 'string'

  | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'

  | STATS_SAMPLE_PAGES [=] value

        [COMMENT [=] 'string']

        [DATA DIRECTORY [=] 'data_dir']

        [INDEX DIRECTORY [=] 'index_dir']

        [COMMENT [=] 'string']

        [DATA DIRECTORY [=] 'data_dir']

        [INDEX DIRECTORY [=] 'index_dir']

    SELECT ...   (Some valid select or union statement)

说明:其中常用的子句或参数解释如下。

①TEMPORARY:所创建的是临时表,只能在当前会话中可见,会话关闭后,临时表会被自动删除。

②IF NOT EXISTS:判断数据库中是否已经存在同名的表,如果未加此项,当数据库中已经存在同名的表时,创建表语句会出错,加上此项后,可以阻止错误发生。(https://www.daowen.com)

③DATA_TYPE:定义字段的数据类型。字符串类型(CHAR、VARCHAR)需要指定长度;整型(INT、BIGINT、TINYINT等)和日期类型(DATETIME、TIMESTAMP等)只需要指定类型,不需要指定长度;decimal类型需要指定精度和小数位数。

④PRIMARY KEY:指定表的主键。

⑤AUTO_INCREMENT:指定字段为自增字段,该字段的类型必须为INT或BIGINT才能设置为自增字段。

⑥NOT NULL | NULL:设置字段能否取空值。

⑦DEFAULT:设置字段的默认值。

⑧INDEX:创建索引。index_name指定索引名,该参数可以省略,如果省略则索引名就是字段名。

⑨FOREIGN KEY:指定外键。

⑩ENGINE:设置引擎类型,常用的有InnoDB和myISAM引擎。

⑪DEFAULT CHARACTER SET:设置表所用的字符集。

(3)查看已创建的表的语法格式

SHOW [EXTENDED] [FULL] TABLES

    [{FROM | IN} db_name]

        [LIKE 'pattern' | WHERE expr]

(4)查看表结构的语法格式

SHOW [EXTENDED] [FULL] {COLUMNS | FIELDS}

        [LIKE 'pattern' | WHERE expr]

或者

{EXPLAIN | DESCRIBE | DESC}

        tbl_name [col_name | wild]

(5)复制表结构的语法格式

①只复制表结构,包括主键、索引,但不会复制表数据。

CREATE TABLE new_tbl LIKE orig_tbl;

②复制表结构及全部数据,但不会复制主键、索引等。

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

③如果既要复制包括主键、索引的表结构,也要复制表数据,可以分两步完成,先复制表结构,再插入数据。

(6)修改表结构的语法格式

ALTER TABLE tbl_name

    [alter_option [, alter_option] ...]

    [partition_options]

alter_option: {

    table_options

  | ADD [COLUMN] col_name column_definition

        [FIRST | AFTER col_name]

  | ADD [COLUMN] (col_name column_definition, ...)

  | ADD {INDEX | KEY} [index_name]

        [index_type] (key_part, ...) [index_option] ...

  | ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]

        (key_part, ...) [index_option] ...

  | ADD [CONSTRAINT [symbol]] PRIMARY KEY

        [index_type] (key_part, ...)

        [index_option] ...

  | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]

        [index_name] [index_type] (key_part, ...)

        [index_option] ...

  | ADD [CONSTRAINT [symbol]] FOREIGN KEY

        [index_name] (col_name, ...)

        reference_definition

  | ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

  | DROP {CHECK | CONSTRAINT} symbol

  | ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED

  | ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}

  | ALTER [COLUMN] col_name {

        SET DEFAULT {literal | (expr)}

      | SET {VISIBLE | INVISIBLE}

      | DROP DEFAULT

    }

  | ALTER INDEX index_name {VISIBLE | INVISIBLE}

  | CHANGE [COLUMN] old_col_name new_col_name column_definition

        [FIRST | AFTER col_name]

  | [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]

  | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

  | {DISABLE | ENABLE} KEYS

  | {DISCARD | IMPORT} TABLESPACE

  | DROP [COLUMN] col_name

  | DROP {INDEX | KEY} index_name

  | DROP PRIMARY KEY

  | DROP FOREIGN KEY fk_symbol

  | FORCE

  | LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}

  | MODIFY [COLUMN] col_name column_definition

        [FIRST | AFTER col_name]

  | ORDER BY col_name [, col_name] ...

  | RENAME COLUMN old_col_name TO new_col_name

  | RENAME {INDEX | KEY} old_index_name TO new_index_name

  | RENAME [TO | AS] new_tbl_name

  | {WITHOUT | WITH} VALIDATION

}

partition_options:

    partition_option [partition_option] ...

partition_option: {

    ADD PARTITION (partition_definition)

  | DROP PARTITION partition_names

  | DISCARD PARTITION {partition_names | ALL} TABLESPACE

  | IMPORT PARTITION {partition_names | ALL} TABLESPACE

  | TRUNCATE PARTITION {partition_names | ALL}

  | COALESCE PARTITION number

  | REORGANIZE PARTITION partition_names INTO (partition_definitions)

  | EXCHANGE PARTITION partition_name WITH TABLE tbl_name [{WITH | WITHOUT} VALIDATION]

  | ANALYZE PARTITION {partition_names | ALL}

  | CHECK PARTITION {partition_names | ALL}

  | OPTIMIZE PARTITION {partition_names | ALL}

  | REBUILD PARTITION {partition_names | ALL}

  | REPAIR PARTITION {partition_names | ALL}

  | REMOVE PARTITIONING

}

key_part: {col_name [(length)] | (expr)} [ASC | DESC]

index_type:

    USING {BTREE | HASH}

index_option: {

    KEY_BLOCK_SIZE [=] value

  | index_type

  | WITH PARSER parser_name

  | COMMENT 'string'

  | {VISIBLE | INVISIBLE}

}

table_options:

    table_option [[,] table_option] ...

table_option: {

    AUTOEXTEND_SIZE [=] value

  | AUTO_INCREMENT [=] value

  | AVG_ROW_LENGTH [=] value

  | [DEFAULT] CHARACTER SET [=] charset_name

  | CHECKSUM [=] {0 | 1}

  | [DEFAULT] COLLATE [=] collation_name

  | COMMENT [=] 'string'

  | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}

  | CONNECTION [=] 'connect_string'

  | {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'

  | DELAY_KEY_WRITE [=] {0 | 1}

  | ENCRYPTION [=] {'Y' | 'N'}

  | ENGINE [=] engine_name

  | ENGINE_ATTRIBUTE [=] 'string'

  | INSERT_METHOD [=] {NO | FIRST | LAST}

  | KEY_BLOCK_SIZE [=] value

  | MAX_ROWS [=] value

  | MIN_ROWS [=] value

  | PACK_KEYS [=] {0 | 1 | DEFAULT}

  | PASSWORD [=] 'string'

  | ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}

  | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'

  | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}

  | STATS_PERSISTENT [=] {DEFAULT | 0 | 1}

  | STATS_SAMPLE_PAGES [=] value

  | TABLESPACE tablespace_name [STORAGE {DISK | MEMORY}]

  | UNION [=] (tbl_name [, tbl_name] ...)

}

partition_options:

    (see CREATE TABLE options)

(7)删除表的语法格式

DROP [TEMPORARY] TABLE [IF EXISTS]

    tbl_name [, tbl_name] ...

    [RESTRICT | CASCADE]

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)