(小白)MySQL基础学习00320201007

    科技2024-06-20  68

    (小白)MySQL基础学习003 20201007

    历程

    字符串型

    char:定长字符,指定长度之后,系统一定会分配指定的空间用于存储数据; char(L),L代表字符(中文与英文字母一视同仁),L长度0-255 varchar:变长字符,根据实际存储的数据计算长度 varchar(L),L代表字符数,每次数据产生后,系统都会增加1-2个字节的额外开销,小于127,额外开销1个字节,大于127,就开销2个字节 char的数据查询效率比varchar高,varchar是需要通过记录数来计算的。 如果确定数据一定是占指定长度,那么用char,如果不确定数据到底有多少,那么使用varchar类型。 如果数据长度超过255,不论是否固定长度,都会使用text,不再使用char和varchar

    text text:存储普通的字符文本 blob:存储二进制文本(图片,文件),一般都不会使用blob来存储文件本身,通常是使用一个链接来指向对应的文件本身。 text:系统中提供的四种text tinytext:系统使用一个字节来保存,实际能够存储的数据为2^8+1 text:使用两个字节保存,实际存储2^16+2 mediumtext:使用3个字节保存,实际存储为2*24+3 longtext:使用四个字节保存,实际存储为2^32+4

    注意:在选择对应的存储文本的时候,不用刻意去选择text类型,系统会自动根据存储的数据长度来选择合适的文本类型,我们一般都是选择text

    Enum 枚举类型,在数据插入之前,先设定几个项,这几个项就是可能最终出现的数据结果。

    如果确定某个字段的数据只有那么几个值,如性别,男,女,保密,系统就可以在设定字段的时候规定当前字段只能存放固定的几个值,使用枚举。 enum(数据值1,数据值2) 系统提供1-2个字节来存储枚举的数据,通过计算enum列举的具体值来选择实际的存储空间。 小于255就一个字节, 大于255小于65556,那么就用两个字节 create table my_enum( gender enum(“男”,“女”,“保密”) )charset utf8;

    插入合法数据 insert into my_enum values(“男”);

    错误数据,enum有规范数据的功能,能够保证插入的数据必须d在范围内,其它都不可以; insert into my_enum values(""); enum的存储原理,实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标,当系统设定为枚举的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始 1=>男 2=>女 。。。 mysql中系统是自动进行类型转换的,如果数据碰到“±*/”系统就会自动将数据转换成数值,而普通字符串转换成数值为0; select 字段名+0 from 表 select gender+0 from my_enum; 这里的1,1对应的是男男的下标,既然实际enum存储的结果是数值,那么在进行数据插入的时候,就可以使用对应的数值来进行。insert into my_enum values(3);

    select 0 from my_enum; 实际上直接select 0即可

    只是这时候返回的却都是0 select 1 from my_enum; 这时候返回的都是1

    select 100 from my_enum; select gender+100 from my_enum; select gender from my_enum where gender=1;

    发现这里用123也是可以进行查询的。 枚举的意义: 节省存储空间,规范数据

    set 集合:类似枚举,是一种将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应二进制位来进行控制,1表示该选项被选中,0表示没有被选中。 set(值1,值2,值3); 系统为set提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元。 1个字节:8个选项 2个字节:16个选项 3个字节:24个选项 8个字节:64个选项 最多只有64个选项

    set和enum一样,最终存储到字段中,而不是真实的字符串。 create table my_set( hobby set (“篮球”,“足球”,“羽毛球”,“乒乓球”,“网球”,“橄榄球”,“冰球”,“高俅”) )charset utf8;

    插入数据 insert into my_set values(“篮球,乒乓球,冰球”); insert into my_set values(“篮球”,“乒乓球”,“冰球”);

    所以应该把所有的词语放在""内 数据选项的数据与数据插入的顺序无关,最终都会变成选项对应的顺序。 insert into my_set values(“高俅,足球,篮球,乒乓球,冰球”); 自动按原来选项的顺序重新排序了 所以与你录入的顺序无关 如果被选中,位置为1,否则为0 所以结果类似于 10010010 11010011

    系统将对应的数据选项按原顺序进行编排,每一个都按照进制进行排列。查看数据,按照自动转换成数值来查看; select hobby +0 from my_set;

    为什么是73和203 因为数据在存储的时候自动转换: 10010010=》01001001 ===》1+8+64=73 11010011=》11001011 ===》1+2+8+64+128=203

    既然是数值,那么就可以插入数值,来代替实际的值; insert into my_set values(255); 这里的255相当于11111111 那我们用11111111 insert into my_set values(11111111); 这是报错的!也就是这个并不表示2进制。 数字插入的前提是对应的二进制的位上都有相应的数。否则报错! 功能同enum enum相当于单选,而set相当于多选

    mysql记录长度 记录长度record==行row,总长度不能超过65535个 varchar能够存储的理论值为65535个字符,但由于在不同的字符集下可能占用多个字符

    证明varchar在mysql中能够达到的实际值 create table my_varchar( anme varchar(65535); )charset utf8; 报错: 最大值只有21845 utf8: 65535/3=21845-1个 如果varchar存储,需要2个额外的字节来保存长度

    gbk: 65535/2=32767-1个

    列属性 列属性又称之为字段属性,在mysql中一共有6个属性:null,默认值,列描述,主键,唯一键和自增长 show tables;

    null:null如果对应为YES表示该字段可以为NULL 在设计表的时候,尽量不要让数据为空; mysql的记录长度为65535,如果一个表中有字段允许为NULL,那么系统会设计保留一个字节来存储NULL,最后有效存储长度就变成65534

    key primary key:主键 主要的键,primary key 在一张表中,有且只有一个字段,里面的值具有唯一性;

    创建主键: 随表创建: 1、直接在需要当作主键的字段后增加primary key的属性来确定 create table my_pri1( username varchar(10) primary key )charset utf8; 2、在所有字段之后增加primary key 选项;primary key(字段信息) create table my_pri2( username varchar(10) , primary key(username) )charset utf8;

    表后增加: alter table 表名 add primary key(字段); create table my_pri3( username varchar(10) )charset utf8; alter table my_pri3 add primary key(username);

    查看主键 1、查看表结构 desc my_pri3; 在Key下有一个PRI,代表主键 主键不允许为空,所以不需要去设置NULL 为NOT NULL,自动会设置为NOT NULL 2、可以通过表的创建语句来看 删除主键 alter table 表名 drop primary key; alter table my_pri3 drop primary key; 这时候发现,虽然主键被删除了,但NULL 依然为NO,所以这里需要注意 复合主键 有一张学生选修课表,一个学生可以选修多个选修课,一个选修课可以由多个学生来选,但是一个学生在一个选修课中只有一个成绩。 create table my_score( student_no char(10), course_no char(10), score tinyint not null, primary key (student_no,course_no) )charset utf8;

    发现有两个主键;这就是复合主键 主键约束: 主键一旦增加,那么对对应的字段有数据要求; 1、当前字段对应的数据不能为空 2、当前字段对应的数据不能重复; insert into my_score values(“00000001”,“course001”,100); insert into my_score values(“00000002”,“course001”,90); insert into my_score values(“00000001”,“course002”,95);

    这里并没有报错,是因为student_no和course_no是复合的,两个同时重复就会报错: 再来一个: insert into my_score values(“00000002”,“course001”,95); 报重复了 主键分类: 1、主键分类采用的是主键所对应的字段的业务意义分类 业务主键:主键所在的字段,具有的业务意义(学生ID,课程ID等) 逻辑主键:自然增长的整型(应用广泛)

    default:默认值,当字段被设计的时候,如果允许默认条件下,用户不进行数据的插入,那么就可以使用事先准备好的数据来填充,通常填充的是NULL create table my_default( name varchar(10) NOT NULL, age int default 18 )charset utf8; insert into my_default(name) values(“Tom”); default另外一层使用,显示的告知字段使用默认值:在进行数据插入的时候,对字段的直接使用

    insert into my_default values(“Jack”,default);

    extra:

    列描述:comment专门用于给开发人员进行维护的一个注释说明 基本语法: comment字段描述

    create table my_comment( name varchar(10) not null comment “,当前是用户名,不能为空”, pass varchar(5) not null comment “密码不能为空” )charset utf8; 想要查看,必须查看表创建语句

    自增长 在没有提供确定数据的时候,系统会根据之前已经存在的数据进行自动增加后,填充数据; 通常自动增长用于逻辑主键: 原理: 1、在系统中有维护一组数据,用来保存当前使用了自动增长属性的字段,记住当前对应的数据值,再给一个指定的步长; 2、当用户进行数据插入的时候,如果没有给定值,系统在原始值上再加上步长变成新的数据; 3、自动增长的触发,给定属性的字段没有提供值 4、自动增长只适用于数值 在字段之后增加一个属性: create table my_auto( id int primary key auto_increment, name varchar(10) not null comment “用户名不能为空”, pass varchar(50) not null comment"密码不能为空" )charset utf8; 插入数据,不能够给定自动增长的值; insert into my_auto values(null,“Tom”,“123456”); id=1 insert into my_auto values(null,“Lily”,“654321”); id=2 如果我给数字会怎么样呢? insert into my_auto values(100,“Han”,“654321”); 那就会变成你给定的数; 如果给重复呢; insert into my_auto values(100,“Han2”,“654321”); 因为我已经给了primery key所以id不能重复 那我再加一个,看看是怎么自增长 insert into my_auto values(null,“Zhao”,“111111”); 发现是根据上一个字段的来的,感觉跟PHP的数组下标有点类似 那如果我先给个比100小的,再自增会怎么样呢? insert into my_auto values(90,“Qian”,“111111”); insert into my_auto values(null,“Sun”,“111111”); 发现不仅按最大的那个来,而且还自动重新排序了

    修改自动增长 查看自动增长,自动增长一旦触发使用之后,会自动在表选项中增加一个选项(一张表最多只能拥有一个自增长); show create table my_auto; 发现末尾加了一个AUTO_INCREMENT=103 说明可以通过表结构来实现修改: alter table 表名 auto_increment=10; alter table my_auto auto_increment=10;

    这里我们的自增长值并没有变成10,我想是因为我原本就有大于10的值,如果我改成比103大的值,应该可行; alter table my_auto auto_increment=110; 没问题

    删除自增长 删除自增长,就是在字段属性之后不再保留auto_increment,当用户修改自增长所在字段时,如果没有看到auto_increment属性,系统会自动清除该自增长; alter table my_auto modify id int;//此时不用再设置primary key ,因为已经有了,再设置系统会报错 发现,此处的id依然是primary key,但是已经没有自增长了。

    自增长的初始设置 查看自增长的初始变量: show variables like “auto_increment%”;

    这里的offset指的是起始值,而increment_increment就是步长

    唯一键 unique key,用来保证对应字段中的数据唯一的; 主键也可以用来保证字段数据唯一性,但是一张表只有一个主键; 唯一键可以一张表中有多个 唯一键允许为NULL,NULL可以有多个(NULL不参与比较) 创建唯一键:(和主键类似) 直接在表字段之后增加唯一键标识符:unique[key] 在所有的字段之后使用uniquekey(字段) 之后添加

    create table my_unique1( id int primary key auto_increment, username varchar(10) unique )charset utf8;

    create table my_unique2( id int primary key auto_increment, username varchar(10) , unique key(username) )charset utf8;

    create table my_unique3( id int primary key auto_increment, username varchar(10) )charset utf8; alter table my_unique3 add unique key(username);

    show create table my_unique1;

    show create table my_unique2;

    show create table my_unique3;

    三种方式是一样的效果。

    查看唯一键 desc my_unique1; 这里的key:UNI,且NULL:YES允许为空

    唯一键效果,在不为空的情况下,不能重复

    这里发现唯一键和主键有所不同,系统主动给唯一键创建了UNIQUE KEY "username"创建了一个和它相同的名字

    删除唯一键 alter table 表名 drop index 唯一键名字; alter table my_unique3 drop index username;

    发现已经没有唯一键了。 唯一键是没办法修改的,只能先删除唯一键,再添加唯一键;

    复合唯一键 和主键一样,可以和多个字段共同保证唯一性 一般主键都是单一字段(逻辑主键),而其它需要唯一性的内容都是由唯一键来处理。
    Processed: 0.011, SQL: 8