【MySQL】基础
目录
1、数据类型
1.1、日期和时间类型
1.2、enum和set
2、表的约束
2.1、空属性
2.2、默认值(default)
2.3、列描述(comment)
2.4、zerofill
2.5、主键(primary key)
2.6、自增长(auto_increment)
2.7、唯一键(unique)
2.8、外键
1、数据类型
1.1、日期和时间类型
创建表:
mysql> create table birthday (t1 date, //日期t2 datetime, //日期时间t3 timestamp //时间戳);
插入数据:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1');
--插入两种时间

插入数据的时候,时间戳自动补上时间。更新数据时,时间戳也会更新时间。
1.2、enum和set
enum(枚举)是单选(多选一),插入的数据必须是枚举值中的一个,可以使用下标进行插入数据,并且下标是从1开始。
set(集合)是多选(多选一或多选),这个是位图不是下标;
mysql> create table votes(
-> username varchar(30),
-> hobby set('登山','游泳','篮球','武术'), --注意:使用数字标识每个爱好的时候,想想
Linux权限,采用比特位位置来个set中的爱好对应起来
-> gender enum('男','女'));
使用find_in_set‘可以查询出所有爱好包含羽毛球的人
select * from votes where find_in_set('羽毛球’,bobby);
2、表的约束
表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库中的数据是符合预期的。约束本质是通过技术手段,倒逼程序员,插入正确的数据。反过来,站在mysql的视角,凡是插入进来的数据,都是符合数据约束的。
2.1、空属性
创建一个班级表,包含班级名和班级所在的教室。站在正常的业务逻辑中:如果班级没有名字,你不知道你在哪个班级如果教室名字可以为空,就不知道在哪上课所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。
2.2、默认值(default)
某个数据会经常性的出现某个具体的值,可以在一开始就制定好,需要数据的时候用户可以进行选择性的使用默认值。

默认值生效就是在插入数据的时候对此列不进行插入。
2.3、列描述(comment)

desc不能看到列描述

show create table 表名\G 可以看到列描述

2.4、zerofill

字符串类型---char、varchar 括号里的数字=存储的最大字符数(存储限制)
数值类型---- int 、bigint 括号里的数字=显示宽度(仅影响显示,不影响存储)
decimal(m,n)是特殊数值类型:m和n限制数值的总位数和小数位数(影响存储和精度)。
2.5、主键(primary key)
有了主键,表中就不会出现相同的两行数据。
但是主键的唯一性约束只针对主键字段本身,而不是整行所有字段-----主键不同,但是其他列相同,表也是允许插入的。
创建唯一性约束:
如果你不希望出现任何业务数据重复的行,正确的做法不是单靠主键,而是给所有需要保证唯一的列创建一个
UNIQUE约束。ALTER TABLE 学生表 ADD CONSTRAINT unique_student_info UNIQUE (学号, 姓名, 年龄);
2.6、自增长(auto_increment)
当对应的字段不给值,就会自动被系统触发,会从当前的最大值+1,得到一个新的值,通常和主键搭配使用,作为逻辑主键。
索引:主键是身份证,索引就是目录。

主键和索引的关系,主键都是索引但是并非索引都是主键。
主键是身份证,索引就是目录
主键和索引的关系:
1、主键首先是一个“唯一且非空”的索引,然后他还被赋予了“唯一标识符“这个身份。
2、创建主键时,数据库在做什么??
当你为一张表创建了一个主键,数据库会隐式创建一个唯一索引;强制实施主键约束(确保所有插入和更新的数据都满足唯一且非空的条件)
我们不需要手动再为主键创建一个索引,因为他已经自带了。
3、为什么通过主键查询最快?
主键自带索引
4、选择合适的主键:因为主键自带索引,因此选择一个短小、连续、不经常更改的列作为主键对性能非常有利。
2.7、唯一键(unique)
一张表中只能有一个主键,但是往往有很多字段需要唯一性,数据不能重复。唯一键就能解决表中有多个字段需要唯一性约束的问题。
唯一键不能重复,但可以为空
唯一键和主键的区别:
主键更多的是标识唯一性。而唯一键更多的是保证在业务上,不要和别的出现重复。eg:员工管理系统---身份号(主键)和员工工号(唯一键),员工工号不能重复。
一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。
2.8、外键
外键用于定义主表和从表之间的关系,外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。
当定义外键后,要求外键列数据必须在主表的主键列存在或为null
主表中被外键关联的列(通常是主键,但可以是具有唯一约束的列)
通常情况下,外键关联主表的主键。
---实际业务中,外键几乎都是关联主表的主键(PRIMARY KEY)。因为主键本身具有唯一性和非空性,能确保被关联的列值是唯一且确定的,符合外键对 “关联目标必须唯一可识别” 的要求。
特殊情况,外键也可以关联主表的唯一键(unique)
---数据库允许外键关联主表中具有唯一约束(UNIQUE)且非空(NOT NULL)的列(即唯一键)。因为唯一键也能保证列值的唯一性,满足外键关联的 “目标值必须唯一存在” 的核心需求。
简单来说,外键约束就是数据库用来维护现实世界中各种关系(如母子关系、部门-员工关系、订单-商品关系)不出现逻辑错误的核心机制。
查询结果去重:





