MySQL复习笔记(十一):DDL、数据库和表的管理、常见数据类型、常见约束、自增

DDL语言

数据定义语言(Data Define Language):库和表的管理操作

  • 创建:create
  • 修改:alter
  • 删除:drop

数据库的管理

一、数据库的创建

语法:

create databaseif not exists】库名;

1、不存在的情况下,创建数据库books

create database if not exists books;

二、库的修改

1、更改库的字符集

ALTER DATABASE books CHARACTER SET UTF-8;

三、删除数据库

DROP DATABASE IF EXISTS books;

表的管理

一、表的创建 ★

语法:

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

1、创建book表

create table book(
	id INT,		#编号
    bk_name VARCHAR(50), #书名
    price DOUBLE,		#价格
    author_id INT,		#作者id
    publish_date DATETIME	#出版日期
);

2、创建作者表

create table author(
	id INT,			#作者id
	au_name VARCHAR(20),	#作者姓名
	nation VARCHAR(10)		#作者国际
)

二、表的修改

语法:

ALTER TABLE 表名 CHANGE|RENAME|MODIFY|ADD|DROP|RENAME COLUMN 【列名 列类型 约束】

1、修改列名

#修改列名publish_date为pub_date
ALTER TABLE book CHANGE COLUMN publish_date pub_date DATETIME;

2、修改列的类型或约束

#修改pub_date的类型为TIMESTAMP
ALTER TABLE book MODIFY COLUMN pub_date TIMESTAMP;

3、添加新列

#添加作家年薪列:annual
ALTER TABLE book ADD COLUMN annual DOUBLEfirst|after+字段名】; #使用first或者after+字段名可以改变新字段插入的位置

4、删除列

#删除作家年薪列:annual
ALTER TABLE book DROP COLUMN annual;

5、修改表名

ALTER TABLE author RENAME TO book_author

三、删除表

DROP TABLE IF EXISTS book_author

四、表的复制

1、仅仅复制表结构

CREATE TABLE copy LIKE book;

2、复制表结构+数据

CREATE TABLE copy SELECT * FROM book;

3、只复制部分数据

CREATE TABLE cpoy
SELECT id, au_name
FROM author
WHERE nation='中国';

4、仅仅复制某些字段,而且不要数据

CREATE TABLE copy
SELECT id,au_name
FROM author
WHERE 1=2;  #设置恒为false的条件

常见数据类型

  • 数值型
    • 整数型
    • 小数
      • 定点数
      • 浮点数
  • 字符型
    • 较短的文本:char,varchar
    • 较长的问题:text,blob(较长的二进制数据)
  • 日期型

原则:选择的类型越简单越好,能保存的数值类型越小越好

一、整数型

分类:

tinyint smallint mediumint int/integer bigint
字节数 1 2 3 4 8

特点

  • 如果不设置无符号和有符号,默认是有符号。如果需要设置无符号需要追加unsigned关键字
  • 如果插入的数值超出临对应整型的范围,会报out of range异常,并且插入临界值
  • 如果不设置长度,会有默认的长度

1、设置有符号和无符号

create table tab_int(
	t1 int,			#默认为有符号
	t2 int unsigned	#无符号
)

二、小数

分类:

float(M,D) double(M,D) DEC(M,D) / DECIMAL(M,D)
字节 4 8
说明 较小的浮点数 较大浮点数 定点数,取值范围和double相同,有效范围由M和D决定

特点

  • M:整数长度+小数长度,D:小数部分长度。如果超出范围,则插入临界值
  • M和D都可以省略。如果是DECIMAL,默认是(10,0)。如果是float和double,则会根据插入数值的精度来决定精度
  • 定点型的精度较高,如果插入数值的精度要求较高,如货币运算,则考虑使用。

三、字符型

  • 较短的文本:char,varchar
  • 较长的问题:text,blob(较长的二进制数据)
  • binary和varbinary用于保存较短的二进制
  • enum用于保存枚举,插入值时只能从枚举的数据中取,而且只能去一个
  • set用于保存集合,插入值时只能从枚举的数据中取,可以取多个

特点:

CHAR V
写法 CAHR(M) VARCHAR(M)
M的含义 最大字符数,可以省略,默认为1 最大字符数,不可以省略
特点 固定长度字符 可变长度字符
空间消耗 比较耗费空间 比较节省空间
效率

1、enum举例

create table tab_enum(
	e1 enum('男','女')
);
insert into tab_enum value('男'); #可以
insert into tab_enum value('女'); #可以
insert into tab_enum value('中'); #不可以,值为空

2、set举例

create table tab_set(
	s1 set('a','b','c')
);
insert into tab_set value('a');		 #可以
insert into tab_set value('a,b,c');	 #可以
insert into tab_set value('d');		 #不可以

四、日期型

分类:

  • date:只保存日期
  • time:只保存时间
  • year:只保存年
  • datetime:保存日期+时间
  • timestamp:保存日期+时间

特点

字节 范围 是否受时区的影响
datetime 8 1000-9999 ×
timestamp 4 1970-2038

常见约束

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

分类:六大约束

  • NOT NULL:非空约束,用于保证该字段的值不能为空。比如姓名、学号
  • DEFAULT:默认约束,用于保证该字段有默认值,比如性别
  • PRIMARY KEY:主键,用于保证该字段的值具有唯一性。比如学号,员工编号
  • UNQIUE:唯一,用于保证该字段的值具有唯一性,但是可以为空,比如座位号
  • CHECK:检查约束【MySQL不支持】,用于指定值必须在某个范围内,比如年龄、性别。
  • FOREING KEY:外键,用于限制两个表得关系。在从表中添加外键约束,用于引用主表中某列的值。比如学生表的专业编号

添加约束的时机:

  • 创建表时
  • 修改表时

约束的添加分类:

  • 列级约束:六大约束语法上都支持,但是外键约束没有效果
  • 表级约束:除了默认、非空,其他都支持
Create table 表名(
	字段名 字段类型 列级约束,
    字段名 字段类型,
    ...
	表级约束
)
列级约束 表级约束
位置 列的后面 所有列的最下面
支持的约束类型 语法都支持,但是外键没有效果 除了默认、非空,都支持
是否可以起约束名 不可以 可以

一、创建表时如何添加约束

添加列级约束

语法:直接在字段名或者类型后面追加约束类型。

​ 只支持:主键、唯一、默认、非空

栗子:

#准备
create database students;
use students;
create table major(
	id INT PRIMARY KEY,
    major_name VARCHAR(20)
)
#添加常见列级约束
create table stuinfo(
	id INT PRIMARY KEY,			#主键约束
    stuName VARCHAR(30) NOT NULL,		#非空约束
    gender CHAR(1) CHECK(gender IN ('男','女')),	#检查,MySQL不支持
    seat INT UNIQUE,		#唯一约束
    age INT DEFAULT 18,		#默认约束
    majorId INT REFERENCES majar(id)	#外键,在这里加其实是无效的,不过不会报错
)

添加列级约束

语法:在所有字段最下面

【CONSTRAINT 约束名】 约束类型(字段名)

例子:

#准备
DROP TABLE IF EXISTS stuinfo;

create table stuinfo(
	id INT,
    gender CHAR(1),
    seat INT,
    majorId INT,
	CONSTRAINT pk PRIMARY KEY(id),		#主键
    CONSTRAINT uq UNIQUE(seat),			#唯一
    CONSTRAINT ck CHECK(gender IN ('男','女')),		#检查
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id)	#外键
)

通常的写法

  • 主键、唯一、非空、默认添加在列级上
  • 外键添加在表级上

例子:

create table stuinfo(
	id INT PRIMARY KEY,			#主键约束
    stuName VARCHAR(30) NOT NULL,		#非空约束
    gender CHAR(1)
    seat INT UNIQUE,		#唯一约束
    age INT DEFAULT 18,		#默认约束
    majorId INT,
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorID) REFERENCES major(id)	#外键
)

主键 VS 唯一(面试题)

主键 唯一键
保证唯一性
是否允许为空 ×
一个表中可以有多少个 至多为一1个 可以有多个
是否允许组合 可以,但不推荐 可以,但不推荐

外键特点

  • 要求在从表设置外键关系
  • 从表的外键列的数据类型要求和主表的关联列数据类型一致或兼容,名称无要求
  • 主表中的关联列必须是一个key(一般是主键或者唯一)
  • 插入数据时,要先插入主表数据,在插入从表数据。删除数据时,先删除从表数据,再删除主表数据
  • 可以设置外键的语句后面添加 ON DELETE CASCADE 设置级联删除(当主表的相应行删除时,从表中对应的行也删除)
  • 可以设置外键的语句后面添加 ON DELETE SET NULL 设置级联置空(当主表的相应行删除时,从表中对应行外键的值设为NULL)

二、修改表时添加约束

语法:

  • 添加列级约束
ALTER TABLE 表名 MODEIFY COLUMN 列名 列类型 新约束;
  • 添加表级约束
ALTER TABLE 表名 ADDCONSTRAINT 约束名】 约束类型(列名) 【外键的引用】

1、添加非空约束

ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;

2、添加默认约束

ALTER TABLE stuinfo MODIFY COLUMN age DEFAULT 18L

3、添加主键

#列级约束
ALTER TABLE stuinfo MODIFY COLUMN ID PRIMARY KEY;
#表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(ID);

4、添加唯一键

#列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat UNIQUE;
#表级约束
ALTER TABLE stuinfo ADD UNIQUE(SEAT);

5、添加外键

ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id);

三、修改表时删除约束

1、删除非空约束

ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20);

2、删除默认约束

ALTER TABLE stuinfo MODIFY COLUMN age

3、删除主键

ALTER TABLE stuinfo DROP PRIMARY KEY

4、删除唯一

ALTER TABLE stuinfo DROP INDEX SEAT

5、删除外键

ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major

标识列

含义:又称为自增长列,可以不用手动的插入值,系统提供默认的序列值

特点:

  • 标识列必须和主键搭配吗?不一定,但是要求必须是一个key
  • 一个表可以有多少个自增长列?至多一个
  • 标识列的类型必须是数值型
  • 标识列可以通过set_auto_increment_increment = 3设置步长。可以通过手动插入值设置起始值

例子:

1、创建表时设置标识列

create table stu(
	id int primary key auto_increment,
	name varchar(20)
)

2、修改表时添加标识列

alter table stu modify column id int primary key auto_increment;

3、修改表时删除标识列

alter table stu modify column id int primary key;

你可能感兴趣的:(MySQL,后端)