欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mysql-DDL库和表的管理 常见数据类 型常见约束

程序员文章站 2022-05-30 17:13:29
...

库和表的管理

#DDL
/*
数据定义语言
库和表的管理

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

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

*/
#库的管理
/*1,库的创建
create database 库名;
*/
#1创建books库
CREATE DATABASE IF NOT EXISTS books;
#2库的修改
RENAME DATABASE books TO 新库名;
#更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;
#3库的删除
DROP DATABASE IF EXISTS books;

#表的管理
#一  表的创建【*】
/*
create table 表名(
	列名 列的类型【(长度) 约束】,
	列名 列的类型【(长度) 约束】,
	...
	列名 列的类型【(长度) 约束】
)
*/
#创建book表
CREATE TABLE IF NOT EXISTS 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)
);
DESC author

#二 表的修改 
/*
alter table 表名 add|drop|modify|change column 列名【列类型,约束】
*/

#修改列名
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 book_author

DESC book

#三 表的删除
DROP TABLE IF EXISTS book_author;
SHOW TABLES;

#通用的写法
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;

DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 新表名()#表的复制
SELECT * FROM author

INSERT INTO author VALUES
(1,'盖世凯1','中国'),
(2,'盖世凯2','中国'),
(3,'盖世凯3','中国'),
(4,'盖世凯4','中国');
#1仅仅复制表的结构
CREATE TABLE copy LIKE author;
#2.0复制表的结构+数据
CREATE TABLE copy2
SELECT * FROM author;
#2.1只复制表的部分内容
CREATE TABLE copy3
SELECT id,au_name
FROM author
WHERE nation='中国';
#2.2仅仅复制某些字段
CREATE TABLE copy4
SELECT id,au_name
FROM author
WHERE 0;


#--------------------------------------------------------------
#库和表的练习
#1,创建表dept1
USE test;

CREATE TABLE dept1(
	id INT(7),
	NAME VARCHAR(25)
);
#2将department中的东西复制过来
CREATE TABLE dept2
SELECT department_id,department_name
FROM myemployees.`departments`
#3创建表emp5
CREATE TABLE emp5(
	id INT(7),
	first_name VARCHAR(25),
	last_name VARCHAR(25),
	dept_id INT(7)
);
#4将last_name的长度增加到50
ALTER TABLE emp5 MODIFY COLUMN last_name VARCHAR(50)
#5根据employees创建employees2
CREATE TABLE employees2 LIKE myemployees.`employees`;
#6删除表emp5
DROP TABLE IF EXISTS emp5
#7将表employees2重命名为emp5
ALTER TABLE employees2 RENAME TO emp5
#8在表dept和emp5中添加新的列test_column 并检查所作操作
ALTER TABLE emp5 ADD COLUMN test_column INT;
#9直接删除表emp5中的列dept_id
ALTER TABLE emp5 DROP COLUMN test_column

常见的数据类型

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

#整型
/*
分类:
tinyint   smallint   mediumint   int/integer   bigint
1		2	3		4	8
特点:
1,如果不设置无符号还是有符号,默认是有符号,如果想要设置无符号,添加unsigned关键字
2,如果插入的数值超出了整型的范围  会报 out of range异常,并且插入临界值
3,如果不设置长度,会有默认的长度
长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用
*/
CREATE TABLE tab_int(
	t1 INT(7) ZEROFILL
	t2 INT(7) #设置zerofill默认是无符号
)
#小数
/*
1浮点型:
	float(M,D)
	double(M,D)
2定点型
	dec(M,D)
	decimal(M,D)
	
特点:
M和D(1)
M:整数部门+小数部位
D:小数部位
如果超出范围,则插入临界值

M和D(2)
M和D都可以省略
如果是decimal,则M是默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度的

M和D(3)
定点型的精确度较高,如果要求插入数值的精度较高或者 货币运算的话 优先考虑

原则:选择的类型越简单越好,能保存数值的类型越小越好
*/
CREATE TABLE tab_float(
	f1 FLOAT,
	f2 DOUBLE,
	f3 DECIMAL
);


#字符型
/*
	较短的文本:char,varchar
	较长的文本:text,blob(较长的二进制数据)
特点
	写法 		M的意思		特点		空间的耗费	效率
char	char(M)		最大的字符数	固定长度的字符	比较耗费空间	高
varchar	varchar(M)	最大的字符数	可变长度的字符	比较节省	低
*/

#Enum类型
/*
要求插入的值必须属于列表中指定的值之一
*/
CREATE TABLE tab_char(
	c1 ENUM('a','b','c')
)
INSERT INTO tab_char VALUES('a')#可以
INSERT INTO tab_char VALUES('A')#不可以

#Set类型
/*
和enum差不多 就是他可以选取多个成员,而enum只能选取一个
*/

#日期型
/*
分类:
	date 只保存日期
	time 只保存时间
	year 只保存年
	
	datetime 保存日期+时间
	timestamp 保存日期+时间
	
特点:
		字节	范围		时区等的影响
datetime	8	1000-9999	不受
timestamp	4	1970-2038	受
*/
CREATE TABLE tab_date(
	t1 DATETIME,
	t2 TIMESTAMP
);
INSERT INTO tab_date VALUES(NOW(),NOW())
SELECT * FROM tab_date;
#设置时区
SHOW VARIABLES LIKE 'time_zone'
SET time_zone='+9:00'

常见的六大约束

#常见的约束
/*
含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性
分类:六大约束
	NOT NULL :非空,用于保证该字段的值不能为空eg:姓名,学号
	DEFFAULT:默认,用于保证该字段有默认值eg:比如性别
	PARIMARY KEY:主键,用于保证该字段具有唯一性,并且非空eg:学号,员工编号
	UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空eg:座位号
	CHECK:检查约束【sql中不支持】eg:年龄,性别
	FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值
		在从表添加外键约束,用于引用主表中某列的值
		eg:学生的专业编号,员工表的部门编号,都要有一个大的主表来约束
添加约束条件的时机:
	1,创建表时
	2,修改表时
约束的添加分类:
	1,列级约束:六大约束语法上都支持,但外键约束没有效果
	2,表级约束:除了非空,默认,其他的都支持
*/
CREATE TABLE 表名(
	字段名 字段类型 列级约束,
	字段名 字段类型,
	表级约束
)
CREATE DATABASE students
#一,创建表的时候添加约束
/*
#添加列级约束
语法:直接往 字段名和类型 后面追加约束条件即可
只支持:非空,主键,唯一,默认
*/
USE students
CREATE TABLE IF NOT EXISTS 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)#外键
);
/*
#添加表级约束
语法:在各个字段的最下面
只支持:【constraint 约束名】 约束类型(字段名)
*/
CREATE TABLE IF NOT EXISTS 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)#外键
	*/
	PRIMARY KEY(id),#主键
	UNIQUE(seat),#唯一
	CHECK(gender ='男' OR gender='女'),#检查
	FOREIGN KEY(majorid) REFERENCES major(id)#外键
);
#通用的写法
CREATE TABLE IF NOT EXISTS stuinfo(
	id INT PRIMARY KEY,
	stuName VARCHAR(20) NOT NULL,
	sex CHAR(1),
	age INT DEFAULT 18,
	seat INT UNIQUE ,
	majorid INT,
	CONSTRAINT fk FOREIGN KEY(majorid) REFERENCES major(id)
);
CREATE TABLE IF NOT EXISTS major(
	id INT PRIMARY KEY,
	majorName VARCHAR(20)
);
DESC stuinfo;
SHOW INDEX FROM stuinfo;
DROP TABLE stuinfo;
/*
主键和唯一键的pk
	保证唯一性 	是否允许为空	一个表中可以有多少个	是否允许组合
主键	yes		no		最多一个		可以,不推荐
唯一键	yes		no		可以有多个		可以,不推荐
*/
/*
外键:
	1,要求在 从表 设置外键关系
	2,从表的外键列的类型 和 主表的关联列的类型 要求一致或者兼容,名称没有别的要求
	3,主表的关联列必须是一个key(一般时主键或唯一)
	4,插入数据时,先插入主表,再插入从表
	   删除数据时,先删除从表,在删除主表
#4的两种方法
级联删除
alter table stuinfo add constraint fk foreign key(majorid) references major(id) on delete cascade
级联置空
alter table stuinfo add constraint fk foreign key(majorid) references major(id) on delete set null

*/


#一,创建表的时候添加约束
/*
1,添加列级约束
alter table 表名 modity column 字段名 字段类型 新约束
2,添加表级约束
alter table 表名 add 【constraint 约束名】约束类型(字段名) 【外键的引用】
*/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorid INT
);
#1添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL 
#2添加默认
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18
#3添加主键(两种方式)
ALTER TABLE stuinfo MODIFY COLUMN id PRIMARY KEY;
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#4添加唯一(两种方式)
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk FOREIGN KEY(majorid) REFERENCES major(id)

#1删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#2删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#3删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4删除唯一
ALTER TABLE stuinfo DROP FOREIGN KEY fk;
/*
		位置		支持的约束类型		是否可以起别名
列级约束	列的后面	都支持,外键没有效果		不可以
表级约束	所有列的下面	默认非空不支持,其他支持	可以(主键没有效果)
*/

相关标签: 笔记 mysql