MySQL数据库

    科技2022-07-12  143

    MySQL数据库

    一、数据库

    1、什么是数据库

    数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。

    每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。

    我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。

    所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

    RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:

    1.数据以表格的形式出现。2.每行为各种记录名称。3.每列为记录名称所对应的数据域。4.许多的行和列组成一张表格。5.若干的表格组成数据库database。

    2、RDBMS 术语

    RDBMS的一些术语:

    数据库: 数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。**行:**一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。**外键:**外键用于关联两个表。复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。**索引:**使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

    MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

    表头(header): 每一列的名称;列(col): 具有相同数据类型的数据的集合;行(row): 每一行用来描述某条记录的具体信息;值(value): 行的具体信息, 每个值必须与该列的数据类型相同;键(key): 键的值在当前列中具有唯一性。

    3、数据库分类

    数据库通常分为层次式数据库、网络式数据库和关系式数据库三种。

    而不同的数据库是按不同的数据结构来联系和组织的。

    而在当今的互联网中,最常见的数据库模型主要是两种,即关系型数据库和非关系型数据库。

    3.1、关系型数据库

    当前在成熟应用且服务与各种系统的主力数据库还是关系型数据库。

    代表:Oracle、SQL Server、MySQL。

    3.2、非关系型数据库

    随着时代的进步与发展的需要,非关系型数据库应运而生。

    代表:Redis、Mongodb

    NoSQL数据库在存储速度与灵活性方面有优势,也常用于缓存。

    4、数据库规范化

    经过一系列的步骤,我们现在终于将客户的需求转换为数据表并确立这些表之间的关系,那么是否我们现在就可以在开发中使用呢?答案否定的,为什么呢!同一个项目,很多人参与了需求的分析,数据库的设计,不同的人具有不同的想法,不同的部门具有不同的业务需求,我们以此设计的数据库将不可避免的包含大量相同的数据,在结构上也有可能产生冲突,在开发中造成不便。

    4.1. 什么是范式

    要设计规范化的数据库,就要求我们根据数据库设计范式――也就是数据库设计的规范原则来做。范式可以指导我们更好地设计数据库的表结构,减少冗余的数据,借此可以提高数据库的存储效率,数据完整性和可扩展性。

    设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。

    4.2、三大范式

    第一范式(1NF)

    所谓第一范式(1NF)是指在关系模型中,对列添加的一个规范要求,所有的列都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。

    第二范式(2NF)

    在1NF的基础上,非Key属性必须完全依赖于主键。第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。

    第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

    第三范式(3NF)

    第三范式是在第二范式基础上,更进一层,第三范式的目标就是确保表中各列与主键列直接相关,而不是间接相关。即各列与主键列都是一种直接依赖关系,则满足第三范式。

    第三范式要求各列与主键列直接相关,我们可以这样理解,假设张三是李四的兵,王五则是张三的兵,这时王五是不是李四的兵呢?从这个关系中我们可以看出,王五也是李四的兵,因为王五依赖于张三,而张三是李四的兵,所以王五也是。这中间就存在一种间接依赖的关系而非我们第三范式中强调的直接依赖。

    4.3、范式与效率

    在我们设计数据库时,设计人员、客户、开发人员通常对数据库的设计有一定的矛盾,客户更喜欢方便,清晰的结果,开发人员也希望数据库关系比较简单,降低开发难度,而设计人员则需要应用三大范式对数据库进行严格规范化,减少数据冗余,提高数据库可维护性和扩展性。由此可以看出,为了满足三大范式,我们数据库设计将会与客户、开发人员产生分歧,所以在实际的数据库设计中,我们不能一味的追求规范化,既要考虑三大范式,减少数据冗余和各种数据库操作异常,又要充分考虑到数据库的性能问题,允许适当的数据库冗余。

    常见的关系数据库:

    数据库系所属公司OracleOracleDB2IBMSQL ServerMSMySQLAB–>SUN–>Oracle

    特点比较:

    Oracle:运行稳定,可移植性高,功能齐全,性能超群!适用于大型企业领域,但是价格昂贵。DB2:速度快、可靠性好,适于海量数据,恢复性极强。适用于大中型企业领域,但是价格昂贵。SQL Server:全面,效率高,界面友好,操作容易,但是不跨平台。适用于中小型企业领域。MySQL:开源,体积小,速度快。适用于中小型企业领域。

    二、MySQL介绍

    1、MySQL概要

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

    MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

    MySQL官网:https://www.mysql.com/

    1.1、系统特性

    1.使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。

    2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。

    3.为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。

    4.支持多线程,充分利用 CPU 资源。

    5.优化的 SQL查询算法,有效地提高查询速度。

    6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。

    7.提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作数据表名和数据列名。

    8.提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。

    9.提供用于管理、检查、优化数据库操作的管理工具。

    10.支持大型的数据库。可以处理拥有上千万条记录的大型数据库。

    11.支持多种存储引擎。

    12.MySQL 是开源的,所以你不需要支付额外的费用。

    13.MySQL 使用标准的 SQL数据语言形式。

    14.MySQL 对 PHP 有很好的支持,PHP是目前最流行的 Web 开发语言。

    15.MySQL是可以定制的,采用了 GPL协议,你可以修改源码来开发自己的 MySQL 系统。

    16.在线 DDL/更改功能,数据架构支持动态应用程序和开发人员灵活性(5.6新增)

    17.复制全局事务标识,可支持自我修复式集群(5.6新增)

    18.复制无崩溃从机,可提高可用性(5.6新增)

    19.复制多线程从机,可提高性能(5.6新增)

    20.3倍更快的性能(5.7新增)

    21.新的优化器(5.7新增)

    22.原生JSON支持(5.7新增)

    23.多源复制(5.7新增)

    24.GIS的空间扩展(5.7新增)

    1.2、存储引擎

    MySQL数据库根据应用的需要准备了不同的引擎,不同的引擎侧重点不一样,区别如下

    MyISAM MySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务

    InnoDB 事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎

    BDB源 自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性

    Memory 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失

    Merge 将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用\

    Archive 非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差

    Federated 将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用

    Cluster/NDB 高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用

    CSV 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。

    BlackHole 黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继

    EXAMPLE 存储引擎是一个不做任何事情的存根引擎。它的目的是作为 MySQL 源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE 存储引擎不支持编索引。

    另外,MySQL 的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。

    2、SQL:结构化查询语言(Structured Query Language)。

    结构化查询语言是关系型数据库标准语言。特点:简单,灵活,功能强大。

    SQL包含6个部分:

    数据查询语言(DQL): 其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。数据操作语言(DML): 其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。事务处理语言(TPL): 它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。数据控制语言(DCL): 它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。数据定义语言(DDL): 其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。指针控制语言(CCL): 它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

    书写规范:

    1.数据库中,SQL语句大小写不敏感 2.SQL语句可单行或多行书写 3.在SQL语句中,关键字不能跨多行或缩写 4.为了提高可读性,一般关键字大写,其他小写 5.空格和缩进使程序易读

    三、SQL语言

    1、数据定义语言DDL(Data Definition Language)

    对象: 数据库和表

    关键词: create 、alter、 drop、 truncate(删除当前表再新建一个一模一样的表结构)

    **创建数据库:**create database 库名;

    **删除数据库:**drop database 库名;

    **切换数据库:**use 库名;

    **创建表:**create table 表名(

    字段名 类型(大小) 关系描述);

    查看数据库里存在的表:show tables;

    **修改表:**alter table 表名 约束;

    删除表:drop table 表名 ;

    查看生成表的sql语句:show create table 表名 ;

    查看表结构:desc 表名;

    注意:

    varchar类型的长度是可变的,创建表时指定了最大长度,定义时,其最大值可以取0-65535之间的任意值,但记录在这个范围内,使用多少分配多少,

    varchar类型实际占用空间为字符串的实际长度加1。这样,可有效节约系统空间。varchar是mysql的特有的数据类型。

    char类型的长度是固定的,在创建表时就指定了,其长度可以是0-255之间的任意值。虽然char占用的空间比较大,但它的处理速度快。

    create database school;# 建库 drop database school;# 删库 use school;# 用库 create table student( # 建表 id int(4) primary key auto_increment, name varchar(20), score int(3) ); show tables; alter table student rename to teacher; alter table student add password varchar(20); alter table student change password pwd varchar(20); alter table student modify pwd int; alter table student drop pwd; drop table student; show create table student; desc student;

    2、数据操纵语言DML(Data Manipulation Language)

    **对象:**纪录(行)

    关键词:insert 、update 、delete

    插入:insert into 表名 values(全属性); (插入所有的字段)

    insert into 表名(属性1,属性2) values (属性1,属性2); (插入指定的字段)

    更新:update 表名 set 属性1 = ‘值’,属性2= ‘值’ where 主键(通常) = 值;

    删除:delete from 表名 where 主键(通常) = 值;

    注意:

    ​ 开发中很少使用delete,删除有物理删除和逻辑删除,其中逻辑删除可以通过给表添加一个字段(isDel),若值为1,代表删除;若值为0,代表没有删除。此时,对数据的删除操作就变成了update操作了。

    truncate和delete的区别:

    ​ truncate是删除表,再重新创建这个表。属于DDL,delete是一条一条删除表中的数据,属于DML。

    insert into student values(01,'tonbby',99); insert into student(name,score) values ('kekebo',17),('someone',26); update student set name = 'tonbby',score = '999' where id = 01; delete from student where id = 4;

    3、数据查询语言DQL(Data Query Language)

    SELECT 查询字段 FROMAS 别名 WHERE 条件 select s.sname,s.sage from student AS s WHERE s.sno = "s001"

    select … from student where 条件 group by 分组字段 having 条件 order by 排序字段

    **执行顺序:**from->where->group by->having->order by

    3.1、条件查询

    简单条件运算符:> < = != <> >= <=

    逻辑运算符:&& || ! and or not (用于连接条件表达式)

    **模糊查询:**like、between and、in、is null

    3.2、排序查询

    语法:order by 子句 order by 排序字段1 排序方式1 , 排序字段2 排序方式2... 排序方式: ASC:升序,默认的。DESC:降序。 注意: 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

    3.3、聚合函数

    将一列数据作为一个整体,进行纵向的计算。

    count:计算个数

    一般选择非空的列:主键

    select count(id) from 表名

    max:计算最大值

    min:计算最小值

    sum:计算和

    avg:计算平均值

    注意:聚合函数的计算,排除null值。

    3.4、分组查询

    语法:group by 分组字段;注意: 分组之后查询的字段:分组字段、聚合函数where 和 having 的区别? where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来where 后不可以跟聚合函数,having可以进行聚合函数的判断。

    注意:

    ​ group by 通常和聚合函数(avg(),count()…)一起使用 ,经常先使用group by关键字进行分组,然后再进行集合运算。

    ​ group by与having 一起使用,可以限制输出的结果,只有满足条件表达式的结果才会显示。

    having和where的区别:

    ​ 两者起作用的地方不一样,where作用于表或视图,是表和视图的查询条件。having作用于分组后的记录,用于选择满足条件的组。

    #所有字段查询 SELECT * FROM `student` #带条件查询 SELECT * FROM `student` WHERE id > 1 SELECT * FROM `student` WHERE name like '%on%' SELECT * FROM `student` WHERE id BETWEEN 1 AND 3 SELECT * FROM `student` WHERE id not in(1,2,3) # 综合 SELECT *,AVG(score) FROM `student` WHERE id > 1 GROUP BY id HAVING AVG(score)>20 ORDER BY id DESC;

    3.5、分页查询

    语法:limit 开始的索引, 每页查询的条数;公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

    参与分页的信息:总记录数、每页最大数、当前页、每页显示最大记录数

    Limit :[(当前页-1)* 每页最大数,每页最大数];

    SELECT * FROM `student` WHERE id > 0 GROUP BY id ORDER BY id LIMIT 1 ,1;

    3.6、查询不重复的记录

    select distinct 字段 from 表名; eg: select distinct name from students;//查询名字不相同的学生; select distinct name,age from students;//查询名字和年龄同时不同的学生 1.distinct必须放在最开头 2.distinct只能使用需要去重的字段进行操作。 ----也就是说我sidtinct了name,age两个字段,我后面想根据id 进行排序,是不可以的,因为只能name,age两个字段进行操作. 3.distinct去重多个字段时,含义是:几个字段 同时重复 时才会被 过滤。

    四、其他

    数值类型

    类型大小范围(有符号)范围(无符号)用途TINYINT1 字节(-128,127)(0,255)小整数值SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值BIGINT8 字节(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值FLOAT4 字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值DOUBLE8 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值

    字符串

    字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

    char和varchar:

    1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。 2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。 3.char类型的字符串检索速度要比varchar类型的快。

    varchar和text:

    1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。 2.text类型不能有默认值。 3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

    类型大小用途CHAR0-255字节定长字符串VARCHAR0-65535 字节变长字符串TINYBLOB0-255字节不超过 255 个字符的二进制字符串TINYTEXT0-255字节短文本字符串BLOB0-65 535字节二进制形式的长文本数据TEXT0-65 535字节长文本数据MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据MEDIUMTEXT0-16 777 215字节中等长度文本数据LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据LONGTEXT0-4 294 967 295字节极大文本数据

    日期时间类型

    表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

    类型大小范围格式用途DATE3字节1000-01-01/9999-12-31YYYY-MM-DD日期值TIME3字节‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间YEAR1字节1901/2155YYYY年份值DATETIME8字节1000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值TIMESTAMP4字节1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

    二进制

    布尔:bit bit 表示1个二进制的位 bit(8) 表示8个二进制的位 性别可以定义为0,1, 而不使用male或female字符串 数据逻辑删除 某辆车在车库中停放的状态 所有基于两种状态的数据都可以使用0,1来存储.

    Processed: 0.010, SQL: 8