数据库基础
数据库概念
数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。
数据库:存储数据的仓库
数据库分类
网络数据库
网络数据库是指把数据库技术引入到计算机网络系统中,借助网络技术将存储于数据库中的大量信息及时发布出去;而计算机网络借助于成熟的数据库技术对网络中的各种数据进行有效管理,并实现用户与网络中的数据库进行实时动态数据交换。
层级数据库
层次结构模型实质上是一种由根结点的定向有序树(在数学中“树”被定义为一个无回的连通图)。
关系数据库
关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
数据库的另外一种区分方式:基于存储介质
存储介质分为两种:磁盘和内存
1、关系型数据库:存储在磁盘中
2、非关系型数据库:存储在内存中
关系型数据库
基本概念
关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方式来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型由一些批评意见,但它还是数据存储的传统标准。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。
关系数据结构:指的是数据以什么方式来存储,是一种二维表的形式存储
本质:二维表
姓名 | 年龄 | 身高 | 体重 |
---|---|---|---|
张三 | 30 | 187 | 70 |
李四 | 40 | 175 | 65 |
关系操作集合:如何来关联和管理对应的存储数据,SQL指令
获取张三的年纪:已知条件为姓名
select 年龄 from 二维表 where 姓名 = 张三;
关系完整性约束:数据内部有对应的关联关系,以及数据与数据之间也有对应的关联关系
表内约束:对应的具体列只能放对应的数据(不能乱放)
表间约束:自然界各实体都是有着对应的关联关系(外键)
典型的关系型数据库
Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、SQLite
小型关系型数据库:Microsoft Access,SQLite
中型关系型数据库:Microsoft SQL Server,MySQL
大型关系型数据库:Oracle、DB2
MySQL当前跟Oracle是一个公司的:隶属于Oracle
SQL介绍
SQL基本介绍
结构化查询语言(Structured Query Language)**简称SQL,是一种特殊目的的编程**语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL就是专门为关系型数据库而设计出来的。
SQL分类
- 数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
专门用于查询数据:代表指令为select/show
- 数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
专门用于写数据:代表指令为insert,update和delete
- 事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。(不是所有的关系型数据库都提供事务安全处理)
专门用于事务安全处理:transaction
- 数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
专门用于权限管理:代表指令为grant和revoke
- 数据定义语言(DDL):
数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
专门用于结构管理:代表指令create和drop(alter)
MySQL基本介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
Mysql是一种开源免费的数据库产品
Mysql对PHP的支持是最好(wamp或者lamp)
Mysql中用到的操作指令就是SQL指令
启动和停止MySQL服务
Mysql是一种C/S结构:客户端和服务端
服务端对应的软件:Mysqld.exe
命令行方式
通过Windows下打开cmd控制器,然后使用命令进行管理
Net start 服务(mysql):开启服务
Net stop mysql:关闭服务
系统服务方式
前提:在安装的Mysql的时候将mysql添加到Windows的服务中去了
方式1进入服务:
方式2进入服务:通过命令行:services.msc
通过服务对Mysql服务器进行管理
方案1:右键服务,然后选择开启或者停止
方案2:双击服务,进入到服务详情界面,可以点击开启或者停止按钮
登录和退出MySQL系统
通过客户端(mysql.exe)与服务器进行连接认证,就可以进行操作
通常:服务端与客户端不在同一台电脑上
登录
找到mysql.exe(通过cmd控制台:如果在安装的时候指定了mysql.exe所在的路径为环境变量,就可以直接访问;如果没有,那么就必须进入到mysql.exe所在路径)
输入对应的服务器地址:-h:host -h[IP地址/域名]
输入服务器中Mysql监听的端口: -P:port –P:3306
输入用户名:-u:username -u:root
输入密码:-p:password –p:root
连接认证基本语法:
1 | Mysql.exe/mysql -h主机地址 -P端口 -u用户名 -p密码 |
注意事项
通常端口都可以默认:mysql坚挺的端口通常都是3306
密码的输入可以先输入-p,直接换行,然后再以密文方式输入密码
退出
断开与服务器的连接:通常Mysql提供的服务器数量有限,一旦客户端用完,建议就应该断开连接。
建议方式:使用SQL提供的指令
1 | Exit; //exit带分号 |
Mysql服务端架构
Mysql服务端架构有以下几层构成:
- 数据库管理系统(最外层):DBMS,专门管理服务器端的所有内容
- 数据库(第二层):DB,专门用于存储数据的仓库(可以有很多个)
- 二维数据表(第三层):Table,专门用于存储具体实体的数据
- 字段(第四层):Field,具体存储某种类型的数据(实际存储单元)
数据库中常用的几个关键字
Row:行
Column:列(field)
数据库基本操作
数据库是数据存储的最外层(最大单元)
创建数据库
基本语法:
1 | create database 数据库名字 [库选项]; |
库选项:数据库的相关属性
字符集:charset 字符集,代表着当前数据库下的所有表存储的数据默认指定的字符集(如果当前不指定,那么采用DBMS默认的)
校对集:collate 校对集
1 | Create database 数据库名字 charset 字符集名称; |
显示数据库
每当用户通过SQL指令创建一个数据库,那么系统就会产生一个对应的存储数据的文件夹(data)
其实,每个数据库文件夹下都有一个opt文件,保存的是对应的数据库选项。
显示全部
基本语法:
1 | show databases; |
information_schema:保存数据库所有的结构信息(库,表)
mysql:核心数据库:权限关系
performance_schema:效率库
显示部分
基本语法:
1 | show databases like '匹配模式'; |
_:匹配当前位置单个字符
%:匹配指定位置多个字符
获取以my开头的全部数据库: ‘my%’;
获取m开头,后面第一个字母不确定,最后为database的数据库;’m_database’;
获取以database结尾的数据库:’%database’;
显示数据库创建语句
基本语法:
1 | show create database 数据库名字; |
看到的指令并非原始指令,已经被系统加工过
选择数据库
为什么要选择数据库?因为数据是存储到数据表,表存在数据库下。如果要操作数据,那么必须进入到对应的数据库才行。
基本语法:
1 | use 数据库名字; |
Database changed:表示当前已经进入到指定的数据库环境
修改数据库
修改数据库字符集(库选项):字符集和校对集
基本语法:
1 | alter database 数据库名字 charset = 字符集; |
一旦修改成功,那么对应的opt文件中就会体现
是否可以修改数据库名字?mysql5.5之前是可以修改的rename命令;但是5.5之后就不可以。
删除数据库
基本语法:
1 | drop database 数据库名字; |
删除虽简单,但是切记要做好安全操作:确保里面数据没有问题。(重要)
删除数据库之后:对应的存储数据的文件夹也会被删除(opt文件也被删除)
数据表操作
创建数据表
普通创建表
基本语法:
1 | create table 表名(字段名 字段类型 [字段属性], 字段名 字段类型 [字段属性],…) [表选项]; |
以上错误说明:表必须放到对应的数据库下:有两种方式可以将表挂入到指定的数据库下
- 在数据表名字前面加上数据库名字,用“.”连接即可:
数据库.数据表
- 在创建数据表之前先进入到某个具体的数据库即可:
use 数据库名字
表选项:与数据库选项类似
Engine:存储引擎,mysql提供的具体存储数据的方式,默认有一个innodb(5.5以前默认是myisam)
Charset:字符集,只对当前自己表有效(级别比数据库高)
Collate:校对集
复制已有表结构
从已经存在的表复制一份(只复制结构:如果表中有数据不复制)
基本语法:
1 | create table 新表名 like 表名; //只要使用数据库.表名,就可以在任何数据库下访问其他数据库的表名 |
从mydatabase2下取到的表
显示数据表
每当一张数据表创建,那么就会在对应的数据库下创建一些文件(与存储引擎有关)
frm代表结构文件
注意:这个结构文件来自于innodb存储引擎,innodb存储引擎所有的文件都存储在外部的ibdata文件中
显示所有表
基本语法:
1 | show tables; |
匹配显示表
基本语法:
1 | show tables like '匹配模式'; |
显示表结构
本质含义:显示表中所包含的字段信息(名字,类型,属性等)
1 | Describe 表名; |
显示表创建语句
查看数据表创建时的语句:此语句看到的结果已经不是用户之前自己输入的。
基本语法:
1 | show create table 表名; |
Mysql中有多种语句结束符
;与\g:所表示的效果是一样的,都是字段在上排横着,下面跟对应的数据
\G:字段在左侧竖着,数据在右侧横着
设置表属性
表属性指的就是表选项:engine,charset和collate
基本语法:
1 | alter table 表名 表选项 [=] 值; |
注意:如果数据库已经确定了,里面有很多数据了,不要轻易修改表选项(字符集影响不大)
修改表结构
修改表名:
1 | rename table 旧表名 to 新表名; |
修改表选项:
1 | alter table 表名 表选项 [=] 新值; |
新增字段:
1 | alter table 表名 add [column] 新字段名 列类型 [列属性] [位置first/after 字段名]; |
特点:默认是加到表的最后面
字段位置:字段想要存放的位置
First:在某某之前(最前面),第一个字段
After 字段名:放在某个具体的字段之后(默认的)
修改字段名:
1 | alter table 表名 change 旧字段名 新字段名 字段类型 [列属性] [新位置]; |
修改字段类型(属性):
1 | alter table 表名 modify 字段名 新类型 [新属性] [新位置]; |
删除字段:
1 | alter table 表名 drop 字段名; |
删除表结构
基础语法:
1 | drop table 表名[,表名2…],可以同时删除多个数据表; |
批量删除表
数据基础操作
插入操作
本质含义:将数据以SQL的形式存储到指定的数据表(字段)里面
基本语法:向表中指定字段插入数据
1 | Insert into 表名[(字段列表)] values(对应字段列表); |
- 注意:后面(values中)对应的值列表只需要与前面的字段列表相对应即可(不一定与表结构完全一致)
- 注意:字段列表并不一定非要有所有的表中字段
基本语法:向表中所有字段插入数据
1 | Insert into 表名 values (对应表结构); //值列表必须与字段列表一致 |
查询操作
查询表中全部数据:
1 | select * from 表名; //*表示匹配所有的字段 |
查询表中部分字段:
1 | select 字段列表 from 表名; //字段列表使用逗号“,”隔开 |
简单条件查询数据:
1 | select 字段列表/* from 表名 where 字段名 = 值; //mysql中没有==符号 |
删除操作
基本语法:
1 | delete from 表名 [where 条件]; //如果没有where条件:意味着系统会自动删除该表所有数据(慎用) |
更新操作
更新:将数据进行修改(通常是修改部分字段数据)
基本语法:
1 | update 表名 set 字段名 = 新值 [where 条件]; //如果没有where条件,那么所有的表中对应的那个字段都会被修改成统一值。 |
字符集
字符编码概念
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
在计算机中所看到的任何内容都是字符构成的。
字符编码(character code)是计算机针对各种符号,在计算机中的一种二进制存储代号。
字符集概念
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。
常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编码,是中文信息交流的技术基础。
设置客户端所有字符集
如果直接通过cmd下的mysql.exe进行中文数据插入,那么可能出错
出错原因:
- 用户是通过mysql.exe来操作mysqld.exe
- 真正的SQL执行是Mysqld.exe来执行
- mysql.exe将数据传入mysqld.exe的时候,没有告知其对应的符号规则(字符集),而mysqld也没有能力自己判断,就会使用自己默认的(字符集)
解决方案:mysql.exe客户端在进行数据操作之前将自己所使用的字符集告诉mysqld
Cmd下的mysql.exe默认都只有一个字符集:GBK
Mysql.exe如果告知Mysqld.exe对应的字符集类型为gbk?
快捷方式:
1 | set names 字符集; |
深层原理:客户端,服务端,连接层(show variables like ‘character_set_%’)
Mysql.exe与Mysqld.exe之间的处理关系一共分为三层
客户端传入数据给服务端:client:character_set_client
服务端返回数据给客户端:server:character_set_results
客户端与服务端之间的连接(中间的连接层):connection:character_set_connection
(这里说的不是很详细,是这样的:客户端 <–>中间连接层 <–>服务端)
Set names 字符集的本质:就是一次性打通三层关系的字符集,变得一致。
在系统中有三个变量来记录着这三个关系对应的字符集:
1 | show variables like ‘character_set_%’; |
(试验)只修改服务器端变量的值
1 | Set 变量名 = 值; |
重新进行数据插入和查看的结果:插入OK,但是查看乱码
修改结果字符集为GBK
Connection只是为了更方便客户端与服务端进行字符集转换而设。
1 | Set names gbk; |
列类型(字段类型)
整数类型
Tinyint
迷你整形,系统采用一个字节来保存的整形:一个字节 = 8位,最大能表示的数值是0-255
Smallint
小整形,系统采用两个字节来保存的整形:能表示0-65535之间
Mediumint
中整形,采用三个字节来保存数据。
Int
整形(标准整形),采用四个字节来保存数据。
Bigint
大整形,采用八个字节来保存数据。
- 创建数据表
- 插入合理数据
- 插入错误数据(超出对应的数据范围)
错误原因:并不是说tinyint没有这么大的空间,而是因为mysql默认的为整形增加负数。
实际表示的区间为-128,127
实际应用中,应该根据对应的数据的范围来选定对应的整形类型:通常使用的比较多的tinyint和int。
无符号标识设定
无符号:表示存储的数据在当前字段中,没有负数(只有正数,区间为0-255)
基本语法:在类型之后加上一个 unsigned
显示长度
显示长度:指数据(整型)在数据显示的时候,到底可以显示多长位。
Tinyint(3): 表示最长可以显示3位,unsigned说明只能是正数,0-255永远不会超过三个长度
Tinyint(4):表示最长可以显示4位,-128~127
显示长度只是代表了数据是否可以达到指定的长度,但是不会自动满足到指定长度:如果想要数据显示的时候,保持最高位(显示长度),那么还需要给字段增加一个zerofill
属性才可以。
Zerofill:从左侧开始填充0(左侧不会改变数值大小),所以负数的时候就不能使用zerofill,一旦使用zerofill就相当于确定该字段为unsigned
数据显示的时候,zerofill会在左侧填充0到指定位:如果不足3位,那么填充到3位,如果本身已经够了或者超出,那么就不再填充。
显示长度可以自己设定:超出长度(但是不超出范围)不会影响,只会对不够长度的进行补充(显示长度)
小数类型
专门用来存储小数的
在Mysql中将小数类型又分为两类:浮点型和定点型
浮点型
浮点型又称之为精度类型:是一种有可能丢失精度的数据类型,数据有可能不那么准确(由其是在超出范围的时候)
浮点型之所以能够存储较大的数值(不精确),原因就是利用存储数据的位来存储指数
整型:所有位都为1
浮点型:有部分用于存储数据,有部分用于存指数
Float
Float又称之为单精度类型:系统提供4个字节用来存储数据,但是能表示的数据范围比整型大的多,大概是10^38;只能保证大概7个左右的精度(如果数据在7位数以内,那么基本是准确的,但是如果超过7位数,那么就是不准确的)
基本语法:
1 | Float:表示不指定小数位的浮点数 |
- 创建一个数据表保存浮点数据
- 存入数据:合法数据
注意:如果数据精度丢失,那么浮点型是按照四舍五入的方式进行计算
- 插入数据,超出大小
- 数据长度刚好满足条件,但是会超出精度
说明:用户不能插入数据直接超过指定的整数部分长度,但是如果是系统自动进位导致,系统可以承担。
- 点数可以采用科学计数法来存储数据
浮点数的应用:通常是用来保存一些数量特别大,大到可以不用那么精确的数据。
Double
Double又称之为双精度:系统用8个字节来存储数据,表示的范围更大,10^308次方,但是精度也只有15位左右。
定点数
定点数:能够保证数据精确的小数(小数部分可能不精确,超出长度会四舍五入),整数部分一定精确
Decimal
Decimal定点数:系统自动根据存储的数据来分配存储空间,每大概9个数就会分配四个字节来进行存储,同时小数和整数部分是分开的。
1 | Decimal(M,D) //M表示总长度,最大值不能超过65,D代表小数部分长度,最长不能超过30。 |
- 创建表:与浮点数对比
- 插入正常数据
- 插入最大数据
- 尝试定点数进行四舍五入
定点数的应用:如果涉及到钱的时候有可能使用定点数
时间日期类型
Date
日期类型:系统使用三个字节来存储数据,对应的格式为:YYYY-mm-dd,能表示的范围是从1000-01-01 到9999-12-12,初始值为0000-00-00
Time
时间类型:能够表示某个指定的时间,但是系统同样是提供3个字节来存储,对应的格式为:HH:ii:ss,但是mysql中的time类型能够表示时间范围要大的多,能表示从-838:59:59~838:59:59,在mysql中具体的用处是用来描述时间段。
Datetime
日期时间类型:就是将前面的date和time合并起来,表示的时间,使用8个字节存储数据,格式为YYYY-mm-dd HH:ii:ss,能表示的区间1000-01-01 00:00:00 到9999-12-12 23:59:59,其可以为0值:0000-00-00 00:00:00
Timestamp
时间戳类型:mysql中的时间戳只是表示从格林威治时间开始,但是其格式依然是:YYYY-mm-dd HH:ii:ss
Year
年类型:占用一个字节来保存,能表示19002155年,但是year有两种数据插入方式:099和四位数的具体年
- 创建对应的时间日期类型的数据表
- 插入数据:正常数据
- year的特殊性:可以采用两位数的数据插入,也可以采用四位数的年份插入
- year进行两位数插入的时候,有一个区间划分,零界点为69和70:当输入69以下,那么系统时间为20+数字,如果是70以上,那配系统时间为19+数字
- timestamp当对应的数据被修改的时候,会自动更新(这个被修改的数据不是自己)
- time类型特殊性:本质是用来表示时间区间(当前时间之后的多少个小时),能表示的范围比较大
- 在进行时间类型录入的时候(time)还可以使用一个简单的日期代替时间,在时间格式之前加一个空格,然后指定一个数字(可以是负数):系统会自动将该数字转换成天数 * 24小时,再加上后面的时间。
PHP中有着非常强大的时间日期转换函数:date将时间戳转换成想要的格式,strtotime又可以将很多格式转换成对应的时间戳。PHP通常不需要数据库来帮助处理这么复杂的时间日期,所以通常配合PHP的时候,时间的保存通常使用时间戳(真正),从而用整型来保存。字符串型
Mysql记录长度
在mysql中,有一项规定:mysql的记录长度(record == 行row)总长度不能超过65535个字节。
Varchar能够存储的理论值为65535个字符:字符在不同的字符集下可能占用多个字节。
创建表:证明varchar在mysql中能够达到的理论值(utf8和GBK)
Varchar除了存储的数据本身要占用空间:还需要额外的空间来保存记录长度
计算在utf8和GBK下对应的varchar能够存储的长度
Utf8 最多只能存储21844个字符
GBK最多只能存储32766个字符
字符串型
Char
定长字符:指定长度之后,系统一定会分配指定的空间用于存储数据
基本语法:
1 | char(L) //L代表字符数(中文与英文字母一样),L长度为0到255 |
Varchar
变长字符:指定长度之后,系统会根据实际存储的数据来计算长度,分配合适的长度(数据没有超出长度)
基本语法:
1 | Varchar(L) //L代表字符数,L的长度理论值位0到65535 |
因为varchar要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar数据产生后,系统都会在数据后面增加1-2个字节的额外开销:是用来保存数据所占用的空间长度
如果数据本身小于127个字符:额外开销一个字节;如果大于127个,就开销两个字节
Char和varchar数据存储对比(utf8,一个字符都会占用3个字节)
存储数据 | Char(2) | Varchar(2) | Char所占字节 | Varchar所占字节 |
---|---|---|---|---|
A | A | A | 2*3=6 | 1*3+1=4 |
AB | AB | AB | 2*3=6 | 2*3+1=7 |
Char和varchar的区别
- char一定会使用指定的空间,varchar是根据数据来定空间
- char的数据查询效率比varchar高:varchar是需要通过后面的记录数来计算
如果确定数据一定是占指定长度,那么使用char类型;
如果不确定数据到底有多少,那么使用varchar类型;
如果数据长度超过255个字符,不论是否固定长度,都会使用text,不再使用char和varchar
Text
文本类型:本质上mysql提供了两种文本类型
Text:存储普通的字符文本
Blob:存储二进制文本(图片,文件),一般都不会使用blob来存储文件本身,通常是使用一个链接来指向对应的文件本身。
Text:系统中提供的四种text
Tinytext:系统使用一个字节来保存,实际能够存储的数据为:2 ^ 8 + 1
Text:使用两个字节保存,实际存储为:2 ^ 16 + 2
Mediumtext:使用三个字节保存,实际存储为:2 ^ 24 + 3
Longtext:使用四个字节保存,实际存储为:2 ^ 32 + 4
注意:
在选择对应的存储文本的时候,不用刻意去选择text类型,系统会自动根据存储的数据长度来选择合适的文本类型。
在选择字符存储的时候,如果数据超过255个字符,那么一定选择text存储
Enum
枚举类型:在数据插入之前,先设定几个项,这几个项就是可能最终出现的数据结果。
如果确定某个字段的数据只有那么几个值:如性别,男、女、保密,系统就可以在设定字段的时候规定当前字段只能存放固定的几个值:使用枚举
基本语法:
1 | enum(数据值1,数据值2…) |
系统提供了1到2个字节来存储枚举数据:通过计算enum列举的具体值来选择实际的存储空间:如果数据值列表在255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。
- 创建表
- 插入数据:合法数据,字段对应的值必须是设定表的时候所确定的值
- 错误数据:enum有规范数据的功能,能够保证插入的数据必须是设定的范围,其他类型都不可以
枚举enum的存储原理:实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标:当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始
Enum(1=>‘男’,2=>’女’,3=>’保密’)
特性:在mysql中系统是自动进行类型转换的:如果数据碰到“+、-、*、/”系统就会自动将数据转换成数值:而普通字符串转换成数值为0
1 | Select 字段名 + 0 from 表名; |
- 既然实际enum字段存储的结果是数值:那么在进行数据插入的时候,就可以使用对应的数值来进行。
枚举的意义:
规范数据本身,限定只能插入规定的数据项
节省存储空间
Set
集合:是一种将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应的二进制位来进行控制:1表示该选项被选中,0表示该选项没有被选中。
基本语法:
1 | set('值1','值2','值3'…) |
系统为set提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元
1个字节:set只能有8个选项
2个字节:set只能有16个选项
3个字节:set只能表示24个选项
8个字节:set可以表示64个选项
Set和enum一样,最终存储到数据字段中的依然是数字而不是真实的字符串
- 创建表
- 插入数据:可以插入多个数据,就是在数据插入的字符串中,使用对应的逗号“,”将选项进行隔开
- 数据选项所在的数据与数据插入的顺序无关:最终都会变成选项对应的顺序
分析数据存储的方式
- 系统将对应的数据选项(设计)按照顺序进行编排:从第一个开始进行占位,每一个都对应一个二进制位。
- 数据在存储的时候,如果被选中,那么对应的位的值就为1,否则为0
- 系统在进行存储的时候会自动将得到的最终的二进制颠倒过来,然后再进行转换成十进制存储
查看数据:按照自动转换成数值来查看
- 既然是数值,那么就可以插入数值来代替实际插入数据
注意:数字插入的前提是对应的二进制位上都有对应的数据项
Set集合的意义:
规范数据
节省存储空间
Enum:单选框
Set:复选框
列属性
列属性又称之为字段属性,在mysql中一共有6个属性:null,默认值,列描述,主键,唯一键和自动增长
Null属性
如果对应的值为YES表示该字段可以为NULL
注意:
在设计表的时候,尽量不要让数据为空
Mysql的记录长度为65535个字节,如果一个表中有字段允许为NULL,那么系统就会设计保留一个字节来存储NULL,最终有效存储长度为65534个字节。
默认值
Default:默认值,当字段被设计的时候,如果允许默认条件下,用户不进行数据的插入,那么就可以使用事先准备好的数据来填充:通常填充的是NULL
测试:不给当前字段提供数据值
Default关键字的另外一层使用:显示的告知字段使用默认值:在进行数据插入的时候,对字段值直接使用default
列描述
列描述:comment,是专门用于给开发人员进行维护的一个注释说明
基本语法:
1 | comment '字段描述'; |
查看Comment:必须通过查看表创建语句
主键
顾名思义:主要的键,primary key,在一张表中,有且只有一个字段,里面的值具有唯一性
创建主键
随表创建
系统提供了两种增加主键的方式
方案1:直接在需要当做主键的字段之后,增加primary key属性来确定主键
方案2:在所有字段之后增加primary key选项:primary key(字段信息)
表后增加
基本语法:
1 | alter table 表名 add primary key(字段); |
查看主键
方案1:查看表结构
主键不允许为空
方案2:查看表的创建语句
删除主键
基本语法:
1 | alter table 表名 drop primary key; |
复合主键
案例:有一张学生选修课表:一个学生可以选修多个选修课,一个选修课也可以由多个学生来选:但是一个学生在一个选修课中只有一个成绩。
设计字段:学号、课程号、成绩。
设置复合主键:primary key(student_no,course_no)
:表示学号和课程号两个共同唯一,不能存在相同的 学号-课程号。
下节’主键约束’是用这个示范的
主键约束
主键一旦增加,那么对对应的字段有数据要求
当前字段对应的数据不能为空;
当前字段对应的数据不能有任何重复
主键分类
主键分类采用的是主键所对应的字段的业务意义分类
业务主键:主键所在的字段,具有业务意义(学生ID,课程ID)
逻辑主键:自然增长的整型(应用广泛)
自动增长
自动增长:auto_increment,当给定某个字段该属性之后,该列的数据在没有提供确定数据的时候,系统会根据之前已经存在的数据进行自动增加后,填充数据。
通常自动增长用于逻辑主键。
原理
自动增长的原理:
在系统中有维护一组数据,用来保存当前使用了自动增长属性的字段,记住当前对应的数据值,再给定一个指定的步长
当用户进行数据插入的时候,如果没有给定值,系统在原始值上再加上步长变成新的数据
自动增长的触发:给定属性的字段没有提供值
自动增长只适用于数值
使用自动增长
基本语法:在字段之后增加一个属性auto_increment
插入数据:触发自动增长,不能给定具体值
修改自动增长
- 查看自增长:自增长一旦触发使用之后,会自动的在表选项中增加一个选项(一张表最多只能拥有一个自增长)
- 表选项可以通过修改表结构来实现
1 | alter table 表名 auto_increment = 值; |
删除自动增长
删除自增长:就是在字段属性之后不再保留auto_increment,当用户修改自增长所在字段时,如果没有看到auto_increment属性,系统会自动清除该自增长
初始设置
在系统中,有一组变量用来维护自增长的初始值和步长
1 | Show variables like 'auto_increment%'; |
细节问题
一张表只有一个自增长:自增长会上升到表选项中
如果数据插入中没有触发自增长(给定了数据),那么自增长不会表现
- 自增长修改的时候,值可以较大,但是不能比当前已有的自增长字段的值小
唯一键
唯一键:unique key,用来保证对应的字段中的数据唯一的。
主键也可以用来保证字段数据唯一性,但是一张表只有一个主键。
唯一键在一张表中可以有多个。
唯一键允许字段数据为NULL,NULL可以有多个(NULL不参与比较)
创建唯一键
- 直接在表字段之后增加唯一键标识符:
unique[key]
- 在所有的字段之后使用
unique key(字段列表)
- 在创建完表之后也可以增加唯一键
1 | alter table 表名 add unique key(字段列表); |
查看唯一键
唯一键是属性,可以通过查看表结构来实现
唯一键效果:在不为空的情况下,不允许重复
在查看表创建语句的时候,会看到与主键不同的一点:多出一个“名字”
删除唯一键
一个表中允许存在多个唯一键:假设命令为主键一样:
1 | alter table 表名 drop unique key; //错误的 |
Index关键字:索引,唯一键是索引一种(提升查询效率)
删除的基本语法:
1 | alter table 表名 drop index 唯一键名字; |
修改唯一键
先删除后增加
复合唯一键
唯一键与主键一样 可以使用多个字段来共同保证唯一性;
一般主键都是单一字段(逻辑主键),而其他需要唯一性的内容都是由唯一键来处理。
表关系
表关系:表与表之间(实体)有什么样的关系,每种关系应该如何设计表结构。
一对一
一对一:一张表中的一条记录与另外一张表中最多有一条明确的关系:通常,此设计方案保证两张表中使用同样的主键即可
学生表
学生ID(PRI) | 姓名 | 年龄 | 性别 | 籍贯 | 婚否 | 住址 |
---|---|---|---|---|---|---|
表的使用过程中:常用的信息会经常去查询,而不常用的信息会偶尔才会用到。
解决方案:将两张表拆分,常见的放一张表,不常见的放一张表
常用表
学生ID(PRI) | 姓名 | 年龄 | 性别 |
---|---|---|---|
不常用表
学生ID(PRI) | 籍贯 | 婚否 | 住址 |
---|---|---|---|
一对多
一对多,通常也叫作多对一的关系。通常一对多的关系设计的方案,在“多”关系的表中去维护一个字段,这个字段是“一”关系的主键。
母亲表
母亲ID | 姓名 | 年龄 | 身高 |
---|---|---|---|
M1 | |||
M2 |
孩子表
孩子ID | 姓名 | 年龄 | 身高 | 母亲ID |
---|---|---|---|---|
K1 | M1 | |||
K2 | M1 |
多对多
多对多:一张表中的一条记录在另外一张表中可以匹配到多条记录,反过来也一样。
多对多的关系如果按照多对一的关系维护:就会出现一个字段中有多个其他表的主键,在访问的时候就会带来不便。
既然通过两张表自己增加字段解决不了问题,那么就通过第三张表来解决。
师生关系
一个老师教过多个班级的学生;
一个学生听过多个老师讲的课;
首先得有两个实体:老师表和学生表
从中间设计一张表:维护两张表对应的联系:每一种联系都包含
多对多解决方案;增加一个中间表,让中间表与对应的其他表形成两个多对一的关系:多对一的解决方案是在“多”表中增加“一”表对应的主键字段。
- Post title:数据库基础
- Post author:John_Frod
- Create time:2021-02-02 18:04:04
- Post link:https://keep.xpoet.cn/2021/02/02/数据库基础/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.