MySQL DDL语言——(库和表的管理、数据类型和常见约束)

DDL

1、库的管理
创建、修改、删除

2、表的管理
创建、修改、删除

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

3、数据类型
数值型、字符型、日期型

4、常见的约束

一、库的管理

1、库的创建
语法:

 CREATE DATABASE [IF NOT EXISTS] 库名;

1.创建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 TABLE IF NOT EXISTS  book(
	id INT,	#编号
	bname VARCHAR(20), #图书
	price DOUBLE, #价格
	authorId INT, #作者编号
	publishDate DATETIME, #出版日期
	authorName VARCHAR(20)
	
);

新增内容

INSERT INTO book VALUES 
(1,'《红楼梦》',59.8,1,NULL,'曹雪芹')
(2,'《三国演义》',59.8,2,NULL,'罗贯中'),
(3,'《水浒传》',69.5,3,NULL,'施耐庵 '),
(4,'《西游记》',85,4,NULL,'吴承恩')

查看表结构

DESC book

2.表的修改
语法:

alter table 表名 add|drop|modify|change COLUMN 列名 【列类型 约束】;

①修改列名

ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;

②修改列的类型

ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP;

③添加新列

ALTER TABLE book ADD COLUMN num INT;

④删除列

ALTER TABLE book DROP COLUMN num ;

⑤修改表名

ALTER TABLE book RENAME TO school_book;

3.表的删除

DROP TABLE  IF EXISTS school_book;

通用的写法

DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;

DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 新表名();

4.表的复制

1.仅仅复制表的结构

CREATE TABLE copy LIKE book;

2.复制表的结构以及数据

CREATE TABLE copy_book 
SELECT * FROM book;

3.只复制部分数据

CREATE TABLE copy_part 
SELECT id,bname,authorName FROM book;

三、数据类型

数值型:
	整数
	小数
		定点型
		浮点型
字符型:
	较短的文本:char、varchar
	较长的文本: text、blob(较长的二进制数据)

日期型:

整型

分类:
tinyintsmallintmediumintint/integerbigint

特点:
①如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned
②如果插入的数值超出了整型的范围,会报 out of range异常,并且插入临界值
③如果不设置长度,会有默认的长度
④长度代表了显示的最大宽度,如果显示不够,0在左边填充,搭配zerofill

如何设置无符号和有符号

DROP TABLE tab_int;

CREATE TABLE tab_int(
	t1 INT,
	t2 INT UNSIGNED	
);

插入的数值超出了整型的范围,会报 out of range异常

INSERT INTO tab_int VALUES(-123456);
INSERT INTO tab_int VALUES(-123456,-123456);

使用zerofill

CREATE TABLE tab_int(
	t1 INT(6) ZEROFILL,
	t2 INT(6) ZEROFILL
);

长度限制,使用zerofill会在最左边填充0

INSERT INTO tab_int VALUES(43,43),(431121,430922)

SELECT  * FROM tab_int;--查询

小数

1.浮点型
float (M,D)
double(M,D)
2.定点型
dec(M,D)
decimal(M,D)

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

测试M和D

CREATE TABLE  tab_float(
	f1 FLOAT(6,2),
	f2 DOUBLE(6,2),
	f3 DECIMAL(6,2)

);
DROP TABLE tab_float; --清表

CREATE TABLE  tab_float(
	f1 FLOAT,
	f2 DOUBLE,
	f3 DECIMAL

);

精度取整

INSERT INTO tab_float VALUES(7352.00,5265.00,4520.00);

四舍五入

INSERT INTO tab_float VALUES(7352.454,5265.453,4520.455);

查看表结构

DESC tab_float

超出范围,插入临界值

INSERT INTO tab_float VALUES(73524.54,52654.53,45204.55);

查询

SELECT  * FROM tab_float

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

三、字符型

字符型
char 	代表固定长度的字符
varchar 代表可变长度的字符

其他:
binary 和varbinary 用于保存较短的二进制
enum 用于保存枚举
set 用于保存集合

char和varchar对比

字段类型写法M的意思特点空间的耗费效率
charchar(M)最大的字符数,可以省略,默认为1固定长度的字符比较耗费
varcharvarchar(M)最大的字符数,不可以省略可变长度的字符比较节省

枚举

CREATE TABLE tab_enum(
	e1 ENUM('a','b','c')
);

示例:

INSERT INTO tab_enum VALUES('a');
INSERT INTO tab_enum VALUES('b');
INSERT INTO tab_enum VALUES('c');
INSERT INTO tab_enum VALUES('e');
INSERT INTO tab_enum VALUES('A');
--查询
SELECT * FROM tab_enum;

set类型

CREATE TABLE tab_set(
	s1 SET('a','b','c')
);

示例:

INSERT INTO  tab_set VALUES('a');
INSERT INTO  tab_set VALUES('A,B');
INSERT INTO  tab_set VALUES('a,b,c');
--查询
SELECT * FROM tab_set;

四、日期型

分类:
date只保存日期
time 只保存时间
year 只保存年

datetime 保存日期+时间
timestamp 保存日期+时间

特点:

字段类型字节范围时区受的影响
datetime81000-9999不受
timestamp41970-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:非空,用于保证该字段的值不能为空
		比如:姓名、学号等
		default:默认,用于保证该字段有默认值
		比如:性别
		primary key:主键,用于保证该字段的值具有唯一性,并且非空
		比如:学号、员工编码等
		unique:唯一,用于保证该字段的值具有唯一性,可以为空
		比如:座位号
		check:检查约束【mysql中不支持】
		foreign key:外键,用于限制两个表的关系,用于保证该字段值必须来自于主表的关联列的值
		 在从表中添加外检约束,用于引用主表中的某列的值
		 
		 比如学生表的专业编号,员工表的部门编号,员工表的工种编号

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

约束的添加分类:
列级约束:
六大约束语法上都支持,但外键约束没有效果

表级约束:
除了非空、默认、其他都支持

create table 表名(
	字段名 字段类型 约束
);

主键和唯一的对比

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

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

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

一、创建表时添加约束

1.添加列级约束

语法:
直接在字段名和类型后面追加约束类型即可

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

CREATE TABLE shudent(
	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 shuinfo;

SHOW INDEX FROM shuinfo;

ALTER TABLE shudent RENAME TO shuinfo;

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)#唯一键
	CONSISTENT fk_stuinfo_ major FOREIGN KEY(majorId) REFERENCES major(id) #外键
);

方式二:创建表添加表级约束

CREATE TABLE stuinfo(

	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorId INT,
	
	  PRIMARY KEY (id),#主键
	  UNIQUE(seat),#唯一键
	  FOREIGN KEY(majorId) REFERENCES major(id) #外键
);

显示表索引

SHOW INDEX FROM stuinfo;

通用的写法

CREATE TABLE IF NOT EXISTS stuinfo(
	id INT PRIMARY KEY,
	stuname VARCHAR(20) NOT NULL,
	gender CHAR(1),
	age INT DEFAULT 18,
	seat INT UNIQUE,
	majorId INT,
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id)

);

二、修改表时添加约束

1.添加列级约束

alter table 表名 modify column 字段名 字段类型 新约束;

2.添加表级约束

alter table 表名 addconstraint 约束名】 约束类型(字段名) 【外键的引用】;
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo(
	id INT ,
	stuname VARCHAR(20) ,
	gender CHAR(1),
	age INT DEFAULT 18,
	seat INT UNIQUE,
	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 INT 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_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
DESC stuinfo;
SHOW INDEX FROM stuinfo;

三、修改表时删除约束

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 INDEX seat;

5.删除外键

ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
 
SHOW INDEX FROM sttuinfo;
  
 ALTER TABLE emp2 COLUMN id INT PRIMARY KEY;
 
 ALTER TABLE emp2 ADD CONSTRAINT pk_my_emp_id PRIMARY KEY (id); 

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

特点:
1、标识列必须和主键搭配吗?不一定,但要求是一个key
2、一个表可以有多个标识列?至多一个
3、标识列的类型只能是数值型
4、标识列可以通过set auto_increment_increment=3;设置步长

可以通过手动插入值,设置起始值

一、创建表时设置标识列

TRUNCATE TABLE tab_identity;	 
CREATE TABLE IF NOT EXISTS tab_identity(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	seat INT UNIQUE AUTO_INCREMENT 
	
);
INSERT INTO tab_identity VALUES(NULL,'Tom'),(NULL,'join');

SHOW VARIABLES LIKE '%auto_increment%';

SET auto_increment_increment = 3;

SELECT * FROM tab_identity;

二、修改表时设置标识列

ALTER TABLE tab_identity MODIFY COLUMN  id INT PRIMARY KEY AUTO_INCREMENT;

三、修改表时删除标识列

ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值