【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.5、主键(primary key))

2.6、自增长(auto_increment))

2.7、唯一键(unique)

2.8、外键


1、数据类型

1.1、日期和时间类型

创建表:

bash 复制代码
mysql> create table birthday (
    t1 date,   //日期
    t2 datetime, //日期时间
    t3 timestamp //时间戳
    );

插入数据:

bash 复制代码
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); 
--插入两种时间

插入数据的时候,时间戳自动补上时间。更新数据时,时间戳也会更新时间。

1.2、enum和set

enum(枚举)是单选(多选一),插入的数据必须是枚举值中的一个,可以使用下标进行插入数据,并且下标是从1开始。

set(集合)是多选(多选一或多选),这个是位图不是下标;

bash 复制代码
mysql> create table votes(
-> username varchar(30),
-> hobby set('登山','游泳','篮球','武术'), --注意:使用数字标识每个爱好的时候,想想
Linux权限,采用比特位位置来个set中的爱好对应起来
-> gender enum('男','女'));

使用find_in_set'可以查询出所有爱好包含羽毛球的人

bash 复制代码
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) 是特殊数值类型:mn 限制数值的总位数和小数位数(影响存储和精度)。

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)的列(即唯一键)。因为唯一键也能保证列值的唯一性,满足外键关联的 "目标值必须唯一存在" 的核心需求。

简单来说,外键约束就是数据库用来维护现实世界中各种关系(如母子关系、部门-员工关系、订单-商品关系)不出现逻辑错误的核心机制。

查询结果去重:

相关推荐
ooooooctober2 小时前
PHP代码审计框架性思维的建立
android·开发语言·php
q***82913 小时前
图文详述:MySQL的下载、安装、配置、使用
android·mysql·adb
沐怡旸4 小时前
【底层机制】Ashmem匿名共享内存:原理与应用深度解析
android·面试
用户2018792831675 小时前
Activity结束动画与System.exit(0)的黑屏之谜
android
Proud lion5 小时前
Apipost 脚本高频场景最佳实践:搞定接口签名验证、登录令牌刷新、动态参数生成等
android
介一安全6 小时前
【Frida Android】实战篇5:SSL Pinning 证书绑定绕过 Hook 教程(二)
android·网络安全·逆向·安全性测试·frida
2501_937193146 小时前
PLB-TV 影视!无广告 + 4K 高清
android·源码·源代码管理·机顶盒
阿斌_bingyu7096 小时前
uniapp实现android/IOS消息推送
android·ios·uni-app
Android系统攻城狮6 小时前
Android内核进阶之周期更新PCM状态snd_pcm_period_elapsed:用法实例(九十二)
android·pcm·android内核·音频进阶