MySQL(数据定义语言DDL)


相关概念

数据定义语言
库和表的管理
一、库的管理 创建,修改,删除
二、表的管理 创建,修改,删除

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

一、库

1.库的创建

语法:
create database [if not exits] 库名
#案例:创建库books 
CREATE DATABASE IF NOT EXISTS books

2.库的修改

注意:库一般不会修改,如果修改库的话就会引发很多的问题

#更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;

3.库的删除

DROP DATABASE IF EXISTS books;

二、表

1.表的创建☆

/*
语法:
create table 表名(
	列名 列的类型【(长度) 约束】,
	列名 列的类型【(长度) 约束】,
	列名 列的类型【(长度) 约束】,
	......
	列名 列的类型【(长度) 约束】
)

*/
#案例:创建表 book
CREATE DATABASE book;

CREATE TABLE book(
	id INT,#编号
	bName VARCHAR(20),#图书名
	price DOUBLE,#价格
	authorId INT,#作者编号
	publishDate DATETIME#出版日期
);

#创建表author
CREATE TABLE author(
	id INT,
	au_name VARCHAR(20),
	nation VARCHAR(10)
)

2.表的修改

/*
alter table 表名 add|drop|modify|change column 列名【类型 约束】;
*/
DESC `author`
DESC book
#①修改列名
ALTER TABLE `book` CHANGE COLUMN `publishDate` pubDate DATETIME;
#②修改列的类型或约束
ALTER TABLE `book` MODIFY COLUMN `pubDate` TIMESTAMP;
#③添加新列
ALTER TABLE `author` ADD COLUMN annual DOUBLE;
#④删除列
ALTER TABLE `author` DROP COLUMN annual;
#⑤修改表名
ALTER TABLE `author` RENAME TO `author_book`;

3.表的删除

DROP TABLE IF EXISTS`author_book`;
SHOW TABLES;

4.表的复制

INSERT INTO `author`
VALUES(1,'老舍','中国'),
(2,'村上春树','日本'),
(3,'鲁迅','中国'),
(4,'金庸','中国');

SELECT * FROM `author`;
SELECT * FROM copy4;

①仅仅复制表的结构

CREATE TABLE copy LIKE `author`;
#②复制表的结构+数据
CREATE TABLE copy2 
SELECT * FROM `author`;

③创建表并复制部分的数据

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

④复制表的部分结构

CREATE TABLE copy4
SELECT id,`nation`
FROM `author`
WHERE 0;

三、标识列

相关概念

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

特点:
1.标识列必须和主键搭配吗?不一定,但要求是一个key(比如主键,唯一键,外键等)
2.一个表可以有几个标识列?至多一个
3.标识列的搭配的类型只能是数值型
4.标识列可以通过set auto_increment_increment=3;设置步长 可以通过手动插入值来设置起始的值

DROP TABLE IF EXISTStab_info

1、创建表时添加标识列

CREATE TABLE tab_info(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	address VARCHAR(20)

)

2、修改表时添加标识列

CREATE TABLE tab_info(
	id INT ,
	NAME VARCHAR(20),
	address VARCHAR(20)

)
ALTER TABLE `tab_info` MODIFY COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

3、修改表时删除标识列

ALTER TABLE `tab_info` MODIFY COLUMN `id` INT;
其实就是相当于不写

四、数据类型

相关概念

#常见的数据类型

数值型:
	整数
	小数:
		定点数
		浮点数
字符型:
	较短的文本:charvarchar
	较长的文本:textblob(较长的二进制数据)
日期型:

1、整形

/*
分类:
tinyint,smallint,mediumint,int/integer,bigint
1		2	3	4		8字节
特点:
	①如果不设置有符号还是无符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
	②如果插入的数值超过了整型的范围,会报 out of range异常,并且插入临界值
	③如果不设置长度,会有默认的长度
	长度代表了显示的宽度,而不是数据的范围,范围是根据哪一个来分(tinyint,smallint,mediumint,int/integer,bigint)的,如果不够用会用0在左边填充,但必须搭配zerofill使用
*/

2、小数

/*
分类:
	1.浮点型
	float(M,D)
	double(M,D)
	定点型
	dec(M,D)
	decimal(M,D)
特点:
	①
	M:整数部位(长度)+小数部位(长度)
	D:小数部位(长度)
	如果超过长度的范围则插入临界值
	②
	M和D都可以省略
	如果是decimal,则默认为10,D默认为0
	如果是float和double,则会根据插入的数值的精度来决定精度
	③
	定点型的精度较高,如果要求插入的数值的精度较高如货币运算等则考虑使用

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

3、字符型

/*较短的文本:
char 
varchar
其他:
	binaryvarbinary用于保存较短的二进制
	enum用于保存枚举
	set用于保存集合

较长的文本:
text
blob(较大的二进制)

特点:
	写法		M的意思				特点		空间的耗费	效率
char	char(M)	最大的字符数,可以省略默认为1	固定长度的字符	比较耗费	高
varchar varchar(M)	最大的字符数,不可以省略	固定长度的字符	比较节省	低

*/

4.日期型

/*
分类:
	date 只保存日期
	time 只保存时间
	year 只保存年
	
	datetime保存日期+时间
	timestamp保存日期+时间
特点:
		字节	范围		时区等的影响
datetime	8	1000-9999	不受
timestamp	4	1970-2038	受

*/

五、常见约束

相关概念

#常见约束

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

分类:六大约束
	not null:非空,用于保证该字段的值不能为空
	比如姓名,学号等
	default:默认,用于保证该字段有默认值
	比如性别
	primary key:主键,用于保证该字段具有唯一性,并且非空
	比如学号,员工编号等
	unique:唯一,用于保证该字段的值具有唯一性,可以为空
	比如座位号
	check:检查约束【MySQL中不支持】
	比如性别,年龄
	foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
		在从表添加外键约束,用于引用主表中某列的值
	比如学生表的专业编号,员工表的部门编号,员工表的工种编号
添加约束的时机:
	1.创建表时
	2.修改表时
约束的添加分类:
	列级约束
		六大约束语法上都支持,但外键约束没有效果
	表级约束
		除了非空、默认,其他的都支持
主键和唯一的大对比:
		保证唯一性	是否允许为空			一个表中可以有多少个	是否允许组合
	主键	√		×				至多有1个		√,但不推荐
	唯一	√		√(但是只能允许一个数据为空)	可以有多个		√,但不推荐
外键:
	1.要求在从表设置外键关系
	2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
	3.主表的关联列必须是一个key(一般是主键或唯一)
	4.插入数据时,先插入主表,再插入从表
	删除数据时,先删除从表,再删除主表


*/
CREATE TABLE 表名(
	字段名 字段类型 列级约束,
	字段名 字段类型,
	表级约束
	
)

1、创建表时添加约束

/*
语法:
	直接在字段名和类型后面追加约束类型即可
	只支持:
		默认,主键,唯一,非空
*/

CREATE DATABASE student;

①.添加列级约束

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 major
DESC `stuinfo`

②.添加表级约束

/*
语法:在各个字段的最下面
【constraint 约束名】约束类型(字段名)
*/
DROP TABLE stuinfo;
CREATE TABLE stuinfo(
	id INT ,
	stuName VARCHAR(20), 
	gender CHAR(1) ,
	seat INT ,
	age INT ,
	majorId INT ,

	PRIMARY KEY(id),
	UNIQUE(seat),
	CHECK(gender='男' OR gender='女'),
	FOREIGN KEY(majorid) REFERENCES major(id)
	
	
);
DESC stuinfo
SHOW INDEX FROM stuinfo

③通用的写法(就是表级添加和列级添加一起使用)

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 ,
	CONSTRAINT fk_majorId FOREIGN KEY(majorid) REFERENCES major(id)
	
);

2、修改表时添加约束

/*
1.添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束
2.添加表级约束
alter table 表名 add【constraint 约束名】约束类型(字段名)【外键的引用】

*/
DROP TABLE stuinfo;
CREATE TABLE stuinfo(
	id INT ,
	stuName VARCHAR(20), 
	gender CHAR(1) ,
	seat INT ,
	age INT ,
	majorId INT 
);
DESC `stuinfo`

①.添加主键约束

列级约束
ALTER TABLE `stuinfo` MODIFY COLUMN id INT PRIMARY KEY;
或者
表级约束
ALTER TABLE `stuinfo` ADD PRIMARY KEY(id);

②.添加外键

ALTER TABLE `stuinfo` ADD CONSTRAINT fk_`stuinfo`_`major` FOREIGN KEY(majorid) REFERENCES major(id);
#3.添加唯一,非空等都是一样的

3、修改表时删除约束

删除约束
(删除约束就是ALTER修改的时候后面不写约束就是了,就相当于是删除了但是删除主键,唯一和外键会有差别(用到了DROP)但是也可以用不写的方法)
删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
删除唯一
ALTER TABLE `stuinfo` DROP INDEX seat;
删除外键约束
ALTER TABLE `stuinfo`DROP FOREIGN KEY majorid;

列级约束  列的后面		语法都支持,但是外键没有效果	不可以取约束名
表级约束  所有列的下面		默认和非空不支持,其他支持	可以取约束名(主键没有效果)

猜你喜欢

转载自blog.csdn.net/m0_54196813/article/details/121123744