MySQL 基础语句

目录

一.字符编码与配置文件

字符编码与配置文件
\s

统一字符编码
X默认编码有多种 可能会导致乱码的情况 所以应该统一编码
my-default.ini配置文件

步骤1:拷贝一份该配置文件并修改名称为my.ini
步骤2:清空my.ini文件内的内容
步骤3:添加固定的配置信息即可

[mysqld]     character-set-server=utf8     collation-server=utf8_general_ci     [client]     default-character-set=utf8     [mysql]     default-character-set=utf8 

步骤4:保存并重启服务端即可生效
net stop mysql 关闭服务器
net start mysql 启动服务器

二.存储引擎

存储引擎可以理解为处理数据的不同方式

查看存储引擎
show engines;

5.1之前版本MySQL默认的存储引擎
MyISAM : 存取数据的速度快 但是功能很少 安全性较低

5.1之后版本MySQL默认的存储引擎
InnoDB : 有诸多功能 安全性较高 存取速度没有MyISAM快

BlackHole : 任何写入的数据都会立刻消失

Memory : 以内存作为数据存取地 速度快但是断电立刻丢失

自定义选择存储引擎

create table t1(id int)engine=myisam\innob\blackhole\memory;

三.创建表的完整语法

create table 表名 (字段名1 字段类型(数字) 约束条件)

1.字段名与字段类型是必须的
2.数字和约束条件是可选择的(不加也行有的默认)
3.约束条件可以写多个 空格隔开
4.在创建多行字段 需逗号隔开 最后一样不能加逗号

create table 表名 (字段名1 字段类型(数字) 约束条件,                    字段名2 字段类型(数字) 约束条件,                                          字段名3 字段类型(数字) 约束条件, 不可以加逗号 )  

四.字段类型之整型

tinyint        1bytes smallint       2bytes int            4bytes bigint         8bytes 

上述整型的区别在于从上往下能够存储的数字范围越来越大

根据占用字节数可以求出每一种数据类型的取值范围。例如,TINYINT 需要 1 个字节(8bit)来存储,那么 TINYINT 无负号数的最大值为 28-1,即 255;TINYINT 有负号数的最大值为 27-1,即 127。其他类型的整数的取值范围计算方法相同,如下表所示。

注意:显示宽度和数据类型的取值范围是无关的。显示宽度只是指明 MySQL 最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充。如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。

其他整型数据类型也可以在定义表结构时指定所需的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值。

不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。
————————————————

验证(结论)发现所有的整型都默认带有正负号 如何修改不带正负号
约束条件:unsigned:整数的基础上必须是正数
create table 表名(id int unsigned);

六.字段类型之浮点型

loat(255,30) 总共255位 小数位占30位
double(255,30) 总共255位 小数位占30位
decimal(65,30) 总共65位 小数位占30位
上述浮点型从上往下精确度越来越高

浮点数如果不写精度和标度,则会按照实际显示,如果有精度和标度,则会将数据四舍五入后插入,系统不报错,定点数如果不设置精度和标度,刚按照默认的(10,0)进行操作,如果数据超过了精度和标度值,则会报错。

七.字段类型之字符串

char:定长-------整存整取 速度快会造成一定的存储空间浪费
char(5) 111111111111111 11111 11111 11111
只取5位 11111 11111

varchar:变长--------节省存储空间 存取数 据的速度没有char快

varchar在存数据的时候会生成一个1bytes的报头 记录数据长度
varchar在取数据的时候先会读取1bytes的报头 从中获取真实数据长度
varchar(5) 111111111111111111111111111111111
varchar(5) 1bytes11111 1bytes11111 1bytes11111 等更为精准

char(4) # 定长 最大只能存储四个字符 超出则报错 不够则空格补充4个
varchar(4) # 变长 最大只能存储四个字符 超出则报错 不够有几个存几个

如图 不够则补充是用空格补充所以只显示两位

5.6版本并且没有修改严格模式 则会自动截取四个字符
修改文件配置 my.ini配置文件

sql_mode = 'STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY'

八.数字的含义

字段类型括号内的数字大部分情况下是用来限制存储的长度
但是在整型中并不是用来限制长度 而是用来控制展示长度

id int (2) 设置两位数 插入11111 不会报错

zerofill 约束条件 id int (2) 设置两位数 不够则用0填充
如果超出则 有几位展示几位

但涉及到整型字段 无需要自己定义长度 因为有自带长度
但针对其他类型的字段 则需要自己添加数字

九.字段类型之枚举与集合

枚举 : 多选一 关键字 enum

插入数据的时候 针对gender只能填写提前定义好的数值
如没有根据指定数值填入 则输入的字符为空

集合 : 多选多(多选一) 关键字 set

同理插入数据的是个 针对fuck可以填写提前定义好的数值
如没有根据指定数值填入或数值填写错误 则输入的字符为空

十.字段类型值日期类型

date 年月日
datetime 年月日时分秒
time 时分秒
year 年

针对时间数据一般都是通过代码自动获取并添加 我们这里手动模拟

十一.约束条件

create table 表名 (字段名1 字段类型(数字) 约束条件)

**字段类型与约束条件的关系** # unsigned : 指的是整数基础之上还必须是正数 # zerofill: 零填充 输入值不够使用0填充至设置数值 # not null :非空 值不能为空 create table 表名(id int,name varchar(32) not null); **在设置好值时 约束条件 not null 时 传值 不能少输 不能输入null关键字空 ''可以输入空字符串 不过显示的也是空**  # default : 默认值 create table 表名(id int,name varchar(32) default 'thn'); insert into 表名(id) values(对应id 1 对应name不填写)  insert into 表名(id,name) values(对应id 2 thnnb);  
'单列唯一' # unique : 唯一值 某个字段下对应的数据不能重复 是唯一的 create table 表名(id int, name varchar(32) unique);  
 **传入值重复传入会报错**  '多列唯一' # unique : 把多个字段括号括起来 使多个字段下的对应数据别的组合不能重复  create table 表名(id int,host varchar(32),port int,  unique(host,port));  # primry key : 主键 '单从约束层面上而言 相当于not null + unique(非空且唯一)' create table 表名(id int primary key);  '是InnoDB存储引擎规定的一张表有且必须要有一个主键 用于构建表'     主键可以加快数据的查询速度(类似于书的目录) 如果创建表创建的时候没有设置主键也没有其他的键 那么InnoDB会采用一个隐藏的字段作为表的主键(隐藏就意味着而无法使用 即无法加快数据查询)   如果没有主键但是有非空且唯一的字段 那么会自动升级成主键(从上往下的第一个)  create table 表名(tid int,                           pid int not null unique,                  cid int not null unique); 创建表应该有一个序号字段(id\pid\cid)并且应该将该字段设置成主键 create table 表名(id int primary key,                   name varchar(32)); 

结论 主键通常会设置给id等类似与序列号的字段 目的为更方便的通过‘目录’查找
内涵非空 与 唯一性

# auto_increment : 自增 配合主键使用 create table 表名(id int primary key auto_increment,name varchar(32));  insert into 表名(name)'只传name' values('ttt'); 

总结 只给name传入数值就可以 不需要填写序号传值 方便 内置非空 唯一性 传的值一致 也是会报错的