DDL语言学习
data define languge 数据定义语言 库和表的定义和管理
一:库的管理
1.库的创建
语法:
create database 表名;
case1 创建books库
create database books;
若库已存在则报错
提高容错性语法
create database if not exists 表名;
2.库的修改
库的话一般来说不修改,导致整个库的数据出现丢失。
rename database books to 新库名 因为该语法会出现数据丢失,所以在版本升级时丢弃
若想修改库的名字,建议直接找到该文件进行修改
更改库的字符集:
alter database books character set gbk;
3.库的删除
语法:
drop database 表名;
提高容错性语法:
drop database if exists 表名;
二:表的管理
1.表的创建
语法:
create table 表名(列名 列的类型(长度) 约束,…);
case1 :创建一个图书表
create table boos(id int,bname varchar(20),price DOUBLE,authorID int,publishdata datetime);
case2:创建一个作者表
create table author(id int,au_name varchar(20),nation varchar(10));
容错性语法:
create table if not exists 表名(列名 列的类型(长度) 约束,…);
2.表的修改
1.修改列名
alter table 表名 change column 旧列名 新列名 类型; 这个要求必须加类型
2.修改列的类型和约束
alter table 表名 modify column 列名 新类型;
3.列的添加
alter table 表名 add column 新列名 新类型;
4.列的减少
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename to 新表名;
注意:
使用change时,column可以不加
但是使用其他语法时,需要添加。故建议都加
3.表的删除
语法:
drop table 表名;
容错性语法:
drop table if exists 表名;
注意:
exists 只可以在库表的创建和删除时可以使用,列的时候没办法使用
通用的写法:
一般不知道数据库服务区那方有没有这个库或表,先删一次。
drop database if exists 旧库名;
create database 新库名;
表名也一样
4.表的复制
1.仅仅复制表的结构
create table 表名 like author;
2.复制表的结构和数据
create table 表名 (select 子查询)
create table 表名 (select * from author);
3.只复制部分数据
create table 表名(select 子查询 where 筛选条件)
create table 表名 (select * from author where nation=“中国”);
4.只复制部分表的结构
create table 表名 (select 部分列的子查询 where 0 );0表示false
5.若复制表的数据在其他库
create table 表名(select * from 库名.表名)
create table dept1 (id int(7),name varchar(25));
create table dept2 select * from myemployyes.departments
create table emp5 (id, int(7),first_name varchar(25),last_name varchar(25),dept_id int(7))
alter table emp5 modify columu last_name varchar(50);
create table employees2 like employees
drop table if exists emp5
alter table employees2 rename to emp5;
alter table emp5 add column dept_2 int;
alter table emp5 dorp column dept_id
常见的数据类型
一.数值型
1.整形
-
Tinyint 字节1 有符号 -128-127 无符号 0-255
-
Smallint 字节2
-
Mediumint 字节 3
-
int,integer 字节4
-
Bigint 字节8
特点:
如果不设置无符号还是有符号,默认有符号,若先设置有符号,则添加unsigend
如果插入数据超出范围,则会出现警告,然后插入临界值
如果不设置长度,会有默认的长度,int(7)表示显示结果的样子,数值范围由类型决定。
添加关键字zerofill 进行零填充,默认为无符号
如何设置有符号和无符号?
create table tab_int(
int_1 int,
int_2 int unsigend
)
若向int_2插入负数,出现警告,则为0
2.小数
实例:
create table tab_float(
float(5,2),
double(5,2),
decimal(5,2)
)
insert into tab_float values(123.45,123.45,123.45);
insert into tab_float values(123.45,123.45,123.45);
insert into tab_float values(123.4,123.4,123.4);
insert into tab_float values(123.456,123.456,123.456);
特点:
精确度要求较高使用定点数
M和D的含义:M表示整数和小数位数总位,D小数点后几位,两者都可以省略(四舍五入,或用零补齐)
若省略MD,则浮点数插入什么都行,而定点数默认为(10,0)
若超出范围,则插入临界值
原则:
选择类型越简单越好。能保存数值的类型越小越好
浮点数
- float 字节4 (M,D)
- double 字节8 (M,D)
定点数
- decimal字节m+2 (M,D) 默认(10,0)
- dec 简写 (M,D)
二.字符型
较短的文本
char(M) M最长字符数 可以省略默认为1 固定长度的字符 中国开十个字符空间 效率较高 性别
varchar(M) M最长字符数 不可以省略 可变长度的字符 中国开两个字符空间 比较节省空间 姓名
binary / varbinary:类似于char,不同的是他们保存二进制字符串
enum:enum(“a”,“b”,“c”)枚举类型,要求必须插入的值为列表中指定的值之一 不区分大小写
set : set(“a”,“b”,“c”) 和enum类型相似,用于保存集合 但是可以选择多个成员.insert into rab values (‘a,b,c’),不区分大小写
较长的文本
text
blob(教大的二进制)
三.日期型
date:只能保存日期
time:只有时间
year:年
datetime:8字节
timetamp:4字节, 1970-2038 支持范围小,属性受时区和版本语法影响,使用空间小。更加接近当前时区的时间
查看时区:show variables like “time_zone”;
修改时区:set time_zone="+9:00"
常见约束
含义:
一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
分类:六大约束
not null:非空,保证该字段的值不能为空
default:默认,用于保证该字段值有默认值
primary key:主键约束, 保证字段的值有唯一,并且非空
unique:唯一,用于保证该字段的值具有唯一性,可以为空
check:检查,mysql中不支持
foreign key :外建,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。
在从表添加外建约束,用于引用主表中某列的值。
时机:
创建表时
修改表时
添加分类
ceate table 表名(
字段名 字段类型 列级约束
字段名 字段类型 列级约束
表级约束
)
列级约束
六大约束语法上都支持,但外建约束没有约束
表级约束
处理非空,默认,其他都支持
一 创建表时添加列级约束
特点:
直接在字段名和类型后面追加约束类型即可。
只支持 默认 非空 主键 唯一
create table studio{
id int primary key,
stuname varchar(10) not null,
seat int unique,
age int default 18,
majorid int references marjor(id)
}
create table major(
in int primary key,
marjorname varchar(10)
)
show index from studio:显示表中所有索引(主键 外建 唯一建会自动生成索引)
这里外建约束不起作用
二 创建表时添加表级约束
非空和默认不支持
语法:
在各个字段的最下面
[constraint 约束名] 约束类型(字段名)
若不起名,则为字段名,主键名无法改名
create table studio(
id int,
stuname varchar(10),
gender varchar(10),
seat int,
marjorid int,
constraint pk primary key (id),
constraint unique(seat),
constaint kf_stuinfo_major foreign key(majorid) references marjor(id)
);
三 通用的写法
create table if not exists stuindo (
id int primary key,
stuname varchar(20) not null,
sex char(1),
age int default 18,
majorid int,
constraint fk_stuinfo_major goreigen key(mahorid) refergences major(id)
)
四 主键和唯一的大对比
主键 保证唯一性 不可以为空 一个表最多有一个 允许组合(但不推荐)
唯一 保证唯一性 可以为空(但只能同时存在一个null) 一个表可以有多个 允许组合(但不推荐)
组合:constraint pk_na primary key (id,name)
外建:
要求在从表设置外建关系
从表的外建列的类型和主表的关联列类型要求一致或兼容,名称无要求
主表的关联建必须是一个key(一般是主键或唯一)
插入数据时,应该先插入主表,再插入从表,删除时间时,先删除从表,再删除主表
五 修改表时添加约束
添加列级约束:
alter table studio modify column syuname varchar(20) not null;
删除列级约束
alter table studio modify column syuname varchar(20);
添加表级约束:
alter table studio add primary [constraint …] primary key(id);
删除表级约束:
alter table studio drop primary key(id);
alter table studio drop index seat;
alter table studio drop foreign key fk_stuinfo_major;
六 标识列
又称自增长列
含义:可以不用手动的插入值,系统提供默认的序列值。
create…(
id int primary key auto_increment,
)
q1:可以不从1开始自增?:
show variables like “%auto_increment%”;
increment 步长
offset 起始值
mysql不支持设置起始值,但是可以设置步长。
set auto_increment_increment=3;
若想设置起始值,则第一条手动插入到指定位置,则其后数据实现自增即可
q2:必须和主键搭配么?
一个表只能有一个自增列,必须和key搭配使用 外建,唯一,主键
q3:标识列的类型有什么限制?
只要是数值型都可以。
q4;修改表时设置表时列:
添加:alter table stuinfo modify column id int primary key auto-increment;
删除:alter table stuinfo modify column id int primary;