文章目录
一. MySQL介绍
了解mySQL
- MySQL目前属于Oracle甲骨文公司,大家熟悉的关系型数据库有微软的SQL Server,甲骨文的Oracle和MySQL
- MySQL分为企业版和社区版,其中社区版是完全免费并且开源的
- MySQL和其它关系型数据库有一个非常大的区别,就是支持可更换的插件式的存储引擎,其中InnoDB非常强大
- 目前goole、淘宝、百度、腾讯、新浪、facebook等大公司都在使用MySQL作为数据存储层方案
从技术上再了解
- MySQL设计成C/S客户端服务器模型,应用作为MySQL Client向MySQL Server发送请求,获取响应,因此MySQL非常适用于集群环境,方便做主从复制,读写分离操作
- 为了提高效率,MySQL Client和MySQL Server如果处在不同主机上,当然是通过Socket进行网络通信的;如果它们在同一台机器上,那么Client和Server之间是通过共享内存进行通信的,效率比Socket通信更高
- MySQL的服务器模块采用的是I/O复用+可伸缩的线程池,是实现网络高并发服务器的经典模型
二. SQL基础
SQL是结构化查询语言的缩写(Structure Query Language),它是关系型数据库的通用语言,非常强大,可以非常高效的进行数据库的增删改查操作,SQL+索引更是可以实现带各种附加条件的高效率查询操作。
SQL 语句主要可以划分为以下 3 个类别:
DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。
DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、update 和select 等。
DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。
学习关系型数据库,SQL是必须熟练应用的,这需要不断的实践操作!
三. MySQL数据类型
MySQL作为关系型数据库,在二维表中存数据,肯定要规定数据的类型,类型规定了数据的大小,因此使用的时候选择合适的类型,不仅会降低表占用的磁盘空间,间接减少了磁盘I/O的次数,提高了表的访问效率,而且索引的效率也和数据的类型息息相关。
1.数值类型
整数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
TINYINT | 1 | 有符号 : -128 无符号 : 0 | 有符号 : 127 无符号 : 255 |
SMALLINT | 2 | 有符号 : -32768 无符号 : 0 | 有符号 : 32767 无符号 : 65535 |
MEDIUMINT | 3 | 有符号 : -8388608 无符号 : 0 | 有符号 : 8388607 无符号 : 1677215 |
INT、INTEGER | 4 | 有符号 : -2147483648 无符号 : 0 | 有符号 : 2147483647 无符号 : 4294967295 |
BIGINT | 8 | 有符号 : -9223372036854775808 无符号 : 0 | 有符号 : 9223372036854775807 无符号 : 18446744073709551615 |
浮点数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
FOLAT | 4 | ±1.175494357E-38 | ±3.402823466E+38 |
DOUBLE | 8 | ±2.2250738585072014E-308 | ± 1.7976931348623157E+308 |
上图主要列出了整数类型和浮点数类型,在实际使用中,根据具体的场景选择合适的数据类型很重要!
2.日期和时间
日期类型也是做项目过程中,经常使用的类型信息,尤其是TIMESTAMP和DATETIME两个类型,但是注意TIMESTAMP会自动更新时间,非常适合那些需要记录最新更新时间的场景,而DATETIME需要手动更新。
3.字符串类型
字符串类型应该是使用最多的了,首先注意char和varchar的区别,然后注意TEXT和BLOB的区别,一般的字符串类型,我们选择varchar类型就可以了,如像博客之类,数据量比较大的类型就选择TEXT或者BLOB,但是TEXT只能存文本,而BLOB还可以存储二进制文件,比如图片等。
4.enum枚举类型和set集合类型
注意,这两个类型,都是限制该字段只能取固定的值,但是枚举字段只能取一个唯一的值,而集合字段可以取任意个值。
四. MySQl运算符
MySQL的运算符和Java语言很多运算符的含义是一样的,但也有区别,运算符多用在SQL语句当中,对SQL查询做各种条件过滤的。
1.算术运算符
2.逻辑运算符
NOT逻辑非 AND逻辑与 OR逻辑或
3.比较运算符
例如:
//使用算数运算符,把tcount_tbl表中所有记录的runoob_count字段更新,在原来的值上加1
update tcount_tbl set runoob_count=runoob_count+1;
//使用逻辑运算符and和关系运算符>=,把成绩及格的学生信息获取出来
select a.id a.name a.age a.sex from runoob_user a inner join runoob_score b on a.id = b.id and b.average>60.0;
五. 数据库范式
应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:
1)减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)
2)消除异常(插入异常,更新异常,删除异常)
3)让数据组织的更加和谐…
1.第一范式(1NF)
第一范式是指数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性
2.第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
例如,在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但由于非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,因此此种方式会导致数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分),新关系通过学生表中的外关键字课程号联系,在需要时进行连接。
简单说:消除部分依赖。
3.第三范式(3NF)
如果关系模型R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。
设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
以学生表(学号,姓名,课程号,成绩)为例,其中学生姓名无重名,所以该表有两个候选码(学号,课程号)和(姓名,课程号),故存在函数依赖:学号——>姓名,(学号,课程号)——>成绩,唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,所以属性属于第三范式。
简单说 : 建立在第二范式基础上,消除传递依赖。
4.BC范式(BCNF)
一个满足BCNF的关系模式的条件:
- 1.所有非主属性对每一个码都是完全函数依赖。
- 2.所有的主属性对每一个不包含它的码,也是完全函数依赖。
- 3.没有任何属性完全函数依赖于非码的任何一组属性。
假设仓库管理关系表(仓库号,存储物品号,管理员号,数量),满足一个管理员只在一个仓库工作;一个仓库可以存储多种物品,则存在如下关系:
(仓库号,存储物品号)——>(管理员号,数量)
(管理员号,存储物品号)——>(仓库号,数量)
所以,(仓库号,存储物品号)和(管理员号,存储物品号)都是仓库管理关系表的候选码,表中唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库号)——>(管理员号)
(管理员号)——>(仓库号)
即存在关键字段决定关键字段的情况,因此其不符合BCNF。把仓库管理关系表分解为两个关系表仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),这样这个数据库表是符合BCNF的,并消除了删除异常、插入异常和更新异常。
5.第四范式(4NF)
设R是一个关系模型,D是R上的多值依赖集合。如果D中存在凡多值依赖X->Y时,X必是R的超键,那么称R是第四范式的模式。
例如,职工表(职工编号,职工孩子姓名,职工选修课程),在这个表中,同一个职工可能会有多个职工孩子姓名,同样,同一个职工也可能会有多个职工选修课程,即这里存在着多值事实,不符合第四范式。如果要符合第四范式,只需要将上表分为两个表,使它们只有一个多值事实,例如职工表一(职工编号,职工孩子姓名),职工表二(职工编号,职工选修课程),两个表都只有一个多值事实,所以符合第四范式。
各范式的关系图 :
从上面对于数据库范式进行分解的过程中不难看出,应用的范式越高,表越多。
表多会带来很多问题:
1. 查询时需要连接多个表,增加了SQL查询的复杂度
2. 查询时需要连接多个表,降低了数据库查询性能
因此,并不是应用的范式越高越好,要看实际情况而定。第三范式已经很大程度上减少了数据冗余,并且基本预防了数据插入异常,更新异常,和删除异常了。