mysql-12-DDL

#DDL
/*
数据定义语言

库和表的管理
一、库的管理
	创建、修改、删除
二、表的管理
	创建、修改、删除

创建 create
修改 alter
删除 drop

*/

#一、库的管理
#1、库的创建
/*
CREATE DATABASE 库名;
*/

CREATE DATABASE books;

SHOW DATABASES;

#如果没有再创建
CREATE DATABASE IF NOT EXISTS books;

#2、库的修改
/*
一般地,不对库做修改
*/
#更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;

#3、库的删除
DROP DATABASE IF EXISTS books;


#二、表的管理
#1、表的创建
/*
CREATE TABLE 表名(
	列名 列的类型 【长度,约束】,
    列名 列的类型 【长度,约束】,
    ...
    列名 列的类型 【长度,约束】
)
*/
USE books;
#案例1:创建book表
CREATE TABLE book(
	id int,
    bname varchar(50),
    price double,
    author_id int,
    publish_date datetime
);

CREATE TABLE author(
	id int,
    au_name varchar(20),
    nation varchar(20)
);


#2、表的修改
/*
ALTER TABLE 表名 change|modify|add|drop|rename COLUMN 列名 【列类型 约束】
*/
#修改列名
ALTER TABLE book CHANGE COLUMN publish_date pub_date DATETIME;

#修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pub_date TIMESTAMP;

#添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;

#删除列
ALTER TABLE author DROP COLUMN annual;

#修改表名
ALTER TABLE author RENAME TO book_author;

DESC book;


#3、表的删除
DROP TABLE IF EXISTS book_author;


#4、表的复制
INSERT INTO book_author
VALUES(1, '莫言', '中国'), (2, '村上春树', '日本');

#仅仅复制表的结构
CREATE TABLE copy LIKE book_author;

#复制表的结构+数据
CREATE TABLE copy2
SELECT * FROM book_author;

#只复制部分数据
CREATE TABLE copy3
SELECT id, au_name
FROM book_author
WHERE nation='中国';

#只复制部分字段
#设置一个不等条件
CREATE TABLE copy4
SELECT id, au_name
FROM book_author
WHERE 0;


#常见数据类型
/*
数值型:
	整型
	小数:定点数、浮点数
    
字符型:
	较短的文本:char, varchar
    较长的文本:text, blob(较长的二进制数据)

日期型
*/
#1、整型
#tinyint, smallint, mediumint, int/integer, bigint

#默认有符号;无符号需追加unsigned
#插入数值超过范围会报warning,并且插入临界值
#长度代表显示的宽度,不设置长度会有默认值(zerofill,不够宽度用0填充)

DROP TABLE IF EXISTS tab_int;
CREATE TABLE tab_int(
	t1 int,
    t2 int unsigned
);

INSERT INTO tab_int(t1)
VALUES(-123);   #能够插入,说明int默认有符号

#2、浮点型
#float(M, D) 最常用, double(M, D)

#3、定点型
#decimal(M, D)  精度较高

/*
M:整数部位+小数部位
D:小数部位
如果超过范围,插入临界值
*/

#4、字符型
#较短文本:
#固定长度的字符:var(M),效率高;可变长度的字符:varchar(M),节省空间,效率低;M:最多的字符数
#binary/varbinary 保存较短的二进制;enum 保存枚举;set 保存集合

#较长文本:
#text, blob(图片等较大的二进制)


#5、日期型
#日期值必须用单引号引起来
#date, datetime, timestamp, time, year
#timestamp的属性和实际时区有关,更能反应实际的日期

CREATE TABLE tab_date(
	t1 datetime,
    t2 timestamp
);

INSERT INTO tab_date
VALUES(NOW(), NOW());

SELECT * FROM tab_date;


#常见约束
/*
含义:一种限制,用于限制表中的数据

六大约束:
	NOT NULL: 非空,用于保证该字段的值不能为空。比如姓名、学号等
    DEFAULT: 默认,用于保证该字段有默认值。比如性别,
	PRIMARY KEY: 主键,用于保证该字段的值具有唯一性,且非空。比如学号、编号等
    UNIQUE: 唯一性,可以为空
    CHECK: 检查约束【mysql中不支持】
    FOREIGN KEY: 外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列
    比如学生表的专业编号,员工表的部门编号,员工表的工种编号
    
一般在设计表的时候添加约束

CREATE TABLE 表名(
	字段名 字段类型 列级约束1 列级约束2,
    字段名 字段类型 列级约束,
    ...,
    表级约束
);

*/

CREATE DATABASE students;
USE students;

#添加列级约束
CREATE TABLE stuinfo(
	id int primary key,
    stu_name varchar(20) not null,
    gender char(1) check(gender='男' or gender='女'),
    seat int unique,
    age int default 18,
    major_id int
);

CREATE TABLE major(
	id int primary key,
    major_name varchar(20)
);

DESC stuinfo;

#添加表级约束
#【constraint 约束名】 约束类型(字段名)
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo(
	id int,
    stu_name varchar(20) not null,
    gender char(1),
    seat int,
    age int default 18,
    major_id int,
    constraint pk primary key(id),
    constraint uq unique(seat),
    constraint ck check(gender='男' or gender='女'),
    constraint fk_stuinfo_major foreign key(major_id) references major(id)
);
SHOW INDEX FROM stuinfo;

/* 
主键和唯一的对比:
	都具有唯一性;
	主键不允许为空、唯一允许为空;
    一个表中最多只能有一个主键;
    都允许组合,但都不推荐

外键:
	1、要求在从表设置外键关系
    2、从表的外键列的类型和主表的关联列的类型要一致或兼容
    3、主表的关联列必须是一个key(一般是主键或唯一)
    4、插入数据时,先插入主表,再插入从表;删除数据时,先删除从表,再删除主表
*/


#修改表时添加约束
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo(
	id int,
    stu_name varchar(20),
    gender char(1) check(gender='男' or gender='女'),
    seat int unique,
    age int,
    major_id int
);

#1、添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stu_name varchar(20) not null;

#2、添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

#3、添加主键
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
# ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#4、添加唯一
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
# ALTER TABLE stuinfo ADD UNIQUEY(id);

#5、添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_major_id 
FOREIGN KEY(major_id) REFERENCES major(id);

#修改表时删除约束
#和添加约束语法一致,把后面的约束去掉再执行一次就行了

#删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;

#删除唯一
ALTER TABLE stuinfo DROP INDEX seat;

#删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_major_id;

  

posted @ 2020-07-07 16:31  王朝君BITer  阅读(163)  评论(0编辑  收藏  举报