MySQL数据库--DDL语言

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;

おすすめ

転載: blog.csdn.net/MINGZHEFENG/article/details/106903945