表(Table):存储特定类型数据的结构化表格

1)列出当前数据库中所有的表:SHOW TABLES;

2)列出创建表时的SQL语句:SHOW CREATE TABLE 表名;

3)查看表结构:DESC 表名;

4)是否开启外键约束检查:SET FOREIGN_KEY_CHECKS=1/0;

5)列出表的相关信息:SHOW TABLES LIKE ‘表名’;

//DESCRIBE 表名;SHOW COLUMNS FROM 表名;也可查看表结构

如:查看mysql库中的user表信息;
 

字段 含义
Name 表名
Engine 表的存储引擎类型
Row_format 行的格式
Rows 表中的行数
Avg_row_length 平均每行包含的字节数
Data_length 表数据的大小(单位:字节)
Max_data_length 表数据的最大容量
Index_length 索引的大小(单位:字节)
Data_free 已分配但未使用的空间
Auto_increment 下一个AUTO_INCREMENT的值
Create_time 表的创建时间
Update_time 表数据的最后修改时间
Check_time 最后依次检查表的时间
Collation 表的默认字符集和字符列排序规则
Checksum 是否保存整个表的实时校验和
Create_options 创建表时指定的其他选项
Comment 创建时的注释

创建表

DDL实现表的创建:通过CREATE语句创建表

CREATE TABLE创建表的格式:

CREATE  TABLE  [IF  NOT  EXISTS]  表名(
字段1  数据类型  列级约束1  列级约束N,
字段2  数据类型  列级约束1  列级约束N,
……
字段N  数据类型  列级约束,
表级约束1,
……
表级约束N
)其他选项 (如:ENGINE=引擎 DEFAULT CHARSET=字符集);

1)IF NOT EXISTE:代表如果同名表名不存在,则建立表(反之不建立);

2)字段:指定该列的字段名,且具有唯一性;

3)数据类型:指定该字段可存储的数据类型;

4)列级约束:限制该字段;

5)表级约束:限制该表;

6)其他选项:指定该表的存储引擎、字符集和字符序等

如:建立user表,其主键为user_id
 
1)AUTO_INCREMENT约束的表可插入数据,该数据必须是唯一的且为整数,插入的数据会代替自动生成的数据,且后续自动生成的值从该值开始增加;

2)数据库中每张表的存储引擎都可单独指定;

3)使用不同存储引擎的表不能建立外键(主键可以);

//LAST_INSERT_ID()函数可查询最后一AUTO_INCREMENT生成的值

常用的存储引擎有以下3种:

1)InnoDB:可靠的事务处理引擎(不支持全文本搜索);

2)MyISAM:性能极高的引擎,支持全文本搜索(不支持事务处理)

3)MEMORY:功能等同于MyISAM,但数据存储在内存中(适合临时表);

管理表

ALTER

DDL实现表的管理:通过ALTER语句管理表

ALTER管理格式:ALTER TABLE 表名 修改类;

//修改类有:表名、字段、约束和选项

1)管理表名:

修改表名:

格式1:

ALTER TABLE表名
RENAME [TO] 新表名;

格式2:

RENAME TABLE 表名 TO 新表名; 

2)管理字段

同时修改字段的字段名和数据类型:

ALTER TABLE 表名
CHANGE [COLUMN] 原字段名 新字段名 新数据类型

修改字段的数据类型

ALTER TABLE 表名
MODIFY [COLUMN] 字段名 新数据类型	

修改字段的排列位置:

ALTER TABLE 表名
MODIFY [COLUMN] 字段名1 数据类型 FIRST\AFTER 字段名2

//FIRST表示将字段名1调整到第一列,AFTER字段名2表示调整到字段名2之后

删除字段:

ALTER TABLE 表名
DROP [COLUMN] 字段名;

增加字段:

ALTER TABLE 表名
ADD [COLUMN] 字段名 数据类型 [列级约束] [FIRST\AFTER 字段名]	;

3)管理约束

查看指定表中约束名:

SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE 
FORM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA=‘数据库名’AND TABLE_NAME=‘表名’;

删除主键约束

ALTER TABLE 表名
DROP PRIMARY KEY;

增加主键约束

ALTER TABLE 表名
ADD PRIMARY KEY (列名);

删除外键约束:

ALTER TABLE 表名
DROP FOREIGN KEY 外键约束名;

增加外键约束:

ALTER TABLE 表名 
ADD [CONSTRAINT 约束名] FOREIGN KEY (字段) REFERENCES 父表 (主码字段);

删除唯一约束:

ALTER TABLE 表名
DROP INDEX 唯一约束名; 

添加唯一约束:

ALTER TABLE 表名
ADD [CONSTRAINT 约束名] UNIQUE (列名); 

删除默认值约束(change也可以替换成modify):

ALTER TABLE 表名 
CHANGE [COLUMN] 原字段名 原字段名 原数据类型 DEFAULT NULL;

添加默认值约束(chang也可以替换成modify):

ALTER TABLE 表名 
CHANGE [COLUMN]原字段名 原字段名 原数据类型 DEFAULT 默认值;

删除非空约束(change也可以替换成modify):

ALTER TABLE 表名
CHANGE [COLUMN] 原字段名 原字段名 原数据类型 NULL;

添加非空约束(change也可以替换成modify):

ALTER TABLE 表名
CHANGE [COLUMN] 原字段名 原字段名 原数据类型 NOT NULL;

4)管理选项

修改存储引擎

ALTER TABLE 表名 ENGINE=引擎类型;

修改默认字符集

ALTER TABLE 表名 DEFAULT CHARSET=字符集;

修改自增字段的初始值

ALTER TABLE 表名 AUTO_INCREMENT=初始值;

修改索引关键字的压缩类型

ALTER TABLE 表名 PACK_KEYS=压缩类型;

仅复制表结构(不复制表中的数据):

CREATE  TABLE  新表名  LIKE  源表名;

同时复制表的结构和表中数据:

CREATE  TABLE  新表名
SELECT  *
FROM  源表名
WHERE 条件表达式;

//仅复制结构时,在where跟不成立的条件(如:1=2)

INSERT

DML实现数据插入:通过INSERT语句将数据插入表中

1)插入数据时需注意表的约束,只有满足相关约束才能插入成功

2)对关联表插入数据时,应先向父表插入数据再向子表插入数据

3)向字符串类型和日期时间类型插入数据时,字段值要用单引号括起来

//或先取消外键检查,插入数据后再开启外键检查

完整数据:对表中所有的字段都有对应的数据

非完整数据:仅对表中部分字符有对应的数据(其他则忽略)

1)忽略的字段应支持NULL、自增或有默认值

2)若字段不支持,且插入的数据不包含该字段,则插入失败

INSERT插入格式1:插入完整数据

INSERT  INTO  表名(字段名1[,···,字段名N])
VALUES (数据1 [,···,数据N]);

1)插入完整数据时,若数据的顺序和表中字段的顺序一致,则可省略字段名

2)可在非完整数据的基础上构造一个完整数据记录实现插入完整数据(在未有数值的情况下填写NULL或0)

如:插入完整数据至customers表
 
//该方式过于依赖原表字段结构顺序,很少使用

如:指定字段插入完整数据至customers表
 

INSERT插入格式2:插入非完整数据

INSERT  INTO  表名(字段名1 [,···,字段名N])
VALUES (数据1 [,···,数据N])

1)插入非完整数据时,字段名不能省略

2)数据的插入位为数据顺序对应的字段名列表中的顺序位

3)未指定的字段上默认取NULL、自增或默认值(有相关约束)

如:插入非完整数据至customers表
 

INSERT插入格式3:批量插入数据(插入完整/非完整数据均可)

INSERT  INTO  表名  (字段名1[,···,字段名N]) VALUES
(数据表1),
(数据表2),
······
(数据表N);

//数据表中数据的顺序和表中字段的顺序相对应

如:插入多个非完整数据至customers表
 

降低INSERT优先级指令:INSERT LOW_PRIORITY INTO

1)INSERT语句是比较占用性能和耗时的行为,为保证整体服务器的性能

2)可在调用INSERT插入时,降低其优先级

3)同样适用于UPDATE和DELETE

INSERT SELECT

INSERT SELECT:将SELECT语句检索的结果导入指定表中

1)通常用于表的复制/备份、移植和表的扩建

2)INSERT SELECT中需注意主键值的重复会导致插入识别

//一般情况下选择忽略掉源表中的主键字段进行导入

INSERT SELECT插入格式:

INSERT  INTO  目标表名  (字段名1[,···,字段名N])
SELECT  (字段名1[,···,字段名N])
FROM  源表名
[WHERE 条件表达式];

1)目标表名表示要复制进去记录的表名

2)目标表的字段和select的字段个数必须相同,且数据类型一致

//两个字段名不要求相同

如:将custnew表中的数据移至customers表中
 

REPLACE

replace: delete和insert的合体,能够简化操作

1)不同在于:若新数据的主键约束或唯一性约束的字段值与已有数据相同,则会先删除已有数据,然后再插入新数据(数据的删除不能违背约束条件)

2)replace的语法格式和INSERT相同(只需将INSERT更换为REPLACE)

REPLACE其他插入格式:

REPLACE  INTO  表名
SET 字段名1=数据1,···,字段名N=数据N;

UPDATE

DML实现数据插入:通过UPDATE语句更新表中指定的数据

update更新数据格式:

UPDATE  表名
SET  字段名1=值1  [,···,字段名N=值N]
WHERE 条件表达式;

1)WHERE指定对表中更新的行(若不指定,则默认全部行)

2)SET指定该行的字段(字段可以是数据、表达式或DEFAULT)

3)同插入数据一样,需要满足各种约束前提下才能修改成功

如:更新customers表中cust_id为10005的cust_name和cust_email
 

IGNORE参数:使UPDATE忽略报错,强制更新表中数据
1)UPDATE强制更新数据格式:UPDATE IGNORE 表名

如:强制删除customres表中cust_id为10005的cust_email字段值
 

DELETE

DML实现数据插入:通过DELETE语句删除表中指定的数据

DELECT删除数据格式:

DELETE  FROM  表名
WHERE 条件表达式;

1)WHERE指定表中删除的行(若不指定,则默认删除全部行)

2)若删除子表的外码引用的父表中主码记录时

3)数据的删除是以行单位(不能只删除行的几个字段的值)

//应先在子表中删除外码约束(解除父子关系),否则删除不能成功

如:删除customers表中cust_id为10006的行
 

TRUNCATE

TRUNCATE:删除指定表,并重新建立一个与源表相同表结构的表

TRUNCATE删除数据格式

TRUNCATE  [TABLE]  表名;

1)TRUNCATE是清空表中所有的记录

2)TRUNCATE不支持事务的回滚(DELETE语句支持恢复)

3)使用TRUNCATE清空父表时会永远执行失败

4)TRUNCATE不能激活触发器程序的运行

DROP

DDL实现表的删除:通过DROP语句删除表

DROP删除表格式:

DROP TABLE 表名