MySQL学习记录 - 11-DDL语言

根据尚硅谷的视频教程学习MySQL,学习记录-11-DDL语言,数据库定义语言。
库的管理:创建、修改、删除,以及常见的数据类型、约束、标识列

一、库的创建

Create database 库名;
CREATE DATABASE IF NOT EXISTS 库名;

二、库的修改

不建议修改库名,以下主要为修改库的字符集

ALTER DATABASE 库名 CHARACTER SET 新字符;

三、库的删除

DROP DATABASE 库名;
DROP DATABASE IF EXISTS 库名;

四、库中表的管理 - 创建

CREATE TABLE IF NOT EXISTS 表名(
	列名 列的类型 【(长度) 约束】,
	列名 列的类型 【(长度) 约束】,
	...)

练习:创建BOOK表

CREATE TABLE book(
	 id INT , #编号
	 bname VARCHAR(20),
	 price double,
	 authorid INT,
	 publishdate DATETIME)

练习:查看book表的结构

DESC book;

表框架为MySQL学习记录 - 11-DDL语言_第1张图片

练习:创建author表

CREATE TABLE author(
 id INT,
 au_name VARCHAR(20),
 nation VARCHAR(20)
)

表框架为:
MySQL学习记录 - 11-DDL语言_第2张图片

五、库中表的管理 - 修改

表的修改
ALTER TABLE 表名 ADD | DROP | MODIFY | CHANGE COLUMN 列名 【列类型 约束】;

  1. 修改列名
ALTER TABLE book CHANGE COLUMN publishdate pubdate DATETIME;
  1. 修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
  1. 添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;
  1. 删除列
ALTER TABLE author DROP COLUMN annual;
  1. 修改表名
ALTER TABLE author RENAME TO book_author;

六、库中表的管理 - 删除

DROP TABLE book_author;
DROP TABLE IF EXISTS 表名;

七、库中表的管理 - 复制

  1. 仅仅复制表的结构
CREATE TABLE copy LIKE author;
  1. 复制表的结构 + 数据
CREATE TABLE copy2 SELECT * FROM author;
  1. 复制表的结构+部门数据
CREATE TABLE copy3 SELECT id, au_name FROM author WHERE nation = 'China';
  1. 仅仅复制某些字段
CREATE TABLE copy4
SELECT id, au_name
FROM author WHERE 0;

八、常见的数据类型

数值型:整型 | 定点型 | 浮点型
字符型:较短的文本: CHAR | VARCHAR;较长的文本:TEXT | BLOB
日期型

  1. 整型 - 具体分类如下,以及所占的字节
    tinyint、smallint、mediumint、int\ integer、 bigint
    1 2 3 4 9

特点

  1. 都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号
  2. 如果超出了范围,会报 out of range异常,插入临界值
  3. 长度可以不指定,默认会有一个长度,长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认为无符号整型
  1. 浮点型
    定点数:decimal(M,D)
    浮点数:float(M,D) double(M,D)

特点:

  1. M代表整数部位+小数部位的个数,D代表小数部位
  2. 如果超出范围,则报 out of range一场,并且插入临界值
  3. M和D都可以省略,但对于定点数,M默认为10,D默认为0
  4. 如果精度要求较高,则优先考虑使用定点数
  1. 字符型
    char、varchar、binary、varbinary、enum、set、text、blob,其中常用的为char 和 varchar

char:固定长度的字符,写法CHAR(M), 最大长度不能超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法VARCHAR(M),最大长度不能超过M,其中M不可以省略

  1. 日期型
    year、date、time、datetime、timestamp,
    其中timestamp比较容易受时区、语法模式、版本的影响,但更能反映当前时区的真实时间

九、常见的约束

含义:一种限制,限制表中的数据,为了保证表中的数据准确和可靠性

分类 - 六大约束:
1 not null:非空,用于保证该字段的值不能为空,比如姓名、学号等
2 default:默认,用于保证该字段有默认值,比如城市
3 primary key:主键,用于保证该字段的值具有唯一性,且非空,如员工编号等
4.unique:唯一,用于保证该字段的值具有唯一性,但可以为空,如手机号
5.check:检查约束【mysql中不支持】
6.foreign key:外键,用于限制两个表的关系,保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,比如学生表的课程编号,员工表的部门编号

添加约束的时机:
1. 创建表时
2. 修改表时

约束的添加分类:
列级约束:六大约束语法上都支持,但是外键约束没有效果
表级约束:除了非空、默认,其他的都支持

CREATE TABLE 表名(
	字段名 字段类型 列级约束,
	字段名 字段类型 列级约束,
	表级约束
	)
表级约束:CONSTRAINT 约束名 约束类型(字段名)
	
  1. 创建表时添加列级约束,可以对同一字段添加多个约束
CREATE TABLE stuinfo (
	 id INT PRIMARY KEY, #主键❤
	 sname VARCHAR(20) NOT NULL, #非空❤
	 gender CHAR(1)  CHECK(gender in ('男','女')), #检查
	 seat INT UNIQUE, # 唯一❤
	 age INT DEFAULT 18, #默认❤
	 majorid INT REFERENCES major(id) #外键
)
  1. 创建表时添加表级约束
CREATE TABLE stuinfo(
	 id INT,
	 sname VARCHAR(20),
	 gender CHAR(1),
	 seat INT,
	 age INT,
	 majorid INT,
	 CONSTRAINT pk PRIMARY KEY (id), #主键
	 CONSTRAINT uq UNIQUE (seat), #唯一
	 CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorid) REFERENCES major(id) #外键
)
  1. 创建表约束通用写法, 只把外键写在表级约束上
CREATE TABLE IF NOT EXISTS stuinfo(
	 id INT PRIMARY KEY,
	  sname VARCHAR(20) NOT NULL,
	  gender CHAR(1)  CHECK(gender in ('男','女')), 
	  seat INT UNIQUE, 
	  age INT DEFAULT 18,
	  majorid INT,
 	 CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)  #外键约束
);

主键和唯一的对比
1 主键:保证唯一性,不允许为空,一个表中只能有一列设定主键约束,允许多个列组合为一个主键,但不推荐

primary key (id, sname) --将id 和 sname合并内容作为一个主键,此时id可以重复,sname可以重复,但是id 与 sname合并的结果不允许重复

2 唯一:保证唯一性,允许为空,但只有一个空值,一个表中可以有多列设定唯一约束,允许多个列组合唯一,但不推荐

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

  1. 修改表时添加约束
列级约束:
ALTER TABLE 表名 MODIFY COLUMN 列名 字符类型 约束;
表级约束:
ALTER TABLE 表名 ADD 约束类型(字段名) 【外键的引用】;
ALTER TABLE stuinfo MODIFY COLUMN sname VARCHAR(20) NOT NULL; #非空
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;#默认
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;#主键
ALTER TABLE stuinfo ADD PRIMARY KEY (id);#主键2
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; #唯一
ALTER TABLE stuinfo ADD UNIQUE(seat); #唯一2
ALTER TABLE stuifo ADD FOREIGN KEY(majorid) REFERENCES major(id); # 外键
  1. 修改表时删除约束
ALTER TABLE stuinfo MODIFY COLUMN sname VARCHAR(20) NULL; #删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN age INT; #删除默认约束;
ALTER TABLE stuinfo DROP PRIMARY KEY; #删除主键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major; #删除外键

九、标识列 - 自增长列

含义:自增长列,可以不用手动的插入值,系统提供默认的序列值,特点如下:
-> 标识列不一定和主键搭配,但一定要求是唯一值,一个key
-> 一个表至多一个标识列
-> 标识列的类型只能是数值型,一般为INT
-> 标识列可通过SET auto_increment_increment = 3; 设置步长

  1. 创建表时设置标识列
CREATE TABLE tab_identity(
  id INT PRIMARY KEY AUTO_INCREMENT,
  uname VARCHAR(20)
); #创建表
INSERT INTO tab_identity VALUES (NULL, 'John'),(NULL,'Jack'),(null,'Rose'); #插入数据,注意,ID列全部输入null,会自增长填充
SELECT * FROM tab_identity;#查看数据表

MySQL学习记录 - 11-DDL语言_第3张图片

可更改步长

SHOW VARIABLES LIKE '%auto_increment%';
SET auto_increment_increment = 3; #将自增长的步长调整为3

此时再一次插入上方的values,结果为:
MySQL学习记录 - 11-DDL语言_第4张图片

  1. 修改时设置标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
  1. 删除标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;

你可能感兴趣的:(MYSQL,mysql)