数据库
首页 > 数据库> > MySQL基本数据类型与约束条件

MySQL基本数据类型与约束条件

作者:互联网

昨日内容回顾

# 方向:
	朝着更加统一和方便管理
# 由本地保存逐步演变为线上保存
# 本质上就是一款CS架构的软件

"""
数据库:
	在不同场景可能对应不同的解释
"""
# 1.关系型数据库
	有固定的表结构
	表与表之间可以可以建立代码层面的关系
	MySQL Oracle PostgreSQL MariDB sqlite db2 access sql server...

# 2.非关系型数据库
	没有固定的表结构
	数据存储全部采用 K:V 键值对的形式
	radis mongodb memcache...
# MySQL版本:
	5.6 Windows学习推荐
	5.7 目前企业正在过度
	8.0 Mac本可以直接安装
    
# 直接访问官网一步步下载

bin文件夹
	mysqld.exe		服务端
	mysql.exe		客户端
    
data文件夹

mydefault.ini

readme

# 简单的试试
	cd切换到bin路径下
		先启动服务端mysqld
		在启动客户端mysql
1.环境变量的添加

2.系统服务制作(开机自启)
	mysqld --install
	net start mysql
	net stop mysql
	musqld --remove
# 库:文件夹

# 表:文件

# 记录:文件内的一行行数据
# 1.针对库的
	create database 库名;  # 创建库
	show databases;  # 查看所有库
	show create database 库名;  # 定向查看某个库
	alter database 库名 charset='gbk';  # 修改库编码
	drop database 库名;  # 删除库
    
	select database();  # 查看当前所在的库名
	use 库名;  # 切换到指定库
    
    
# 2.针对表的
	create table 表名(字段名1 字段类型,字段名2 字段类型);  # 创建表
	show tables;  # 查看当前库下所有的表
	show create table 表名;  # 查看指定的表
	describe 表名;  # 查看表的具体信息
	desc 表名;  # 查看表的具体信息(简写)
	alter table 原表名 rename 新表名;  # 修改表名
	alter table 表名 change 原字段名 新字段名 新类型;  # 同时修改字段名和类型
	alter table 表名 modify 字段名 新字段类型;  # 单独修改字段类型
	drop table 表名;  # 删除表
    
    
# 3.针对记录的
	insert into 表名 values(数据,数据,数据);  # 添加单条数据
	insert into 表名 values(),(),();  # 添加多条数据
	select * from 表名;  # 查看表中的所有数据内容
	update 表名 set 字段名='新数据' where 筛选条件
	delete from 表名 where 筛选条件;  # 删除记录内容
# \s 查看基本配置信息

# MySQL5.6版本默认的内部编码不是统一的 可能会造成乱码问题

# 解决乱码问题:
	主要以 mydefault.ini 及创建其副本并命名为 my.ini 
	具体配置内容直接拷贝

今日内容概要

内容详细

1.存储引擎

# 1.存储引擎可以堪称是处理数据的不同方式

# 2.查看存储引擎的方式
	show engines;
    
# 3.需要掌握的四个存储引擎
	MyISAM
    	MySQL5.5之前默认的存储引擎
        不支持事务、行级锁和外键 针对数据的操作较于InnoDB不够安全
        但数据的存取速度较于InnoDB更快
        
	InnoDB
		MySQL5.5之后默认的存储引擎
		支持事务、行级锁和外键 针对数据的操作更加的安全
    
	BLACKHOLE
		写入其中的数据都会立刻消失 类似于垃圾处理站    
    
	MEMORY  
		基于内存存取数据
		速度最快 但是一旦断电立刻丢失
        
        
# 4.存储引擎创建表的不同点
	create table t1(id int) engine=myisam;
	create table t2(id int) engine=innodb;
	create table t3(id int) engine=memory;
	create table t4(id int) engine=blackhole;
"""
MyISAM会创建三个文件:
	.frm	表结构文件
	.MYD	表数据文件
	.MYI	表索引文件(索引是用来加快数据查询的)
	
InnoDB会创建两个文件:
	.frm	表结构文件
	.ibd	表数据和表索引文件
	
memory会创建一个文件:
	.frm	表结构文件

blackhole会创建一个文件:
	.frm	表结构文件
"""

image

image

2.MySQL基本数据类型之整型与浮点型

# 1.整型
	tinyint smallint int bigint
	不同的int类型能够存储的数字范围是不一样的
"""
1.要注意是否存负数(正负号需要占一个比特位)
2.针对手机号码只能用bigint

3.是否需要正负号
	create table t5(id tinyint);
	insert into t5 values(-999),(999);
	结论:所有的int类型默认都需要正负号


	create table t6(id tinyint unsigned);  # 移除正负号
	insert into t6 values(-999),(999);
"""


# 2.浮点型
	float double decimal
	float(255,30)  # 总共255位 小数位占30位
	double(255,30)  # 总共255位 小数位占30位
	decimal(65,30)  # 总共65位 小数位占30位
"""
三者不同之处:
	create table t7(id float(255,30));
	create table t8(id double(255,30));
	create table t9(id decimal(65,30));
	
	insert into t7 values(2.222222222222222222222222);
	insert into t8 values(2.222222222222222222222222);
	insert into t9 values(2.222222222222222222222222);
	结论:三者的精确度不一样
		float < double < decimal
		
		
至于到底使用哪个:
	一般情况下 小数点后面只保留两位 float就足够了
	如果从事高精密行业 可以考虑更高精确度
	
有时候很多看似需要用数字存储的数据 可能都是存的字符串
字符串没有精确度一说

python本身对数字的精确度很低 之所以能够从事人工智能和数据分析完全得益于功能强大的模块
"""

image

image

image

3.MySQL基本数据类型之字符类型

# char(4)
	定长类型  最多只能存四个字符 多了报错少了自动空格填充至四个
    
# varchar(4)
	变长类型  最多只能存四个字符 多了报错少了有几个则存几个
    
# 多了报错特性
	create table t10(id int, name char(4));
	create table t11(id int, name varchar(4));
	insert into t10 values(111,'jason')
	insert into t11 values(222,'jason')
	
针对5.6版本超出范围不会报错 而是自动帮你截取并保存(此行为不合理)
	解决方式1:修改配置文件(永久 不推荐)
	解决方式2:命令修改(暂时)
		1. show variables like '%mode%';
		2. set global sql_mode = 'strict_trans_tables';
		set session  # 当前窗口有效
		set global  # 当前服务端有效
		修改完毕后退出客户端重新进入即可
		
		再次执行插入文本指令 直接报错


# 定长与变长特性
	insert into t1o values(333,'k');
	insert into t11 values(444,'l');
	"""    
	此时看不出不同
	可以利用统计某个字段数据的长度  char_length()
	select char_length(name) from t10 where id=333;
	底层确实会填充  但是取出来的时候又会自动去除
	加上下面指令后 退出重新进入客户端再进行验证即可:
	set global sql_mode = 'strict_trans_tables,pad_char_to_full_length';
    """

image

image

image

4.char与varchar的对比

# char
	优势:整存整取 速度快
	劣势:浪费存储空间
        
# varchar
	优势:节省存储空间
	劣势:存取数据的速度较char慢
"""
char(5) 存五位 取五位
	jasontony kevintom  oscartank sean jerry
	
varchar(5)
	1bytes+jason1bytes+tony1bytes+kevin1bytes+tom
	存:先计算数据的长度
	取:先获取报头的数据
"""

# 以前几乎都是char 现在很多情况下使用varchar
	进了公司之后 会通过邮件告诉你每个字段的英文名和中文名及类型等项目的诸多信息
    
# 补充:在创建字段的时候可以加上相应的注释
	create table t12(
		id int comment '序号',
		name char(4) comment '姓名'
	);

5.整型中括号内数字的作用

create table t13(id int(3));
insert into t13 values(555555555);
"""
在整型中括号内的数字并不是用来限制存储的长度 而是用来控制展示的长度

我们以后在定义整型字段的时候 不需要自己添加数字 使用默认的就可以
"""

create table t14(id int(3) zerofill);
insert into t13 values(4);
# 结论:整型比较的特殊 括号中的数字是唯一一个不是用来限制存储长度的类型

image

6.枚举与集合类型

# 枚举
	多选一 关键字:enum()
create table user(
	id int,
	name varchar(32),
	gender enum('male','female','others')
);
insert into user values(1,'jason','男');  # 报错
insert into user values(2,'jason','male');  # 正常


# 集合
	多选多(包含多选一) 关键字:set()
create table userinfo(
	id int,
	name char(16),
	hobby set('ball','girl','man','others')
);

image

image

7.日期类型

# date	年月日

# datetime	年月日时分秒

# time	时分秒

# year	年份

create table client(
	id int,
	name varchar(36),
	reg_time date,
	bieth datetime,
	study_time time,
	join_time year
);
insert into client values(1,'jason','2021-11-11','2021-12-12 12:12:00','12:12:00',2022);

image

8.创建表的完整语法

create table 表名(
	字段名1 字段类型(数字) 约束条件,
	字段名2 字段类型(数字) 约束条件,
	字段名3 字段类型(数字) 约束条件
);
"""
1.字段名和字段类型时必须的
2.数字和约束条件是可选的 并且 约束条件可以有多个 中间空格隔开即可
3.最后一个语句的结尾一定不要加逗号!!!
"""

9.约束条件之not null

# 约束条件相当于是在字段类型的基础之上 添加的额外约束
	例:id int unsigned
    
# unsigned	让数字没有正负号

# zerofill	多余的使用数字0填充

# not null	非空
ceeate table t2(
	id int,
	name varchar(36) not null
);


"""
新增表数据的方式:
	方式一:
		按照字段顺序一一传值
		insert into t1 values(1,'jason');
		
	方式二:
		自定义传值顺序 或者不传值
		insert into t1(name,id) values('jason',1);
		insert into t1(id) values(1)
		在MySQL中不传数据 会使用关键字NULL填充意思就是空 类似于python的None
"""

image

10.约束条件之default

# default	默认值
	所有的字段都可以设置默认值 
	用户不给该字段传值则使用默认的 否则使用传了的
    
create table t1(
	id int default 911,
	name varchar(16) default 'jason'
);

image

11.约束条件之unique

# unique	唯一值

# 单列唯一
create table t2(
	id int,
	name varchar(32) unique
);
"""添加重复的name值时就会报错"""


# 联合唯一
create table t3(
	id int,
	host varchar(32),
	port int,
	unique(host,port)
);
"""
host 和 port两项合在一起值不能重复
"""

image

image

12.约束条件之primary key与auto_increment

# primary key	主键
	单从约束层面上来说 相当于 not null + unique  # 非空且唯一
	在此基础之上还可以加快数据的查询
    
"""
# InnoDB存储引擎规定了 一张表必须有且只有一个主键
	因为InnoDB是通过主键的方式来构造表的
	如果没有设置主键
    
	情况1:没有主键和其他约束条件
		InnoDB会采用隐藏的字段作为主键 不能加快数据的查询
		
	情况2:没有主键但是有非空且唯一的字段
		自动将该字段升级为主键	
		create table t4(
			id int,
			age int not null unique,
			pwd int not null unique
		);
# 结论:
	以后我们在创建表的时候一定要设置主键
	并且主键字段一般都是表的id字段(例:uid sid pid cid)
	例如:
		create table user(
			id int primary key,
			name varchar(32)             
		);
"""
    
    
# auto_increment	自增(只能给主键用)
"""
由于主键类似于数据的唯一标识 并且主键一般都是数字类型
我们在添加数据的时候不可能记住接下来的序号是多少 太麻烦

create table user1(
	id int primary key auto_increment,
	name varchar(32)
);
"""

image

image

image

13.自增的特性

# 自增不会因为删除操作而回退
	delete from无法影响自增
    
# 如果想要重置需需要使用truncate关键字
	truncate 表名  # 清空表数据并且重置主键值

image

image

标签:约束条件,insert,int,create,数据类型,values,MySQL,table,id
来源: https://www.cnblogs.com/jgx0/p/15911484.html