# DLL
/*
数据定义语言
库和表的管理
一、库的管理
创建、修改、删除
二、表的管理
创建、修改、删除
创建:create
修改:alert
删除;drop
*/
#一、库的管理
#1、库的创建
/*
语法:
create datebase 库名;
*/
#案例: 创建库Books
CREATE DATABASE books;
CREATE DATABASE IF NOT EXISTS books;
#2、库的修改
/*
*/
更改库的字符集
ALTER DATABASES books CHARACTER SET
#3、库的删除
DROP DATABASE books;
DROP DATABASE IF EXISTS books;
#二、表的管理
#1、表的创建
/*
create table 表名(
列名 列的类型【长度) 约束】,
列名 列的类型【长度) 约束】,
列名 列的类型【长度) 约束】,
...
)
*/
#案例:创建表Book
USE books;
CREATE TABLE book(
id INT, #编号
bname VARCHAR(20), #书名
price DOUBLE, #价格
authorId INT, #作者编号
publishDate DATETIME #出版日期
);
CREATE TABLE author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(10)
);
DESC author;
#2.表的修改
/*
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
*/
#1、修改表名
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
#2、修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pudate TIMESTAMP;
#3、添加新列
ALTER TABLE book ADD COLUMN annual DOUBLE;
#4、删除列
ALTER TABLE author DROP COLUMN annual;
#5、修改表名
ALTER TABLE author RENAME TO book_author;
#3.表的删除
DROP TABLE 【 IF EXISTS 】 book_author;
# 查看当前库所有表
SHOW TABLES;
# 通用的写法:
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 表名;
#4、表的复制
INSERT INTO author VALUES
(1, '莫言', '中国'),
(2, '冯唐', '中国'),
(3, '金庸', '中国'),
(4, '村上春树', '日本')
SELECT * FROM author;
#1、仅仅复制表的结构
CREATE TABLE copy LIKE author;
#2、复制表的结构+数据
CREATE TABLE copy2
SELECT * FROM author;
# 只复制部分
CREATE TABLE copy3
SELECT id, au_name FROM author WHERE nation = '中国';
# 仅仅复制某些字段,不复制数据;
CREATE TABLE copy4
SELECT id, au_name FROM author WHERE 1=2;
CREATE TABLE copy4
SELECT id, au_name FROM author WHERE 0;
/*
常见的数据类型:
数值型:
整形: TINYINT 2-255
SMALLINT -32768 ~32767
MEDIUMINT -8388608~8388607
INT -2147483648 ~ 2147483647
BIGINT -9223372036854775804 ~9223372036854775803
特点: 1、如果不设置无符号,就是有符号
2、如果插入的数值超出整形范围,回报异常,并且实际插入临界值
3、如果不设置长度,会有默认的长度
小数: M:有效数字位数 D:小数位数
点定数 dec(M,D)
decimal(M,D)
浮点数 float(M,D) 4字节
double(M,D) 8字节
字符型: M:最多的字符数,一个汉字,一个a 都是一个字符
较短的文本:char(M) 固定长度的字符 比较耗费 效率高 可以省略M参数
varchar(M) 可变长度的字符 比较节省 效率低 不可以省略M参数
其他:
binary 和 varbinary
较长的文本:text、
blob(较长的二进制数据)
enum 列表类型 设定列只能输入的值,只能一次插入可选列表的一个值;
set 列表类型 设定列只能输入的值,能一次将可选列表的多个值作为一个值 进行插入
日期型:
date 1000-01-01
datetime 1000-01-01 00:00:00
timestamp 19700101080001
time -838:59:59
year 1901
*/
TINYINT SMALLINT MEDIUMINT INT BIGINT
CREATE TABLE tab_char(
c1 ENUM('a', 'b', 'c')
)
INSERT INTO tab_char VALUES('a')
CREATE TABLE tab_set(
s1 SET('a', 'b', 'c', 'd')
)
INSERT INTO tab_set VALUES('a','b','c')
# 常见约束
/*
含义:一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性
分类:六大约束
NOT NULL: 非空, 用于保证该字段的值不能为空 比如:姓名、学号等
DEFAULT: 默认,用于保证该字段默认值 比如:性别
PRIMARY KEY: 主键,用于保证该字段具有唯一性,并且非空 比如:学号、员工编号
UNIQUE :唯一,用于保证该字段的值具有唯一性,可以为空 比如座位号
CHECK:检查约束【mysql中不支持】,比如:年龄、性别
FOREIGN KEY:外键,用于限制两个表的关系的,用于保证该字段值必须来自于主表的关联列的值
在从表添加外键约束,用于限制主表中某列的值
比如:学生表的专业编号,员工表的部门编号,工种编号
添加约束的时机:
1、创建表时
2、修改表时
约束的添加的分类:
列级约束:
六大约束语法上都支持,但外键约束没有效果
表级约束:
除了非空、默认,其他的都支持
主键和唯一的大对比:
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
主键 是 否 至多有1个 可以,但不推荐
唯一 是 是 可以有多个 可以,但不推荐
*/
CREATE TABLE 表名(
字段名 字段类型 【列级约束】
字段名 字段类型
表级约束
)
#一、创建表时添加约束
CREATE DATABASE students;
#1、添加列级约束.
/*
语法:
直接在字段名和类型后面追加 约束类型即可。
只支持:默认、非空、主键、唯一
*/
USE students;
CREATE TABLE stuinfo(
id INT PRIMARY KEY, # 主键
stuName VARCHAR(20) NOT NULL, #非空
gender CHAR(1) CHECK(gender='男' OR gender='女'), #检查
seat INT UNIQUE, # 唯一
age INT DEFAULT 18, #默认约束
majorId INT REFERENCES major(id) # 外键
);
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
DESC stuinfo;
SHOW INDEX FROM stuinfo;
# 查看stuinfo表中所有的索引,包括主键、外键。
#2、添加表级约束
/*
语法:在各个字段最下面
【constraint 约束名】 约束类型(字段名)
*/
DROP TABLE IF EXISTS stuinfo;
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) #外键
);
SHOW INDEX FROM stuinfo;
#通用的写法:
CREATE TABLE IF EXISTS stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
gender CHAR(1),
age INT DEFAULT 18,
SET INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorid) REFERENCES major(id)
);
#二、修改表时添加约束
/*
1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2、添加表级约束
alter table 表名 add 【constraint 约束名】约束类型(字段名) 【外键的引用】;
*/
#1、添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;
#2、添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#3、添加主键
#1、列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#2、表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#4、添加唯一
#1、列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#2、表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5、添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(major) REFERENCES major(id);
#三、修改表时删除约束
#1、 删除约束(修改的时候不添加 约束即可)
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20);
#2、删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;
#3、删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4、删除唯一键
ALTER TABLE stuinfo DROP INDEX seat;
#5、删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
#标识列
/*
又称为自增长列
含义:可以不用手动插入值,系统提供默认序列值
特点:
1、标识列必须与主键搭配吗?不一定,但要求是一个key
2、一个表中可以有几个标识列?至多一个
3、标识列的类型只能是数值型
4、标识列可以通过 set auto_increment_increment=3;设置步长
可以通过手动插入值,设置起始值
*/
#一、创建表时设置
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
)
#二、修改表时设置标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
#三、修改表时删除标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT ;