【数据库の相关概念】操作

库操作

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’]; 删除对应表名字中对应字段和条件的值