MySQL基础学习篇(4)——DDL

MySql基础学习

注明:文章笔记均来自哔哩哔哩视频学习

九、数据表操作

9.1 数据类型

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。对于我们约束数据的类型有很大的帮助。

9.1.1 数值类型
类型大小范围(有符号)范围(无符号)用途
INT4字节(-2147483648,2147483647)(0,4294967295)大整数值
DOUBLE8字节(-1.797E+308,-2.22E-308)0,(2.22E-308,1.797E+308)双精度浮点数值
DOUBLE(M,D)8字节,M表示长度,D表示小数位数同上,受M和D的约束;如DOUBLE(5,2) -999.99~999.99同上,受M和D的约束双精度浮点数值
DECIMAL(M,D)DECIMAL(M,D)依赖于M和D的值,M最大值为65依赖于M和D的值,M最大值为65小数值
9.1.2 日期类型
类型大小范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DETETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳
9.1.3 字符串类型
类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
BLOB(binary large object)0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
  • CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同,CHAR(N)会将多余的存储位以空格补足,而VARCHAR(N)则会根据实际存储长度进行“压缩”。在存储或检索过程中不进行大小写转换。
  • BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

9.2 数据表的创建(CREATE)

CREATE TABLE 表名(
    列名 数据类型 [约束],
    列名 数据类型 [约束],
    ......
    列名 数据类型 [约束]#最后一行的末尾不加逗号
)[CHARSET=UTF8]#可根据需要指定表的字符编码集

括号内的内容为可选。

9.2.1 创建表
列名数据类型说明
subject_idINT课程编号
subject_nameVARCHAR(20)课程时间
subject_hoursINT课程课长
#根据上述表格创建数据库,并向表中插入3条测试语句
CREATE TABLE `t_subject` (
  `subject_id` int,
  `subject_name` varchar(20),
  `subject_hours` int(11)
)CHARSET=utf8;

INSERT INTO t_subject(subject_id,subject_name,subject_hours) 
VALUES(1,'JAVA',40);
INSERT INTO t_subject(subject_id,subject_name,subject_hours) 
VALUES(2,'MYSQL',30);
INSERT INTO t_subject(subject_id,subject_name,subject_hours) VALUES(3,'JAVASCRIPT',20)

9.3 数据表的修改(ALTER)

语法ALTER TABLE 表名 操作;

9.3.1 向现有表中添加列
#在课程表基础上添加grade_id列
ALTER TABLE t_subject ADD grade_id INT;
9.3.2 修改表中的列
#修改课程表中的课程名称长度为10个字符
ALTER TABLE t_subject MODIFY subject_name VARCHAR(10);
  • 注意修改表中的某列时也要写全列的名字数据类型约束
9.3.3 删除表中的列
#删除课程表中grade_id列
ALTER TABLE t_subject DROP grade_id;
  • 注意删除列时每次只能删一列
9.3.4 修改列名
#修改课程表中subject_hours列为class_hours
ALTER TABLE t_subject CHANGE subject_hours class_hours INT;
  • 注意修改列名时在给定列新名称时要指定列的类型和约束
9.3.5 修改表名
#修改课程表的t_subject为t_sub
ALTER TABLE t_subject RENAME t_sub;

9.4 数据表的删除(DROP)

语法DROP TABLE 表名

9.4.1 删除课程表
#删除课程表
DROP TABLE t_sub;

十、约束

问题:在往已创建表中新增数据时,可不可以新增两行相同列的数据?如果可行,会有什么弊端?

这是可以的,但重复的数据不仅会浪费空间,而且对查询结果不利,也是多余的。在实际的存储中应尽量保证每条数据的唯一性。

10.1 实体完整性约束

表中的一行数据代表一个实体(entity),实体完整性的作用即是标识每一行数据不重复,实体唯一。

10.1.1 主键约束

关键词PRIMARY KEY唯一,标识表中的一行数据,此列的值不可重复,且不能为NULL。

#为表中适用主键的列添加主键约束
CREATE TABLE t_subject(
#课程标号标识了每一个课程的编号唯一,且不能为NULL
subject_id INT PRIMARY KEY,
subject_name VARCHAR(20),
subject_hours INT
)CHARSET=utf8;
INSERT INTO t_subject(subject_id,subject_name,subject_hours) VALUES(1,'JAVA',40);
#报错,主键subject_id不可重复
INSERT INTO t_subject(subject_id,subject_name,subject_hours) VALUES(1,'JAVA',40);

作为主键的字段一般都是也应该是编号、学号、工号等字段。

10.1.2 唯一约束

关键字UNIQUE唯一,标识表中的一行数据,不可重复,可以为NULL。

#为表中列值不允许重复的列添加唯一约束
ALTER TABLE t_subject MODIFY subject_name VARCHAR(20) UNIQUE;

INSERT INTO t_subject(subject_id,subject_name,subject_hours) VALUES(1,'JAVA',40);
#报错,课程名已存在
INSERT INTO t_subject(subject_id,subject_name,subject_hours) VALUES(2,'JAVA',40);
10.1.3 自动增长列

关键字:AUTO_INCREAMENT自动增长,给主键数值列添加自动增长。从1开始,每次加1。不能单独使用,和主键配合。

#为表中主键列添加自动增长,避免忘记主键ID序号
ALTER TABLE t_subject MODIFY subject_id INT AUTO_INCREMENT;
#课程ID自动增长为2
INSERT INTO t_subject ( subject_name, subject_hours ) VALUES( 'HTML5', 40 );

10.2 域完整性约束

该约束限制单元格的数据正确性。

10.2.1 非空约束

语法:NOT NULL,非空,此列必须有值

#课程名称虽然添加了唯一约束,但是有NULL值存在的可能,要避免课程名称为NULL。
ALTER TABLE t_subject MODIFY subject_name VARCHAR(20) NOT NULL;
#报错,课程名不能为空
INSERT INTO t_subject(subject_name,subject_hours) VALUES (NULL,40);
10.2.2 默认值约束

关键字DEFAULT 值。为列赋予默认值,当新增数据不指定值时,书写DEFAULT,以指定的默认值进行填充。

#当存储课程信息时,若课程时长没有指定值,则以默认值进行填充
ALTER TABLE t_subject MODIFY subject_hours INT DEFAULT 40;
#不写默认课程时为40,也可以把值写成DEFAULT
INSERT INTO t_subject(subject_name) VALUES('JAVAWEB');
10.2.3 引用完整性约束

语法CONSTRAINT 引用名 FOREIGN KEY (列名) REFERENCES 被引用表名(列名)

解释:FOREIGN KEY引用外部表某个列的值,新增数据时,约束此列的值必须是引用表中存在的值

#创建专业表
CREATE TABLE t_speciality(
	special_id INT PRIMARY KEY AUTO_INCREMENT,
	special_name VARCHAR(20) UNIQUE NOT NULL
)CHARSET=utf8;
#添加一些专业信息
INSERT INTO t_speciality(special_name) VALUES('HTML5');
INSERT INTO t_speciality(special_name) VALUES('JAVA');
INSERT INTO t_speciality(special_name) VALUES('JAVAWEB');
INSERT INTO t_speciality(special_name) VALUES('数据结构');
#subject_id引用special_id
ALTER TABLE t_subject ADD 
CONSTRAINT fk_subject_spacial FOREIGN KEY(special_id) REFERENCES t_speciality(special_id);
#添加数据成功
INSERT INTO t_subject(subject_name,special_id) VALUES('数据结构',4);
#添加失败,主表中不存在5
INSERT INTO t_subject(subject_name,special_id) VALUES('操作系统',5);
  • 注意当两张表存在引用关系时要执行删除操作一定要先删除从表引用表),再删除主表被引用表)。

10.3 约束创建整合

创建带有约束的表。

列名数据类型约束说明
grade_idINT主键、自动增长班级编号
grade_nameVARCHAR(20)唯一、非空班级名称
CREATE TABLE t_grade(
	grade_id INT PRIMARY KEY AUTO_INCREMENT,
	grade_name VARCHAR(20) UNIQUE NOT NULL
)CHARSET=utf8;
列名数据类型约束说明
student_idVARCHAR(20)主键学号
student_nameVARCHAR(20)非空姓名
sexCHAR(2)默认填充“男”性别
born_dateDATE非空生日
phoneVARCHAR(11)电脑
grade_idINT非空、外键约束引用班级表的grade_id班级编号
CREATE TABLE t_student(
	student_id VARCHAR(20) PRIMARY KEY,
	student_name VARCHAR(20) NOT NULL,
	sex CHAR(2) DEFAULT '男',
	born_date DATE NOT NULL,
	phone VARCHAR(11),
	grade_id INT NOT NULL,
	CONSTRAINT fk_student_grade FOREIGN KEY (grade_id) REFERENCES t_grade(grade_id)
)CHARSET=utf8;
  • 注意创建关系表时一定要先创建主键再创建从表
  • 删除关系表时先删除从表再删除主表
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值