MySQL学习笔记——DDL

DDL

  • 库和表
    • myemployees表
    • girls表
    • student表
  • DDL
    • 数据类型
    • 库和表的操作
    • 标识列
    • 约束

MySQL源码

库和表

MySQL学习笔记——DDL_第1张图片

myemployees表

MySQL学习笔记——DDL_第2张图片

girls表

MySQL学习笔记——DDL_第3张图片

student表

MySQL学习笔记——DDL_第4张图片

DDL

数据类型

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

*/
#一、整型
/*
分类:
	tinyint(1字节),smallint(2),mediumint(3),int/integer(4),bigint(8)
 
特点:
	(1)如果不设置有符号还是无符号,默认是有符号
	   若想设置为无符号,应在数据类型后添加 unsigned
	(2)如果插入的数值超过了整型的范围,会报out of range异常,并插入临界值
	(3)如果不设置长度,会使用默认长度,长度表示数据在结果单元格中显示的最
	   大宽度,如果宽度不够,会使用0在左边填充,若想让填充的0显示出来,必
	   须搭配 zerofill 使用,但此时数据类型自动变成无符号。例如int(7),结
	   果为123,若在显示结果的单元格中123的左边有4个隐藏的0,若想让0显示,
	   则要在声明int时,书写 int(7) zerofill
	   	   
*/
#1.如何设置有符号值和无符号值
CREATE TABLE IF NO EXISTS test (t1 INT, t2 INT UNSIGNED) ;#t1有符号,t2无符号
#二、小数
/*
分类:
	(1)浮点型
		float(M, D), double(M, D)
		
	(2)定点型
		dec(M, D), decimal(M, D)

特点:
	(1)M代表总位数,D代表小数位数,插入的数值如果超过范围,则插入临界值
	(2)M和D可以省略,对于decimal,默认(10, 0),对于float和double会根据插入值的精度自动变化
	(3)定点型的精度较高,如果要求插入数值的精度较高,如货币,则可以考虑使用

*/
/*
选择数据类型的原则:
	选择的数据类型越简单越好,能保存数值的范围越小越好,节省空间

*/

#三、字符型
/*
较短的文本:
	char(M):
		固定长度的字符,M一旦指定,开辟的空间也就固定了,尽管数据没有占用全部空间
	varchar(M):
		可变长度的字符,M只规定了最大字符数,若数据占用2个字符,则只开辟2个字符空间
	M表示能存储的最多字符数,一个字母或一个汉字都是一个字符

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

补充
	enum:枚举,插入的数据只能是枚举列表中的某一个
	enum('', '', ...)
	取值固定时可以使用,例如性别、四季等
	
	set:集合,插入的数据可以是集合列表中的某一个或多个
	set('', '', ...)
	
	enum和set对插入的数据不区分大小写
	
*/
#案例1:演示枚举
CREATE TABLE test2 (
  t2 ENUM ('a', 'b', 'c'),
  sex ENUM ('男', '女')
) ;
INSERT INTO test2 VALUES('a','女');
INSERT INTO test2 VALUES('c','男');

#案例2:演示枚举
CREATE TABLE test3 (t3 SET ('a', 'b', 'c')) ;
INSERT INTO test3 VALUES('a');
INSERT INTO test3 VALUES('a,b');
INSERT INTO test3 VALUES('a,b,c');

#四、日期型
/*
分类:
	date:2020-10-04
	time:22:17:34
	datetime:2020-10-04 22:17:34
	timestamp(时间戳):20201004221734
	year:2020

特点:
		       字节		范围		受时区影响
	datetime	8	1000-1-1~9999-12-31	    否
	timestamp	4	19700101080001~2038	    是

*/

库和表的操作

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

一、库的管理
	创建、修改、删除
二、表的管理	
	创建、修改、删除
	
创建:create
修改:alter
删除:drop

*/
#一、库的管理
/*
1.库的创建
	create database [if not exists] 库名 ;

2.库的修改(修改字符集)
	alter database 库名 character set 字符集 ;
	
3.库的删除
	drop database [if exists] 库名 ;
	
*/
#案例1:创建图书库
CREATE DATABASE books ;
CREATE DATABASE IF NOT EXISTS books ;

#案例2:修改books库的字符集
ALTER DATABASE books CHARACTER SET gbk ;

#案例3:删除books库
DROP DATABASE books ;
DROP DATABASE IF EXISTS books ;

#二、表的管理
/*
1.表的创建
	create table [if not exists] 表名(
		列名 列的类型[(长度) 约束], 
		列名 列的类型[(长度) 约束],
		...
		) ;

2.表的修改
	(1)修改列名:
		alter table 表名 change [column] 列名 新列名 类型 [约束] ;
	(2)修改列的类型或约束
		alter table 表名 modify column 列名 新类型 [约束];
	(3)添加列
		alter table 表名 add column 新列名 类型 [约束];
	(4)删除列
		alter table 表名 drop column 列名 ;
	(5)修改表名
		alter table 表名 rename to 新表名 ;
	
3.表的删除
	drop table [if exists] 表名 ;
	
4.表的复制
	(1)复制表的结构(只复制字段名,不复制数据)
		create table 表名 like 要复制的表名 ;
	(2)复制表的结构和数据
		create table 表名 select * from 要复制的表名 ;
	(3)复制表的指定列的数据
		见案例11
	(4)复制表的部分结构
		见案例12
	
*/
#案例1:在books库中创建book表
CREATE TABLE book (
  #编号
  id INT,
  #书名
  book_name VARCHAR (20),
  #价格
  price DOUBLE,
  #作者编号,实现与author表连接
  author_id INT,
  #出版日期
  public_date DATETIME
) ;

#案例2:在books库中创建author表
CREATE TABLE author (
  #编号
  author_id INT,
  #姓名
  author_name VARCHAR (20),
  #国籍
  nation VARCHAR (10)
) ;

#======================================================

#案例3:修改author表中的author_id为id
ALTER TABLE author CHANGE COLUMN author_id id INT ;

#案例4:修改book表中public_date的类型为timestamp
ALTER TABLE book MODIFY COLUMN public_date TIMESTAMP ;

#案例5:在author表中添加字段年薪,类型为double
ALTER TABLE author ADD COLUMN annual_salary DOUBLE ;

#案例6:删除author表中的年薪字段
ALTER TABLE author DROP COLUMN annual_salary ;

#案例7:修改author表为authors表
ALTER TABLE author RENAME TO `authors`;

#案例8:删除author表
DROP TABLE author ;
DROP TABLE IF EXISTS author ;

#======================================================

#向author表中插入数据
INSERT INTO author (id, author_name, nation) 
VALUES
  (1, '村上春树', '日本'),
  (2, '莫言', '中国'),
  (3, '金庸', '中国') ;

#案例9:创建表copy,该表具有和author表一样的结构
CREATE TABLE copy LIKE author ;

#案例10:创建表copy2,该表具有和author表一样的结构和数据
CREATE TABLE copy2 SELECT * FROM author ;

#案例11:创建表copy3,该表具有author表中国籍为中国的作者的id和author_name数据
CREATE TABLE copy3 
SELECT 
  id,
  author_name 
FROM
  author 
WHERE nation = '中国' ;

#案例12:创建表copy4,该表具有author表中字段id和author_name的结构,而没有数据
CREATE TABLE copy4 
SELECT 
  id,
  author_name 
FROM
  author 
WHERE 0 ;

标识列

#标识列
#一、创建表时设置自增长列
/*
又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值
方法:在声明列时添加 auto_increment
特点:
	(1)为自增长列赋值时:
		a.不指定列名,不需要赋值 (name) values ('')
		b.指定列名,赋值为null (id, name) values (null, '')
		
	(2)设置自增长列起始值
		插入第一条数据时指定值,插入第二条数据时不指定值
		例如从id从10开始:
		(id, name) values (10, '') ;
		(id, name) values (null, '');
		
	(3)设置自增长列的步长(每次增长的值),例如2
		set auto_increment_increment = 2 ;
		
	(4)标识列必须和主键搭配吗?
	   不必须,但标识列必须和key搭配(如主键、唯一键、外键等)
	   
	(5)一个表中只能有一个标识列
	
	(6)标识列的类型只能是数值型(int, float, double等)
		
*/

#二、修改表时添加和删除标识列
/*
语法:
	(1)添加标识列
	alter table 表名 modify column 列名 类型 auto_increment ;
	
	(2)删除标识列
	alter table 表名 modify column 列名 类型 ;

*/
#1.添加标识列
ALTER TABLE student_info MODIFY COLUMN id INT AUTO_INCREMENT ;

#2.删除标识列
ALTER TABLE student_info MODIFY COLUMN id INT ;

DESC student_info;

约束

#常见约束
/*
约束:
	一种限制,用于限制表中的数据,以保证添加到表中的数据的准确性和可靠性
	
分类:六大约束
	(1)not null:非空,用来保证该字段的值不能为空
	(2)default:默认,用来保证该字段有默认值
	(3)primary key:主键,用来保证该字段的值具有唯一性,并且非空
	(4)unique:唯一,用来保证该字段的值具有唯一性,但可以为空
	(5)check:检查,MySQL不支持
	(6)foreign key:外键,需要搭配 references 使用,用于限制两个表之间的关系,
			保证该字段的值必须来自于主表中关联字段的值,外键约束要添加在从表中,
			例如学生表的专业编号、员工表的部门编号等
			
添加约束的时机:
	(1)创建表时
	(2)修改表时
	一定是在添加数据之前添加约束
	一个字段可以添加多个约束
	
约束的添加分类:
	(1)列级约束:除了检查和外键
		create table [if not exists] 表名(
			列名 列的类型(长度) 列级约束, 
			列名 列的类型(长度) 列级约束,
			...
			) ;
	(2)表级约束:除了非空和默认,关键字 constraint
		create table [if not exists] 表名(
			列名 列的类型(长度) 列级约束, 
			列名 列的类型(长度) 列级约束,
			... ,
			表级约束
			) ;
					
*/
#创建测试用数据库
CREATE DATABASE test_student ;

#一、创建表时添加列级约束
CREATE TABLE stuInfo (
  #主键约束
  id INT PRIMARY KEY,
  #非空约束
  stuName VARCHAR (20) NOT NULL,
  #检查约束
  gender CHAR CHECK (gender IN ('男', '女')),
  #gender enum('男','女')
  #唯一约束
  seat INT UNIQUE,
  #默认约束
  age INT DEFAULT 18,
) ;

CREATE TABLE major (
  id INT PRIMARY KEY,
  majorName VARCHAR (20) NOT NULL
) ;

DESC stuinfo ;

#查看表中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo ;

#二、创建表时添加表级约束
/*
语法:
	在各个字段的最下面
	[constraint 自定义的约束名] 约束类型 (字段名)
	
	其中,外键:
	[constraint 自定义的约束名] foreign key (字段名) references (主表中相关字段名)
	
	若省略自定义的约束名,则该约束默认起名为字段名,但主键约束始终为primary,不会改变

*/
DROP TABLE IF EXISTS stuinfo ;

CREATE TABLE stuInfo (
  id INT,
  stuName VARCHAR (20),
  gender CHAR,
  seat INT,
  age INT,
  majorId INT,
  #添加表级约束
  #主键
  CONSTRAINT pk PRIMARY KEY (id),
  #唯一
  CONSTRAINT uq UNIQUE (seat),
  #外键
  CONSTRAINT fk_studInfo_major FOREIGN KEY (majorId) REFERENCES major (id) #外键 
) ;

SHOW INDEX FROM stuinfo;

#标准写法:一般将外键放在表级约束,其他约束都设置为列级约束
CREATE TABLE stuInfo (
  #主键
  id INT PRIMARY KEY,
  #非空
  #一个字段可以添加多个约束
  stuName VARCHAR (20) NOT NULL UNIQUE,
  gender ENUM('男','女'),
  #唯一
  seat INT UNIQUE,
  #默认
  age INT DEFAULT 18,
  #外键
  PRIMARY KEY(majorID) REFERENCES major(id)
) ;

#三、主键和唯一的对比
/*
	唯一性	    是否可以为空	一个表中可以有多少个	是否允许组合
	
主键	  是	         否	              0个或1个		     是

唯一	  是	是(但只能有一个为null)	        多个		     是

*/

#四、外键的注意事项
/*
1.在从表中设置外键约束
2.从表的外键列的类型要与主表的关联列的类型一致或兼容,名称无要求
3.主表的关联列必须设置了key(一般为主键或唯一键)
4.插入数据时,先插入主表数据,再插入从表数据;
  删除数据时,先删除从表数据,再删除从表数据
*/

#五、修改表时添加约束
/*
语法:
	(1)添加列级约束
	alter table 表名 modify column 列名 类型 添加的约束 ;
	
	(2)添加表级约束
	alter table 表名 add 添加的约束(列名) ;
	alter table 表名 add constraint 自定义的约束名 添加的约束(列名) ;

*/
CREATE TABLE student_info (
  id INT,
  NAME VARCHAR (20),
  age INT,
  seat INT,
  majorid INT
) ; 
#1.添加非空约束
ALTER TABLE student_info 
  MODIFY COLUMN `name` VARCHAR (20) NOT NULL ;

#2.添加默认约束
ALTER TABLE student_info 
  MODIFY COLUMN age INT DEFAULT 18 ;

#3.添加主键
#(1)列级
ALTER TABLE student_info 
  MODIFY COLUMN id INT PRIMARY KEY ;
#(2)表级
ALTER TABLE student_indo ADD PRIMARY KEY (id) ;

#4.添加唯一
#(1)列级
ALTER TABLE student_info 
  MODIFY COLUMN seat INT UNIQUE ;
#(2)表级
ALTER TABLE student_info ADD UNIQUE(seat) ;

#5.添加外键
#表级
ALTER TABLE student_info 
  ADD FOREIGN KEY (majorid) REFERENCES major (id) ;
#添加约束名
ALTER TABLE student_info 
  ADD CONSTRAINT fk_studentinfo_major FOREIGN KEY (majorid) REFERENCES major (id) ;

#五、修改表时删除约束
/*
语法:
	(1)删除非空和默认
	alter table 表名 modify column 列名 类型 ;
	
	(2)删除主键、唯一和外键
	alter table 列名 drop primary key ;
	alter table 列名 drop index|foreign key 自定义的约束名 ;

*/
#1.删除非空约束
ALTER TABLE student_info MODIFY COLUMN `name` VARCHAR(20) NULL ;#null可以省略

#2.删除默认约束
ALTER TABLE student_info MODIFY COLUMN age INT ;

#3.删除主键
ALTER TABLE student_info DROP PRIMARY KEY ;

#4.删除唯一
ALTER TABLE student_info DROP INDEX seat ;#seat是唯一键名,没有自定义时默认字段名

#5.删除外键
ALTER TABLE student_info DROP FOREIGN KEY fk_studentinfo_major ;

你可能感兴趣的:(笔记,mysql,sql)