mysql-2-DML、DDL
DML语法
插入:
方式1:
insert into 表名(列名1,......)
values(值1,......)
方式2:
insert into 表名(列名1,......)
values(值1,......),
values(值1,......),
......
方式3:
insert into 表名()(
select ....;
)
方式4:
insert into 表名
set 列名=值,
......
更新:
update 表名
set 列名=值,......
[where 筛选条件]
- 修改多表的记录语法:
sql92语法:
update 表1 别名,表2 别名
set 列=值,..: ..
where 连接条件 and 筛选条件;
sql99语法:
update 表1 别名
[inner/left/right] join 表2 别名 on 连接条件
set 列=值,......
where 筛选条件;
删除
delete from 表名
[where 筛选条件]
不加筛选条件即删除整表
多表删除 和更新类似
删除全表:truncate table 表名
truncate和delete对比:
- 假如表有自增长列,删除数据后,自增序号从删除点后一个序号开始
- truncate无返回值,delete有返回值
- truncate无法回滚,delete可回滚
DDL语法
关键字 | 说明 |
---|---|
create | 创建 |
rename | 重命名 |
alter | 修改 |
drop | 删除 |
if/if not exists | 判断存在 |
数据库操作
选择数据库:
use 数据库名;
创建数据库:
create datebase 库名
create datebase if not exists 库名 先判断数据库是否存在
修改库:
rename database 旧库名 to 新库名 5.1.7存在,已废弃
更改库字符集:
alter database 库名 character set 字符集
删除库:
drop database if exists 库名
表操作
- 表操作
创建表:
create table 表名(
列名 类型 [约束] [约束] ...,
....,
)
修改表名:
alter table 旧表名 rename to 新表名
删除表:
drop table 表名
表复制:
# 仅仅复制表结构
create table 表名 like 被复制的表名;
# 复制表结构和数据,加where可限定复制部分数据
create table 表名 select * from 被复制的表名;
# 复制表的某些字段
create table 表名 select 字段1,... from 被复制的表名 where 0;
- 列操作
格式:alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
修改列名:
alter table 表名 change column 旧列名 新列名 [类型]
修改列的类型或约束:
alter table 表名 modify column 列名 新类型
添加新列:
alter table 表名 add column 列名 类型
删除列:
alter table 表名 drop column 列名
常见数据类型
数值型:
创建表时定义字段类型说明:
整型:Tinyint、Smallint、editmint、Int/Integer、Bigint
- 不设置符号,默认有符号,想设置无符号在创建表时添加unsigned关键字
- 插入数值超出整型范围,报【out for range异常】,并插入临界值
- 不设置长度,有默认长度值
小数:
浮点数: Float(M,D)、Double(M,D)
定点数: DEC(M,D)/DECIMAL(M,D)
- M=整数和小数共几位数,D=精度几位数 超出范围插入临界值
- M和D都可以省略
- 如果是float和double,会根据插入数据进度来决定精度
选择类型原则:所选择的类型越简单越好,能保存数值类型越小越好
字符型:
短文本:Char(M)、Varchar(M)
- char表固定长度,varchar即可变长度(根据插入数据角色长度)
- char费空间、效率高,varchar省空间、效率低。
- char省略M默认1,varchar不可省
长文本:Text(文本)、Blob(较大的二进制)
其他:Binary、Varbinary、Enum、Set
-
Binary、Varbinary用于保存较短的二进制
-
Enum即枚举,Set即集合,在创建表格时指定只能插入的数据
日期型:
日期:Date、Datetime、Timestamp(时间戳)、Time、Year
-
Datetime范围1000-9999,Timestamp范围1970-2038
-
Datetime不受时区影响,Timestamp受时区影响,
更换时区:
set time_zone = 时区
常见约束
关键字 | 约束名 | 说明 |
---|---|---|
NOT NULL | 非空 | 保证该字段不能为null。如:姓名、学号 |
DEFAULT | 默认值 | 如果插入没规定其他值,会添默认值。如:性别 |
UNIQUE | 唯一 | 保证值唯一性,可为空。如:座位号 |
PRIMARY KEY | 主键 | 本表主要的列可做主键 |
FOREIGN KEY | 外键 | 关联其他表格,限制两表关系,本表字段值必须是其他表字段值(一般是其他表的主键列) |
CHECK | 检查 | 自定义检查约束限制条件(mysql不支持)。 |
添加约束时机:
- 创建表时
- 修改表时
列级约束:
- 六大约束语法上都支持,但外键没效果,
表级约束:
- 默认、非空约束不支持
例如:创建表添加约束
# 添加列级约束
CREATE TABLE stuinfo (
id INT PRIMARYKEY, # 主键 主键默认必须非空,唯一
stuName VARCHAR(20) NoT NULI, # 非空
gender CHAR(1) CHECK(gender='男' OR gender ='女'),# 检查
seat INT UNIQUE, # 唯一
age INT DEFAULT 18, # 默认约束
majorid INT FOREIGN KEY REFERENCEs major(id) # 外键 引入major表的id字段
)
# 添加表级约束 格式:字段下面添加 [constraint约束名] 约束类型(字段名)
CREATE TABLE stuinfo (
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id),# 主键
CONSTRAINT uq UNIQUE(seat), # 唯一键
CONSTRAINT ck CHECK(gender='男'OR gender='女'),# 检查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) # 外键
);
列级约束和表级约束有什么区别?
-
约束范围不一样
-
列级约束是定义在列属性中的,而表级约束是定义在列之后的,两者本质上没什么区别
-
如果约束需要同时对多列进行约束那么就只能采用表级约束,因为表级约束面向的是表(当然就包括所有列)
-
列级约束只能针对该列进行约束。如:gender字段中check约束
什么时候用列级,什么时候用表级?通用写法:
- 外键定义表级约束
外键:
- 要求在从表设置外键关系
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
- 主表的关联列必须是一个key(一般是主键或唯—)
- 插入数据时:先插入主表,再插入从表。删除数据时,先删除从表,再删除主表。
修改表时删除约束
# 1.期制除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
# 2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;
# 3.册除主键
AITER TABLE stuinfo DROP PRIMARY KEY;
# 4.册除唯一
AITERT ABLE stuinfo DROP INDEX seat;
# 5.删除外键
AITER TABLE stuinfo DROP FOREIGN KEY 外键名
标识列
标识列又称自增长列。
可以不用手动插入值,系统提供默认的序列值。
# 建表时设置标识列
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT, # AUTO_INCREMENT标识自增长
name VARCHAR(20)
);
# 查看系统自增量,每次增加步长的值
SHOW VARIABLES LIKE '%auto_inerement%';
标识列必须和主键搭配吗?
- 不一定,但要求是一个key
- 标识列至多只有一个
- 标识列类型只能是数值型
- 可设置每次增量的步长值,
- 可修改标识列初始值,即第一次插入数据时指定标识列的值