【数据库の相关概念】操作
库操作
create database 库名字 [字符集设定,例charset UTF8] [校对集设定,例collate utf8mb4_general_ci] ;
创建数据库
show databases [like '库名字匹配符'];
查询数据库,匹配符中%表示匹配多个字符,_表示匹配单个字符,若库名字含有“_”则需要使用”\_“进行转义
use 数据库名字;
使用指定数据库
drop database 库名字;
删除数据库
alter database 库名字 [字符集设定,例charset UTF8] [校对集设定,例collate utf8mb4_general_ci] ;
修改库权限,另外没有修改库名字的函数
表操作
新增表
creat table [if not exists] 表名字或库名字.表名字
(字段名 数据类型(数据长度),
...
字段名 数据类型(数据长度)
)[字符集设定,例charset UTF8] [校对集设定,例collate utf8mb4_general_ci] [存储引擎,例engine MyISAM];
创建表
查询表
show tables [like '库名字匹配符'];
显示当前数据库有几张表
更新表
rename table 旧表名字 to 新表名字;
修改表名
alter table 表名字 [字符集设定,例charset UTF8] [校对集设定,例collate utf8mb4_general_ci] [存储引擎,例engine MyISAM];
修改表选项
alter table 表名字 add 字段名 数据类型(数据长度) [位置,first或after 字段名(指定字段后)或默认为最后一个位置];
新增字段
alter table 表名字 modify 字段名 数据类型(数据长度) [位置,first或after 字段名(指定字段后)或默认为最后一个位置];
修改字段
alter table 表名字 change 旧字段名 新字段名 数据类型(数据长度) [位置,first或after 字段名(指定字段后)或默认为最后一个位置];
重命名字段
alter table 表名字 drop 字段名;
删除字段,如果表中已经存在数据,那么删除该字段会清空该字段的所有数据,而且不可逆,慎用。
删除表
drop table 表名字1 表名字2 ...;
删除表,删除不可逆
数据操作
数据类型
数值类型
tinyint(1字节),smallint(2字节),mediumint(3字节),int(4字节),big(8字节)
默认都是有符号整型,加unsigned可转化为无符号整型,例tinyint unsigned
float:单精度,占用 4 个字节存储数据,精度范围大概为 7 位左右;
double:双精度,占用 8 个字节存储数据,精度范围大概为 15 位左右。
例:如果直接用float,则表示没有小数部分;如果用float(M,D),其中M代表总长度,D代表小数部分长度,M-D则为整数部分长度。
插入数据的时候,可以直接插入小数,也可以插入用科学计数法表示的数据。此外,插入浮点型数据时,整数部分是不能超出长度范围的(如果整数部分数据太长也会发生四舍五入),否则会取一个当前长度范围内的最大值代替超出长度范围的值,但是小数部分是可以超出长度范围的,系统会自动进行四舍五入的操作。特别是,如果浮点数是因为系统进位(四舍五入)导致整数部分超出指定的长度,那么系统是允许成立的。
decimal:定点型。
例:如果直接用decimal,则表示没有小数部分;如果用decimal(M,D),其中M代表总长度,D代表小数部分长度,M-D则为整数部分长度。
绝对的保证整数部分不会被四舍五入,也就是说不会丢失精度,但小数部分有可能丢失精度,虽然理论上小数部分也不会丢失精度。
日期类型
datetime:日期时间,其格式为yyyy-MM-dd HH:mm:ss,表示的范围是从 1000 年到 9999 年,有零值,即0000-00-00 00:00:00;
date:日期,就是datetime的date部分;
time:时间,或者说是时间段,为指定的某个时间区间之间,包含正负时间;
timestamp:时间戳,但并不是真正意义上的时间戳,其是从1970年开始计算的,格式和datetime一致,只要当前所在的记录被更新,该字段就会自动更新为当前时间,且时间戳类型默认为非空的。
year:年份,共有两种格式,分别为year(2)和year(4).
字符串类型
char:定长字符串,磁盘(二维表)在定义结构的时候就已经确定了最终数据的存储长度。
char(L) L为存储的长度,单位为字符,最大长度为255。
varchar:变长字符串,在分配存储空间的时候,按照最大的空间分配,但是实际用了多少,则是根据具体的数据来确定。
varchar(L) L 表示 Length,理论长度是 65536,但是会多出 1 到 2 个字节来确定存储的实际长度。
- 定长字符串对磁盘空间比较浪费,但是效率高:如果数据基本上确定长度都一样,就使用定长字符串,例如身份证、电话号码等;
- 变长字符串对磁盘空间比较节省,但是效率低:如果数据不能确定长度(不同的数据有变化),就使用变长字符串,例如地址、姓名等。
text:文本字符串,存储文字
blob:文本字符串,存储二进制数据(其实际上都是存储路径),通常不用。
如果数据量非常大,通常说超过 255 个字符就会使用文本字符串。无论是在utf8还是在gbk字符集之中,其都占用记录中的10个字节长度,用来保存数据的地址以及长度。
enum(‘元素1’,‘元素2’,‘元素3’…):存储的数据只能是事先定义好的数据。
好处:
-
插入表中的数据只能是事先定义好的某个数据;
-
节省存储空间(枚举数据通常都有一个别名),枚举实际上存储的是数值而不是字符串本身。
坏处:
- 使用枚举的效率并不高(低于其他类型的数据)
原理:
- 枚举在进行数据规范(定义)的时候,系统会自动建立一个数字与枚举元素的对应关系(放在日志中);在进行数据插入的时候,系统自动将字符串转换为对应的数值进行存储;在进行数据提取的时候,系统自动将数值转换成对应的字符串进行显示。
set(‘元素1’,‘元素2’,‘元素3’…):跟枚举类似,实际存储的是数值而不是字符串.
好处:
-
插入表中的数据只能是事先定义好的某个数据;
-
节省存储空间(枚举数据通常都有一个别名),枚举实际上存储的是数值而不是字符串本身。
坏处:
- 使用枚举的效率并不高(低于其他类型的数据)
原理:
集合字符串中每一个元素都对应一个二进制位,其中被选中的为1
,未选中的为0
,最后在反过来,这个二进制数对应的十进制数即为其数据库中实际存储的是数值。
create table my_set(
hobby set('音乐','电影','旅行','美食','摄影','运动','宠物')
)charset utf8;
insert into my_set values ('电影,美食,宠物');
select hobby + 0,hobby from my_set;
即0101001反转得1001010再取十进制得74
varchar:变长字符串,可根据实际传入的数据大小调整存储空间,且任何一条记录最长不超过 65535 个字节
注意:
-
varchar实际存储的长度由编码字符集决定。
以UTF-8为例,21844*3+2=65534<65535
以gbk为例,32766*2+2=65534<65535
其中+2因为在分配存储空间的时候,都会自动多分配1到2个字节空间,因为咱们想要算最大的存储范围,所以加2.
-
另外在 MySQL 的记录中,如果有任何一个字段允许为空,那么系统就会自动从整个记录中保留一个字节来存储null,若想释放null所占的字节,则必须保证所有字段都不允许为空。
新增数据
insert into 表名字 value(值列表)...(值列表);
全表字段插入数据,要求值列表的顺序必须与表中字段顺序一样,而且非数据数据需要家单引号
insert into 表名字(字段列表) value(值列表)...(值列表);
表中部分字段插入数据,需要选定字段列表,而且值列表和字段列表必须一一对应
查询数据
select * from 表名字;
查询对应表名字的所有数据
select 字段列表 from 表名字 [where 条件,例age=‘18’];
查询对应表名字中对应字段和条件的数据
select 字段名+0 from 表名字
将数据取出加0,如果是字符串最终结果永远为0,否则为其他值
更新数据
update 表名字 set 字段=值 [where 条件,例age=‘18’];
将对应表名字中对应字段和条件的值更新为目标值
删除数据
delete from 表名字 [where 条件,例age=‘18’];
删除对应表名字中对应字段和条件的值