C语言与数据库知识精炼
## 数据库
基本
数据库管理系统的定义,功能,数据库管理员
数据是信息的一种符号化表示方法。
数据库是在计算机内部的,有组织的,可共享的,相互关联的大量数据集合。
数据库管理系统(dbms)是位于用户与操作系统之间的操纵和管理数据库的软件。
作用:它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
数据库管理员(Database Administrator简称dba)是负责数据库建立,使用和维护的专业人员。
数据库系统(dbs)是在计算机系统中引入数据库后的系统构成。
数据库的发展*
人工管理阶段,文件管理阶段,数据库系统阶段
数据库三层模式结构优点
优点:
1.保证了数据的独立性
模式和内模式分开,保证数据的物理独立性。
外模式和模式分开,保证数据的逻辑独立性。
2.简化用户接口
用户不需要了解数据库实际存储情况,也不需要对数据库存储结构了解,只要按照外模式编写应用程序就可以访问数据库。
3.有利于数据共享
所有用户使用统一概念模式导出的不同外模式,减少数据冗余,有利于多种应用程序间共享数据。
4.有利于数据安全保密
每个用户只能操作属于自己的外模式数据视图,不能对数据库其他部分进行修改,保证了数据安全性。
缺点:
1.保存三级结构两级映像增加了系统空间开销。
2.用户与数据库之间数据传输在三级结构之间切换增加了时间开销。
二级映像*
1.模式/内模式映像
确定了数据的全局逻辑结构与储存结构之间的对应关系。数据库模式,内模式都只有一个,故模式/内模式映像是唯一的。
2.外模式/模式映像
确定了数据的局部逻辑结构与全局逻辑结构之间的对应关系。
关系*
关系是(域的)笛卡尔积的有限子集。
关系是一个二维表。
关系是元组的集合。
候选键的定义,外键的定义
关系中某一属性或最小属性组的值能唯一标识一个元组称改属性或属性组为关系的候选键(Candidate Key)。
候选键中选择一个作为主键(Primary Key)。
关系R1的一个或一组属性不是R1的候选键,而是关系R2中的候选键,那么这个属性或属性集是R1的外键(Foreign Key)。R1为参照关系,R2为被参照关系或目标关系。
在关系模式中,能唯一标识元组的属性集称为超键(Super Key)。
关系模型/数据库完整性约束的定义
完整性约束是对关系的某种约束条件。它保护数据库中数据的正确性,有效性,相容性,防止不合语义的数据进入数据库。
三类完整性约束:
实体完整性:对关系中的记录唯一性,即主键的约束
参照完整性:对关系数据库中建立关联关系的数据表间数据参照引用的约束,即对外键的约束
用户定义的完整性:针对某一具体关系数据库的约束条件
E-R概念模型转换为关系模型的转换规则
er模型转换为关系模型的规则是:1、一个实体集转换为关系模型中的一个关系,实体的属性就是关系的属性,实体的码就是关系的码,关系的结构是关系模式。2、一个1:1联系可以转换为一个独立的关系,也可以与任意一端实体集所对应的关系合并。如果将1:1系转换为一个独立的关系,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,且每个实体的码均是该关系的候选码。3、一个m:n联系转换为一个关系:与该联系相连的各实体集的码以及联系本身的属性均转换为关系的属性,新关系的码为两个相连实体码的组合等等。
关系代数*
关系代数:并,差,交,广义笛卡尔积
关系运算:选择,投影,除,连接(内,左外,右外,全外)
对象
索引的定义,优点,缺点
索引是对数据库表中一列或多列的值进行排序的一种结构,建立索引是加快查询速度的有效手段,用户可以根据应用环境的需要,在基本表上建立一个或者多个索引,以提供多种存取路径,加快查询速度
优点:加快数据检索速度,唯一索引可以保证数据记录的唯一性,减少查询中排序和分组的时间,加快表与表之间的连接
缺点:占用存储空间,随着数据量的增加创建和维护索引耗费时间增加,对表中数据进行插入删除或更新时索引也要动态维护。
视图的定义,优点,作用,视图与基本表的不同
视图是从一个或多个基表(或视图)导出的虚表。它只存放视图的定义而不存放视图对应的数据。
优点:1.简化用户操作,2.使用户能从多种角度看待同一数据,3.实现数据库的逻辑独立性,4.能够对机密数据提供安全保护。
作用:1. 数据库视图隐藏了数据的复杂性。 2. 数据库视图有利于控制用户对表中某些列的访问。 3. 数据库视图使用户查询变得简单。
不同:
基表是内模式,视图是外模式。
基表有对应的物理数据,视图没有物理数据。
基表是具体的数据结构及内容,视图是可见的窗口。
基表可以及时进行修改,视图只能用创建的语句修改。
基本表是实表,视图是虚表。
视图的建立和删除只影响视图本身,不影响对应的基本表。
储存过程的定义,作用,优点
储存过程是数据库服务器上一组预先编译好的完成特定功能的SQL语句集,作为一个对象储存在数据库中作为整体被调用。用户给出存储过程名和参数后返回处理结果。
作用:提高程序设计的灵活性,实现了程序的模块化,有利于提高程序的执行速度,减少网络访问的负荷,作为一种安全机制来充分利用。
优点:1.提高SQL编程的灵活性,可复用性,安全性2.提高了数据库应用的开发效率和运行效率3.使SQL程序维护容易,减少开发人员工作量,缩短开发周期。
触发器的定义
触发器是在数据库中发生特定操作后自动运行的一种特殊的储存过程。
优点:1.提高了数据管理的效率和完整性2.可以实现更为复杂的数据完整性要求3.表数据修改后根据其差异采取相应的措施4.防止恶意或错误的插入,删除,更新操作。
游标的定义,作用
游标是一种临时的数据库对象,它将查询结果转换成一个记录序列,并定义了一个指向一条记录的指针来指示游标中的当前记录位置。
作用:保存查询结果方便以后使用,提高重复查询数据库效率。
关系
函数依赖*
数据依赖是关系模式中各属性值之间存在的相互依赖与制约关系。最重要的是函数依赖。
关系范式*
<br/>### 安全 数据库安全性的定义
数据库的安全性是指保护数据库,防止非法使用造成的数据泄露、更改或破坏。
数据库安全性保护常用措施/安全性控制的常用方法
安全性控制是指要尽可能地杜绝所有可能的数据库非法访问。
方法:身份认证,存储控制,视图机制,数据加密,审计追踪
什么是数据库恢复与其基本技术,恢复基本方法
数据库恢复是指把数据库从错误状态恢复到某一正确状态。
数据库恢复的基本原理就是数据的“冗余”。因此恢复系统应该提供生成冗余数据与冗余重建功能。
数据库恢复(生成冗余)的基本技术是数据转储和登计日志文件。当系统发生故障,利用转储的数据库后备副本和日志文件就可以将数据库恢复到故障前的某个一致性状态。
恢复基本方法:数据库恢复的基本原理是“冗余”,利用储存在系统其它地方的冗余数据来重建数据库中已破坏或不正确的那部分数据。因此需要生成冗余数据与冗余重建功能。生成冗余数据的方法是数据转储,登记日志文件。
数据库运行过程中可能产生哪几类故障与其具体内容和恢复策略,哪些故障影响事务正常执行,哪些故障破坏数据库数据
1.事务故障:事务内部的故障可分为预期的和非预期的,其中大部分故障都是非预期的。预期的事务内部故障是指可以通过事务程序本身发现的事务内部故障;非预期的事务内部故障是不能由事务程序处理的,如运算溢出故障,并发事务死锁故障、违反了某些完整性限制而导致的故障等。
预期的事物内部故障:将事物回滚,撤销数据库的修改。非预期的事物内部故障:强制回滚事务,在保证该事务对其他事务没有影响的条件下,利用日志文件撤销其对数据库的修改。
2.系统故障:是指数据库在运行过程中,由于硬件故障、数据库软件及操作系统的漏洞、突然停电灯情况,导致系统停止运转,所有正在运行的事务以非正常方式终止,需要系统重新启动的一类故障。这类事务不破坏数据库,但是影响正在运行的所有事务。
待计算机重新启动之后,对于未完成的事务可能写入数据库的内容,回滚所有未完成的事务写的结果;对于已完成的事务可能部分或全部留在缓冲区的结果,需要重做所有已提交的事务。
3.介质故障:介质故障也称为硬故障,主要指数据库在运行过程中,由于磁头碰撞、磁盘损坏、强磁干扰、天灾人祸等情况,使得数据库中的数据部分或全部丢失的一类故障。
使用数据库备份及事务日志文件,通过恢复技术,恢复数据库到备份结束时的状态。介质故障的硬件容错:采用双物理存储设备,使两个硬盘存储内容相同,当其中一个硬盘出现故障时,及时使用另一个备份硬盘。
4.计算机病毒:计算机病毒故障是一种恶意的计算机程序,它可以像病毒一样繁殖和传播,在对计算机系统造成破坏的同时也可能对数据库系统造成破坏(破坏方式以数据库文件为主)。
使用防火墙软件防止病毒侵入,对于已感染病毒的数据库文件,使用杀毒软件进行查杀,如果杀毒软件杀毒失败,此时只能用数据库备份文件,以软件容错的方式恢复数据库文件。
事务故障,系统故障会影响事务的正常执行
介质故障,计算机病毒会破坏数据库数据
数据库日志的定义和作用
数据库日志是用来记录事务对数据库的更新操作的文件
作用:记录所有对数据库数据的修改,保护数据库并在故障发生后,对数据库进行恢复
并发
事务的定义与ACID特性
事务是数据库系统中执行的一个工作单位,是数据库上的一个或多个操作的序列。事务可以是一组SQL语句或整个程序。
ACID:原子性(要么不做要么全做)、一致性(数据库从一个一致性状态变到另一个一致性状态,转账有增有减)、隔离性(互不干扰)、持久性(数据的改变是永久性的)
数据库的一致性是指事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。
封锁的定义,基本类型
封锁指事务在对某个数据对象操作之前,先向系统发出请求对其加锁,加锁后该事务对该数据对象有了控制权,只有该事务对其解锁后,其它事务才能更新它。
封锁分为:
排它锁或X锁。禁读写。若事务对数据对象加上X锁,则其它事务不能对数据对象进行任何操作,不能对该数据对象加任何类型的锁,直到释放锁。
共享锁或S锁。禁止写。若事务对数据对象加上S锁,则其它事务只能查询不能修改数据对象,只能对该数据对象加S锁而不能加X锁,直到释放锁。
并发控制的定义,为什么要并发控制,数据库并发操作会带来哪些问题,用什么方法可以避免各种不一致的情况,并发控制技术能保证事务的哪些特性
并发控制是指为了发挥数据库共享资源的特点,充分利用数据库资源,允许多个用户同时并发访问数据,必须对并发操作进行控制,防止产生操作冲突,破坏数据的完整性。
为什么要并发控制:并发控制机制能解决上述问题,以保持数据库中数据在多用户并发操作时的一致性,正确性。
并发操作会引发:丢失更新,不可重复读,污读。
避免不一致:用并发控制机制来解决各种不一致问题。
保证事务特征:并发控制可以保证事务的一致性和隔离性,保证数据库的一致性。
拓展
大数据的四大特征*
数据体量大,数据类型繁多,数据产生的速度快,数据价值密度低
为什么使用nosql
nosql是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称。
NoSQL泛指非关系型的数据库。满足web2.0需求,具有灵活的水平可扩展性,支持海量数据存储和管理。
数据仓库的定义,数据挖掘的定义与功能,数据挖掘与数据仓库的关系
数据仓库是一个面向主题的,集成的,不可更新的,随时间不断变化的数据集合,用以支持企业的决策分析。
数据挖掘是指从大量的,不完全的,有噪声的,模糊的和随机的数据中提取出隐含在其中,人们事先不知道的,但是有潜在价值的信息和知识的过程
数据挖掘的功能:
1.能够预测未来趋势和行为的功能
以前需要进行大量手工分析的问题,现在运用数据挖掘技术就能够自动地在数据库中查找预测信息,并可以依据数据迅速地得出结论。就像预测销售金额一样,可以利用数据挖掘技术对以前促销的全部数据进行分析,就基本上可以锁定未来投资中有最大回报的客户等等。
2.聚类和概念描述
数据库中的数据可以划分成一系列有意义的集合,也就是聚类。它增强了人们对客观事实的认识,是概念描述的前提。概念描述就是描述某一类物体的本质,概括了这类物体的相关特性。
3.关联分析和偏差检测
数据关联是指在数据库中已经存在,能够被发现的一类别的信息。关联性就是指各变量的取值有一定的规律。关联分析就是要找出隐匿在数据库中的有彼此相关和联系的网络。由于库中数据的关联性既不明确又不确定性,因此相关分析结果是可信的。在数据库中,有时会出现异常偏差数据,如不符合规则的特殊情况、观测结果与模型预测值之间的偏差等,对此类数据的检测就具有重要意义。测量误差的一般方法是,找出观测值和参考值的差异,然后进行对比分析,给出参考结论。
数据挖掘技术还可能带来隐私披露、数据滥用等一系列问题,因此,必须规范数据挖掘技术的使用。同时,需要利用加密、访问控制和网络安全机制保护技术等技术手段来保护信息安全,以保证数据信息不被窃取、更改或秘密访问。
关系:数据仓库是为了数据挖掘做预准备,数据挖掘可建立在数据仓库之上。最终目的都是为了提升企业的信息化竞争能力。
相对于数据库,xml在数据应用方面的优缺点
第一,跨平台。XML 文件为纯文本文件,不受操作系统、软件平台的限制;
第二,易表义。XML 具有基于Schema 自描述语义的功能,容易描述数据的语义,这种描述能为计算机理解和自动处理。
第三,XML 不仅可以描述结构化数据,还可以有效描述半结构化,甚至非结构化数据。
但另一方面,XML 技术在数据管理方面存在明显缺点。
首先,XML 技术采用的是基于文件的管理机制,文件管理存在着容量大、管理困难的缺点;
第二,目前XML 的检索是基于节点的检索,存放大量甚至海量数据的XML 文件造成检索速度极低;
第三,解析手段有缺陷。XML 具有两种解析机制,SAX 方式是基于文件的解析,速度慢,DOM 方式是基于内存的方式,资源消耗极大;
第四,修改效率低,目前XML的修改是基于节点的;
最后,XML的安全性及并发操作机制也是需要解决的问题之一。
设计
数据库设计基本步骤,数据库六个设计阶段与其主要工作
需求分析:收集数据库所有用户的信息内容和处理要求并加以规范化和分析。
概念结构设计:把用户的信息要求统一到一个整体逻辑结构中,此结构能够表达用户的要求,是一个独立于DBMS软件和硬件的概念模型(E-R模型)。
逻辑结构设计:将概念模型转换为某个DBMS支持的数据模型并对其优化。
物理设计:为逻辑数据模型建立一个完整的能实现的数据库结构,包括储存结构和存取方法。
数据库实施:组织数据入库,建立具体数据库并编写和调试应用程序。应用程序目标是开发一个可依赖的有效的数据库存取程序。
数据库运行与维护:数据库运行,收集和记录实际系统运行的数据并维护系统。
数据字典的定义
数据流图(DFD)是SA方法中用于表示系统模型的一种工具,以图形的方式描绘数据在系统中流动和处理的过程。
数据字典(Data Dictionary,DD)是对系统中数据的详细描述,是各类数据结构和属性的清单。数据字典是结构化分析的核心。
作用:
1.管理系统数据资源
数据字典提供了管理和收集数据的方法。
2.实现数据标准化
在数据库中,数据的名称、格式和涵义等在不同的场合下容易混淆,数据字典提供使之标准化的工具,它可以给这些内容予以统一的名称、格式和涵义。
3.使系统的描述文体化
所有和系统有关的描述,都可以对数据字典中的信息进行查询、插入、删除和修改。
4.作为设计的工具
由于数据字典中存放着与数据库有关的各种信息和原始资料,就为数据库设计提供了有力的工具。
5.为数据库提供存取控制和管理
数据库在接受每一个对数据库的存取请求时,都要检查用户标识、口令、子模式、模式和物理模式等。所以从某种意义上讲,数据字典控制了数据库的运行。
6.供DBA进行各种查询
以便了解系统性能、空间使用状况和各种统计信息,及时掌握数据库的动态。
设计一款完善数据库应用应该注意的问题
1.需求分析是基础
2.将所有人的观点列入考量
要设计好的数据库,必须考虑所有相关利益者的观点。在构建数据库之前,先去收集信息,了解他们对数据库的期望以及对数据库的操作熟练度。这样就能得出数据库应当采用的技术水平,以及是否要就数据库的功能来训练用户。
3.选择符合需求的数据库类型
数据库有多种类型,选择正确类型则是数据库设计的关键。我们可以将数据库以两种方式分类。一是基于数据库用以定义和操作数据的查询语言。使用SQL的数据库是结构化数据最常用的类型。然而,由于NoSQL数据库的可伸缩性、灵活性和速度更优,它们更适合机器学习、网络分析以及物联网(IoT)使用。第二种分类方式则是基于数据模型。这样分类会有四种类型:关系数据库、分层数据库、网络数据库以及面向对象的数据库。研究数据库的不同类型,并针对应用需求作出选择,这是必要的初始步骤。
4.以一致的方式来定义与标记表和列
在定义数据项以及标记表与列时,遵从一致性原则非常重要,可以帮助我们更好地理解数据。命名表与列的最佳实践之一便是使用简单的名字来定义其包含的数据。比如:只需将包含用户名称的列标记为“CustomerName”(“用户名”)即可。应当避免使用复数名(如CustomerNames)、缩写(如CN),并且名称中不得使用空格(如Customer Name)。如果坚持遵守这些规则,则将来的用户在使用数据库时会更容易。
5.规范化是关键
数据库的规范化指的是将数据库中的所有信息组织起来,避免数据重复和冗余。简单来说,规范化是将数据打散分配到多个较小的相关表中,而不是统统存在一个大表里。将数据规范化是很好的数据库设计实践,有助于提高效率。但是请确保不要过度规范化,否则将会把数据分散到太多的小表中,反而造成混乱。
6.数据库设计的文档化很重要
事实上,文档化并非人见人爱,因为实在太烦了。但要记得,文档化对于良好的数据库设计至关重要,可以追踪所有的小细节。数据库设计应当附有指示说明、ER图、存储过程及所有其他相关的信息。文档还应当为编程者和终端用户提供足够信息量,确保他们能够理解并使用。
7.隐私是首要考量
很多时候,存储在数据库中的信息是加密信息,隐私就成了一个值得关注的问题。为了获得最大程度的安全性,我们应当对密码加密,使用身份验证来限制数据库的访问,并使用另一个服务器来存放数据库,而不是应用所在的服务器。这将确保你的数据不受攻击和隐私侵犯的威胁。
8.考虑长期需求
优秀的数据库设计应当具备可伸缩性,即:在使用量增加的情况下,仍然能承受较高的工作负载,并保障应用的运行。对工作量可能会有所改变的企业来说,在设计数据库时牢记此项至关重要。例如:如果一个电子商务网站预计当销售量增长时,访客会在一个月内急速增加,那么在设计数据库时应当将这一点列入考量,以便数据库可以响应迅速增长的访客,并保持在高工作负载的情况下运作。
9.代码以及使用预存程序
数据库设计中的常见错误之一,就是不使用预存程序。预存程序指的是,在操作数据时手边随时可用的提前预存代码串。例如,如果有个SQL查询是常用的操作指令,则将它提前写入预存程序,而不是在用的时候重新来写,就会让工作简单起来。一旦有了预存程序,就可以在需要时一步执行并载入这个SQL查询了。编写大量预存程序是个吃力的工作,但如果花时间完成并用文档记录下来的话,对终端用户来说,使用数据库就更加轻松了。
10.在数据库建模和设计上投入时间
优秀数据库设计的专业技巧之一是在数据库建模和设计上投入时间和精力。开发者常见的错误就是忽略这一步以节省时间,将重点放在软件开发更重要的其他方面上。但是,数据库设计对于保障应用的功能来说非常关键。如果一味想节省时间,不仔细思考设计的话,未来就会需要花费更多时间来维护数据库,甚至重新设计。
11.测试设计
测试也是数据库设计很关键的步骤,而且经常会被疏忽对待,甚至完全跳过,只为了赶DDL。我们应当在发布项目前,花些时间来彻底测试数据库设计,以确保其满足了所有计划中的需求,且正常运行。
12.系统安全性与恢复方法,日志与转储,数据加密
mysql代码
创建表
create table classes(
id int unsigned auto_increment primary key not null,
name varchar(10)
);
create table students(
id int unsigned primary key auto_increment not null,
name varchar(20) default '',
age tinyint unsigned default 0,
height decimal(5,2),
gender enum('男','女','人妖','保密'),
cls_id int unsigned default 0
);
CREATE TABLE IF NOT EXISTS `user`(
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`date` DATE,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
表的结构
<br/>修改表
<br/>查询表
<br/>安全与效率
<br/>## C语言 全局变量和局部变量的定义,局部变量的储存类型
全局变量是所有函数外部定义的变量,作用域是整个程序。
局部变量是定义在函数体内部的变量,作用域仅限于函数体内部。
局部变量的储存类型:auto,static,register
函数参数传递的形式与特点
函数参数传递方式有值传递,地址(指针)传递和引用传递
值传递:函数调用时,发生的数据传送是单向的。实参的值传送给形参而不能反向传递
地址(指针)传递:将主函数开辟的内存空间首地址传递给子函数,子函数可以读写主函数的内存空间,子函数结束后,该内存空间不会释放,主函数将继续利用这段内存空间
引用传递:调用函数时将实际参数的地址传递到函数中,在函数中对参数的修改会影响到实际参数
static的作用
函数体内:变量在函数被调用过程中值不变
模块内,函数体外:变量可被该模块内函数访问,不能被模块外函数访问,是一个限制在声明它的模块的本地范围的全局变量
面向对象的特征并简要解释
继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B 系统有多种提供服务的式,但一切对 A 系统来说都是透明的。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
数据库原理
数据库系统概述
基本概念
1、数据(Data):数据是数据库中存储的对象。描述事物的符号记录称为数据。数据和关于数据的解释是不可分的。数据的解释是指对数据含义的说明,数据的含义称为数据的语义,数据与其语义是不可分的。
2、数据库(DataBase,DB):数据库是长期存储在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述、存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。数据库中的数据具有永久存储、有组织和可共享三个基本特点。
3、数据库管理系统(DataBase Management System,DBMS):数据库管理系统在数据库建立、运用和维护时对数据库进行统一控制,以保证数据的完整性和安全性,并在多用户同时使用数据库时进行并发控制,在发生故障后对数据库进行恢复。
数据库管理系统是位于用户和操作系统之间的一层数据管理软件。用于科学的组织和存储数据,高效的获取和维护数据。主要功能:
数据定义功能(数据定义语言,DDL)**
数据组织、存储和管理
数据操纵功能(数据操纵语言,DML)
数据库的事务管理和运行管理
数据库的建立和维护
其他功能
**4、数据库系统(DataBase System,DBS):数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员(DataBase Administrator,DBA)组成的存储、管理、处理和维护数据的系统。
数据管理技术的三个阶段
人工管理阶段、文件系统阶段、数据库系统阶段
数据库系统的特点
1、数据结构化:数据库系统实现整体数据的结构化,这是数据库的主要特征之一,也是数据库系统与文件系统的本质区别。在文件系统中,文件中的记录内部有结构,但记录的结构和记录之间的联系被固化在程序中,由程序员维护。数据不再仅仅面对某一个应用,而是面向整个系统,不仅数据内部是结构化的,而且整体是结构化的,数据之间是具有联系的。
2、数据的共享性高、冗余度低且易扩充:数据面向整个系统。数据共享可以大大减少数据冗余,节约存储空间,还能避免数据间的不相容性与不一致性。这使数据库系统弹性大,易于扩充。
数据独立性高:数据独立性包括物理独立性和逻辑独立性。**
**(1)物理独立性是指用户的应用程序和数据库中数据的物理存储是相互独立的。
(2)逻辑独立性是指用户的应用程序和数据库的逻辑结构是相互独立的。
4、数据由数据库管理系统统一管理和控制:数据库的共享会带来数据库的安全隐患,而且共享是并发的(多用户同时存取数据)。数据库中数据的正确和一致要得到保障。为此,数据库管理系统要提供数据控制功能:**
(1)数据的安全性保护,指保护数据以防止不合法使用造成的数据泄密和破坏。
(2)数据的完整性检测, 指数据的正确性、有效性和相容性。
(3)并发控制,对多用户的并发操作加以控制和协调。
**(4)数据库恢复,从错误状态恢复到某一已知的正确状态。
数据模型
数据模型应满足三方面要求:一是能比较真实地模拟现实世界,二是容易被人理解,三是便于在计算机上实现。
数据模型通常由数据结构、数据操作和数据的完整性约束条件组成(三要素)。
概念模型
第一类是概念模型,第二类是逻辑模型和物理模型。
概念模型也叫信息模型,按用户的观点对数据和信息建模,主要用于数据库设计。
1、信息世界基本概念**
(1)实体(entity),客观存在并可相互区别的事物称为实体。
(2)属性(attribute),实体所具有的某一特性称为属性。
(3)码(key),唯一标识实体的属性集称为码。
(4)域(Domain):属性的取值范围称为该属性的域。
(5)实体型(entity type),用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。如,学生(学号,姓名,性别)就是一个实体型。
(6)实体集(entity set),同一类型实体的集合称为实体集。如,全体学生。
**(7)联系(relationship),现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系。一对一,一对多和多对多等。
E-R模型
概念模型的表示方法:实体-联系方法(E-R)
实体-联系方法(Entity-Relationship Approach),E-R方法也叫E-R模型。E-R图(E-R diagram)。
逻辑模型
逻辑模型包括层次模型、网状模型、关系模型、面向对象模型等,按计算机系统的观点对数据建模,主要用于数据库管理系统的实现。
物理模型
物理模型是对数据最底层的抽象,描述数据在系统内部的表示方法和存取方法,或在磁盘上的存储方法和存取方法,面向计算机系统。
先将现实世界抽象为信息世界,再将信息世界转换为机器世界。
数据库系统的三级模式结构与二级映像
三级模式
模式(schema): 模式也称逻辑模式或概念模式,是数据库全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。反映的是数据的结构及其联系,模式是相对稳定的,是数据库数据在逻辑上的视图,一个数据库只有一个模式。
外模式(external schema): 外模式也称子模式或用户模式,局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一个应用有关的数据的逻辑表示。(对应于某一应用)。
**外模式通常是模式的子集,一个数据库可以有多个外模式,但一个程序只能使用一个外模式。
内模式(internal schema): 内模式也称存储模式,它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。一个数据库只有一个内模式。
二级映像
外模式/模式映像: 外模式/模式映像保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
模式/内模式映像: 保证了数据与程序的物理独立性,简称数据的物理独立性。
模式的地位:是数据库系统模式结构的中间层**
①与数据的物理存储细节和硬件环境无关
②与具体的应用程序、开发工具及高级程序设计语言无关
外模式(也称子模式或用户模式):
①数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
②数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
外模式的用途:①保证数据库安全性的一个有力措施 ②每个用户只能看见和访问所对应的外模式中的数据
内模式(也称存储模式):
①是数据物理结构和存储方式的描述
②是数据在数据库内部的表示方式:
**数据库三级模式体系结构的划分,有利于保持数据库的数据独立性
关系数据库与关系运算
关系的基本运算
选择:从关系中找出满足给定条件的元组的操作;**
投影:从关系中选出若干属性构成新的关系的操作;
**连接:两个或多个关系根据关联字段合并为一个新的关系的操作。
关系:关系模型的数据结构非常简单,只包含单一的数据结构——关系。
域:一组具有相同数据类型的值的集合。
笛卡儿积:域上的一种集合运算。
一个域允许的不同取值个数称为这个域的基数。
关系:笛卡儿积的有限子集。
定义:D1xD2x...xDn的子集叫做在域D1,D2,...,Dn上的关系,表示为:
R(D1,D2,...,Dn) (R表示关系的名字,n是关系的目或度(degree))
当n=1:单元关系或一元关系
当n=2:二元关系 (n目关系必有n个属性)
关系中的每个元素是关系中的元组,通常用t表示。
关系是一张二维表,表中的每一行对应一个元组,表中的每列对应一个域。域可相同,为了区分得给每列起名,称为属性。
若关系中的某个属性组的值能唯一标识一个元组,而其子集不能,则称该属性组为候选码。若一个关系中有多个候选码,则选定其中一个为主码。候选码的属性称为主属性。
一般来说,笛卡儿积的某个真子集才有实际意义。
关系的三种模式:基本关系(又称基本表或基表)、查询表和视图表。
(1)基本关系(基本表或基表):实际存在的表,是实际存储数据的逻辑表示**
(2)查询表:查询结果对应的表
**(3)视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
基本关系5种特质:
(1)列是同质的,即每一列中的分量是同一类型的数据,来自同一个域。
(2)不同的列可出自同一个域,其中的每一列为一个属性,不同属性要给予不同属性名。
(3)列或行的顺序无所谓,即列的次序或行的次序可以任意交换。
(4)任意两个元组的候选码不能取相同的值。
(5)分量必须取原子值,即每一个分量都必须是不可分的数据项。
关系模式(Relation Schema)是型,关系是值
关系模式:是对关系的描述,是静态的、稳定的。
关系:关系模式在某一时刻的状态或内容,动态的、随时间不断变化的。
一个关系模式应当是一个五元组:R(U,D,DOM,F)**
R:关系名,它是符号化的元组语义
U:一组属性
D:属性组中所来自的域
DOM:属性到域的映射
F:属性组U上的一组数据依赖
**其中D和DOM对模式设计关系不大,所以可以当做三元组:R(U,F)
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。
三大要素:运算对象(关系)、运算符(集合运算符和专门的关系运算符)和运算结果(关系)
关系代数五种基本操作和四种组合操作**
**五种基本操作:
并(Union):设关系R和关系S具有相同的元数n,且相应的属性取自同一个域,则关系R和关系S的并由属于R或属于S的元组组成,其结果仍为n元的关系
差(Difference):设关系R和关系S具有相同的元数n,且相应的属性取自同一个域,则关系R和关系S的差由属于关系R而不属于关系S的元组组成,其结果仍为n元的关系
笛卡尔积(Cartesian Product):设关系R和关系S的元数分别为r和s。定义R和S的笛卡尔积是一个(r+s)元的元组集合,每个元组的前r个分量来自R的一个元组,后s个分量来自S的一个元组
投影(Projection):对关系进行垂直分割,消去某些列,并重新安排列的顺序,再删去重复元组
选择(Selection):根据某些条件对关系做水平分割,即选择符合条件的元组
四种组合操作:
交(Intersection):设关系R和关系S具有相同的元数n,且相应的属性取自同一个域,则关系R和关系S的交由既属于关系R又属于关系S的元组组成,其结果仍为n元的关系。关系的交可以由关系的差来表示。
联接(Join):联系操作是笛卡尔积和选择操作的组合。
自然联接(Natural Join):是一种特殊的等值联接,它要求两个关系中进行比较的分量必须是相同的属性组,并且要在结果中把重复的属性去掉。
一般的连接操作是从行的角度进行运算,但自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。
两个关系R和S在做自然连接时,选择两个关系在公共属性上值相等的元组构成新的关系。此时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,同样,S中某些元组也可能被舍弃。这些被舍弃的元组称为悬浮元组。如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL),那么这种连接就叫做外连接。只保留左边关系的悬浮元组叫左外连接,右则右外连接
除(Division):设两个关系R和S的元数分别为r和s(设r>s>0),那么R除S是一个(r-s)元的元组的集合。它是满足下列条件的最大关系:其中每个元组t与S中的每个元组u组成的新元组<t,u>必在关系R中。除运算是笛卡尔积的逆运算。关系操作的特点是集合操作方式:操作的对象和结果都是集合,一次一集合的方式
SQL语言
SQL特点:综合统一,高度非过程化(只需要提出“做什么”,不需要指明“怎么做”,因而无须了解存储路径。),面向集合的操作方式,以同一种语法结构提供多种使用方式,语言简洁易学易用。
分类
DQL(Data Query Language)数据查询语言
DML(Data Manipulation Language)数据操作语言
关键字:insert、delete、update, select
插入、删除、更改数据**
DDL(Data Denifition Language)数据定义语言**
关键字:create、drop、alter
**创建、删除、更改数据库对象(表、视图、索引、触发器、存储过程等)
DCL(Data Conrtol Language)数据控制语言**
关键字:grant、revoke
**用来设置或更改数据库用户或角色权限
TCL(Trasactional Conrtol Language)事务控制语言**
关键字:commit、rollback
**用来提交和回滚事务
基本表:本身独立存在的表,SQL中一个关系就对应一个基本表,一个(或多个)基本表对应一个存储文件,一个表可以带若干索引
视图:从一个或几个基本表导出的表,数据库中只存放视图的定义而不存放视图对应的数据**
**视图是一个虚表,用户可以在视图上再定义视图
创建数据库:**
**CREATE DATABASE <数据库名>;
创建基本表:**
**CREATE TABLE <表名>(
<列名> <数据类型>[ <列级完整性约束条件> ],**
<列名> <数据类型>[ <列级完整性约束条件>] , …
**<表级完整性约束条件> ] );
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
1、表的常用的数据类型
char(n) :长度为n的定长字符串。**
varchar(n) :最大长度为n的变长字符串。
smallint :短整数,2字节
int :长整数,4字节。
float(n) :可选精度的浮点数,精度至少为n位数。
numeric(p,d) :定点数,由 p 位数组成(不包括符号、小数点),小数点后有 d 位数字。
boolean :布尔类型。
date :日期,格式为 年-月-日(YYYY-MM-DD)。
time :时间,格式为 时-分-秒(HH:MM:SS)。
**2、表的常见列级完整性约束条件
not null :列值不为空。**
unique :列值唯一,如学生学号。
check (语句) :列值要满足相应条件,如性别只能选男/女。
primary key :列值为主码。
**3、表的常见表级完整性约束条件
primary key( 列1,列2,…,列n ):主码由列 1 至列 n 组成。**
foreign key (列名) references <参照的表名>(列名):外码参照了某表。
修改基本表:
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
**[ ALTER COLUMN<列名> <数据类型> ];
删除基本表:**
DROP TABLE <表名>[RESTRICT| CASCADE];
RESTRICT:删除表是有限制的。欲删除的基本表不能被其他表的约束所引用;如果存在依赖该表的对象,则此表不能被删除。
**CASCADE:删除该表没有限制。在删除基本表的同时,相关的依赖对象一起删除
数据查询:**
**SELECT [ALL|DISTINCT] <目标列表达式>[,…,<目标列表达式>] FROM <表名或视图名>[,…, <表名或视图名> ] WHERE <条件表达式> ][ ORDER BY <列名2> [ ASC|DESC ] ];
WHERE子句常用查询条件
比较:= , > , < , >= , <= , != , <>(不等于), 聚集函数 聚集函数不能当WHERE的子句条件,HAVING和SELECT里都可以用。 COUNT( ) :统计元组个数,“ ”表示元组。** from子句:指定查询对象(基本表或视图) where子句:指定查询条件 group by子句:对查询结果按指向列的值分组,该属性列值相等的元组为一个组,通常会在每组中作用聚集函数。 having短语:只有满足指定条件的组才予以输出 order by子句:对最终查询结果表按指定列值的升序(asc)或降序(desc)排序。 整个select语句的含义是:根据where子句的条件表达式从from子句指定的基本表、视图或派生表中找出满足条件的元组,再按select子句中的目标列表达式选出元组中的属性值形成结果表,然后根据group by (having)、order by、distinct等对结果表做进一步处理后返回最终的结果表。 1、查询所有列时,<目标列表达式>指定为*。<目标列表达式>可以是表中的属性列,也可以是表达式,还可以是字符串常量。用户可以通过指定别名来改变查询结果的列标题。 2、选择表中元组时可以指定distinct,即查询结果会消除重复行。默认是all(不管重复行,全部显示在查询结果表中)。 3、字符匹配之通配符: %(百分号)表示任意长度(可为0)的字符串,例如a%b,表示以a开头,以b结尾的任意长度的字符串。 _(下横线)表示任意单个字符,例如a_b,表示以a开头,以b结尾的长度为3的任意字符串。 注意:如果用户要查询的字符串本身就含有通配符%或_,这时就要使用 escape'<换码字符>' 短语对通配符进行转义。 4、涉及空值的查询,"IS"不能用等号(=)代替。 and的优先级高于or,当条件比较复杂时建议书写时带上括号。 5、当聚集函数遇到空值时,除count(*)外,都跳过空值而只处理非空值。聚集函数只能用于select子句和group by中的having子句。 6、where子句与having短语的区别:对象不同。 where子句作用于基本表或视图,从中选择出满足条件的元组,having短语作用于组,从中选择出满足条件的组。 ②连接查询** 2、等值与非等值连接查询:where子句用来连接两个表的条件称为连接条件,当连接运算符为=时即称为等值连接,否则非等值连接。连接条件的列名称为连接字段,连接条件中的各连接字段类型必须是相容的,名字可不相同。 3、自身连接:连接操作可以是一个表与其自己进行连接。此时注意要给表取别名。 4、外连接:连接后把悬浮元组保存在结果关系中。有左外连接和右外连接。 5、多表连接:连接操作可以是两个以上的表进行连接。执行时一般是先进行两个表的连接操作,再将其连接结果与第三个表进行连接,以此类推。 ③嵌套查询** SQL语言允许多层嵌套查询,子查询的select语句中不能使用order by子句,order by子句只能对最终查询结果排序。用户可以用多个简单查询构成复杂的查询,从而增强SQL的查询能力。 1、带有IN谓词的子查询 子查询的结果往往是一个集合。 不相关子查询:子查询的查询条件不依赖于父查询。 相关子查询:子查询的查询条件依赖于父查询。整个查询语句称为相关嵌套查询。求解时需反复求值。 2、带有比较运算符的子查询 指父查询与子查询之间用比较运算符进行连接。子查询返回单值时可以用比较运算符。 3、带有any或all的子查询 子查询返回多值时用ANY或ALL修饰符,而使用any或all谓词时则必须同时使用比较运算符。 在实际应用中,用聚集函数实现子查询通常比直接用any或all查询效率要高,any、all与聚集函数的对应关系如下表: 4、带有exists谓词的子查询 带有exists谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false"。由其引出的子查询的目标列表达式通常都用 *,所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用EXISTS谓词的子查询等价替换。 ④集合查询 select语句的查询结果是元组的集合,所以多个select语句的结果可进行集合操作。主要包括并操作union、交操作intersect和差操作except。 ⑤基于派生表的查询 子查询不仅可以出现在where子句,还可以出现在from子句,这时子查询生成的临时表成为主查询的查询对象。 注意派生表要指定属性列,但若子查询中没有聚集函数则可以不指定,子查询select子句后面的列名为其默认属性。 说明:通过from子句生成派生表,必须为派生关系指定一个别名! 数据更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。 1、插入数据:插入元组+插入子查询结果 into子句中没有出现的属性列,新元组在这些列上取空值,但在定义时not null的属性列不能取空值。如若into未指定属性列则要在每个属性列上均有值,空即为NULL。 字符串常数要用单引号(英文符号)括起来。 子查询可嵌套在insert语句中用以生成要插入的批量数据。(批量插入) 2、修改数据 where子句+条件,满足条件则修改该元组,若无where子句则修改表中所有元组。 子查询可嵌套在update语句中用以构造修改的条件。 3、删除数据 where子句+条件,满足条件则删除该元组,若无where子句则删除表中所有元组。 delete语句删除的是表中的数据,而不是关于表的定义。 子查询可嵌套在delete语句中,用以构造执行删除操作的条件。 关系数据库管理系统在执行增删改语句时会检查该操作是否破坏表上已定义的完整性规则: 视图:从一个或多个基本表中导出的表,视图是一个虚表,数据库中只存放视图的定义,视图中的数据仍然存储在原来的基本表中。一旦基本表数据发生变化,从视图查询到的数据也会随之变化。可以在视图上再创建一个视图。 视图的作用: 简化用户操作,因为能将表与表间的连接操作对用户隐蔽了。** 删除视图:DROP VIEW <视图名>; 索引:为表提供多种存取路径,加快查找速度。常见索引类型有顺序文件上的索引、B+树索引、散列索引、位图索引等,在执行查询时系统会自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引。索引是关系数据库管理系统的内部实现技术,属于内模式的范畴。建立索引能加快查询速度,一个表上可以有多个索引,表更新时,索引要进行维护,这会增加数据库负担,所以索引不能太多。 1、建立索引 create [unique] [cluster] index <索引名> on <表名> (<列名> [<排序方式>] [,(<列名> [<排序方式>] …]); unique:表示索引的每个值只对应唯一的数据记录。** 2、修改索引 alter index <旧索引名> rename to <新索引名>; 3、删除索引 drop index <索引名>; 一个好的模式应当不会发生插入异常、删除异常和更新异常,数据冗余尽量减少。 数据依赖是一个关系内部属性与属性之间的一种约束关系。这种约束关系是通过属性间的相等与否体现出来的数据间相关联系。是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。 函数依赖:若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称 “X函数确定Y” 或 “Y函数依赖于X”,记作X→Y 如果X→Y,但Y 不是 X的子集,则称X→Y是非平凡的函数依赖 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’,都有X’ →Y, 则称Y对X完全函数依赖。若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖。 在R(U)中,如果X→Y(Y不是X的真子集),Y决定不了X,Y→Z(Z是Y的真子集),则称Z对X传递函数依赖。 1NF的定义:如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。 第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。 2NF:若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF。 3NF:若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。 BCNF:若R∈BCNF:所有非主属性对每一个码都是完全函数依赖,所有的主属性对每一个不包含它的码,也是完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。 一个低一级范式的关系模式通过分模式分解可以转换为若干个高一级范式的关系模式的集合,这个过程叫规范化。各种范式之间的关系: 范式判断:第一范式→如果每一个非主属性完全函数依赖于码→第二范式→消除非主属性传递依赖于码→第三范式→消除主属性对码的部份依赖、传递依赖→BCNF范式。 在关系模式DB中,任何二元关系模式的最高范式必定是BCNF。 对于各种范式之间的关系如下: 5NF⊂ 4NF⊂ BCNF ⊂3NF ⊂ 2NF⊂ 1NF 。 数据库角色:被命名的一组与数据库操作相关的权限。角色是权限的集合,可以为一组具有相同权限的用户创建一个角色,简化授权的过程。 创建角色:CREATE ROLE <角色名> 数据的完整性事为了防止数据库存在不符合语义的数据 ,也就是防止数据库中存在不正确的数据。而安全性事保护数据库防止恶意破坏和非法存取。 数据库的完整性是指数据的正确性和相容性。数据库完整性需要满足的功能:提供定义完整性约束条件的机制、提供完整性检查的方法、进行违约处理。 实体完整性定义:CREATE TABLE中用PRIMARY KEY定义 插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:** 系统会自动为主码建立一个主索引,方便检索,索引一般是B+树。 参照完整性定义:在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码 参照完整性违约处理:** 用户定义完整性,在属性上的定义:CREATE TABLE时定义 ①列值非空(NOT NULL): ②列值唯一(UNIQUE): ③检查列值是否满足一个布尔表达式(CHECK): 事务并发执行带来的问题: ①会产生多个事务同时存取同一数据的情况 ②可能会存取和存储不正确的数据,破坏事务一致性和数据库的一致性 封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。 加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。 基本封锁类型 排它锁(Exclusive Locks,简记为X锁)(可读可写) 共享锁(Share Locks,简记为S锁)(读) 事务定义: ①一个数据库操作序列 ②一个不可分割的工作单位 ③恢复和并发控制的基本单位 事务和程序: ①在关系数据库中,一个事务可以是一条或多条SQL语句,也可以包含一个或多个程序。 ②一个程序通常包含多个事务。 当用户没有显式地定义事务时,DBMS按缺省规定自动划分事务 提交:执行完SQL,数据库在一个最近状态。 回滚:回滚到某一个正常的状态。 事物的4个特性:A(原子性)C(一致性)I(隔离性)D(持续性)。 原子性:事物是数据库的逻辑工作单位,事物中包括的诸操作要么都做,要么都不做。 一致性:事物的执行结果必须是数据库从一个一致性状态变到另一个一致性状态。 隔离性:一个事物的执行不能被其他事物干扰。 持续性:指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 保证事务ACID特性是事务管理的重要任务。事务ACID特性可能遭到破坏,其原因有:多个事物并行运行,不同事物的操作交叉执行。其次是事务在运行过程中被强行停止。 各类故障,对数据库的影响有两种可能性: ①是数据库本身被破坏 ②是数据库没有被破坏,但数据可能不正确,这是由于事务的运行被非正常终止造成的。 恢复机制:数据转储(backup)、登陆日志文件(logging) ①需求分析:准确了解与分析用户需求(包括数据与处理);这是最困难、最耗费时间的一步。** 查看所有数据库 查看当前使用的数据库 创建数据库 查看数据库中所有表 使用数据库 删除数据库 1.查看表结构 2.创建表 如: 3.修改表–添加字段 4.修改表–重命名并修改字段 5.修改表–不重命名修改字段 6.删除字段 7.删除表 8.查看表的创建语句 删除外键 普通外键 可更新外键 可级联更新外键约束 可级联删除外键约束 实现修改course的课号时系统自动修改score中的相应课号,从而保持数据引用的一致性不变 1.查询所有列 2.查询指定列 3.修改列名 4.多表查询 INNER JOIN两边都对应有记录的才展示,其他去掉** 例:使用内连接查询班级表与学生表 外连接 outer关键字可以省略 例:使用左连接查询班级表与学生表** 例:使用右连接查询班级表与学生表 例:查询学生姓名及班级名称 多重连接 union将两个查询数据同一列合并在一起 SELECT country FROM Websites** 在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句,外部那个select语句则称为主查询. 如果子查询是多行,需要用any where后面支持多种运算符,进行条件的处理** 等于: =** 例1:查询编号大于3的学生 例2:查询编号不大于4的学生 例3:查询姓名不是“黄蓉”的学生 例4:查询没被删除的学生 and** 例5:查询编号大于3的女同学 例6:查询编号小于4或没被删除的学生 like** 例7:查询姓黄的学生 例8:查询姓黄并且“名”是一个字的学生 例9:查询姓黄或叫靖的学生 范围查询分为连续范围查询和非连续范围查询 in表示在一个非连续的范围内 between … and …表示在一个连续的范围内 从start开始,获取count条数据。 select * from 表名 limit start=0,count 一般情况下,客户端通过传递 pageNo(页码)、pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小(元组百/千级)时使用 MySQL自带的 注意:limit不能跟表达式,所以limit a,b得a与b必须传参时已经计算出 select from 表名 limit (pageNo-1)pageSize,pageSize; 数据量达到了 万级到百万级 sql语句的性能将会影响数据的返回。这时需要利用主键或者唯一索引=编排顺序序号=进行分页。** 假设主键或者唯一索引为num。 select from 表名 where num > (pageNo-1)pageSize limit pageSize; 当需要返回逆序信息时,对上面的语句基于数据再排序。 select from 表名 where num > (pageNo-1)pageSize** 说明:主键列是自动增长,但是在全列插入时需要占位,通常使用空值(0或者null) ; 字段默认值 default 来占位,插入成功后以实际数据为准 1.全列插入:值的顺序与表结构字段的顺序完全一一对应** 2.部分列插入:值的顺序与给出的列顺序对应** 上面的语句一次可以向表中插入一行数据,还可以一次性插入多行数据,这样可以减少与数据库的通信 3.全列多行插入 4.部分列多行插入 排序查询语法: 语法说明:** 例1:查询未删除男生信息,按学号降序 例2:查询未删除学生信息,按名称升序 例3:显示所有的学生信息,先按照年龄从大–>小排序,当年龄相同时 按照身高从高–>矮排序 查看 执行 建立过程 声明游标 其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询 打开游标 读取数据 参数说明: NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。 INTO @变量名[,…] 把提取操作的列数据放到局部变量中。** 关闭游标 删除游标 例子 执行命令 详细参数 导出到远程服务器 group_concat(字段名)根据分组结果,使用group_concat()来放置每一个分组中某字段的集合** 通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作** having 条件表达式:用来过滤分组结果** with rollup的作用是:在最后新增一行,来记录当前表中该字段对应的操作结果,一般是汇总结果。** null与’'是不同的 优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符** 查看权限信息 授予权限 回收权限 用视图来控制对表中部分数据的权限 打开My.ini文件 在原文件的"[mysqld]"后面行添加,然后重启mysql服务(适用于mysql5.7) 所谓定点恢复就是将数据库恢复到指定的时间点。其原理是首先将数据库恢复到指定时间点前的最近一次的完全数据备份状态,然后利用日志重做从恢复出的完全数据备份状态到指定时间点前的所有事务来实现恢复** 排它锁 共享锁 删除锁 insert into user values(null,'root','123'); **interactive_timeout=31536000 更改排序 降序或者升序查找
确定范围:between x and y ,not between x and y。
确定集合:in , not in。
字符匹配:like , not like 。
空值:is null , is not null 。
多重条件:and , or , not 。
比较运算符 + ANY或者ALL
**like字符匹配:’’ % ‘‘代表任意长度;’’ _ ''代表单一字符。
COUNT( [distinct | all] <列名>) :统计一列的个数。
SUM( [distinct | all] <列名>) :计算一列值的总和。
AVG( [distinct | all] <列名>) :计算一列值的平均值。
MAX( [distinct | all] <列名>) :求一列值中的最大值。
MIN( [distinct | all] <列名>) :求一列值中的最小值。
**select子句:指定要显示的属性列
**1、查询同时涉及两个以上的表称之为连接查询,是关系数据库最主要的查询。主要包括等值与非等值查询、自身连接、外连接及多表连接。
**一个select …from…where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称嵌套查询。
能使用户以多个角度看待同一个数据,为不同类型的用户共享数据提供便利。
对重构数据库提供一定的逻辑独立性。
**创建视图:CREATE VIEW <视图名> AS <子查询> [WITH CHECK OPTION];
cluster :表示该索引是聚簇索引。
排序方式:ASC (升序),DESC(降序)
**聚簇索引:把一些元组集中存放在连续的物流块中,能显著减少访问磁盘的次数。一个数据库可以建立多个聚簇,一个关系只能加入一个聚簇。建立与维护聚簇的开销相关大。数据库中的对象
索引
视图
储存过程
触发器
关系数据库设计理论
范式与规范化
数据库安全保护
安全性概述
完整性概述
①检查主码值是否唯一,如果不唯一则拒绝插入或修改
**②检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
①拒绝(NO ACTION)执行:默认策略
②级联(CASCADE)操作:删除一个元组,其他相关的会级联删除
**③设置为空值(SET-NULL):对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值并发控制技术
数据锁
事务
数据库的恢复
数据库的设计过程
数据库设计的基本步骤
②概念设计:通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。这是整个数据库设计的关键。
③逻辑结构设计:将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化
④物理设计:为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
⑤数据库实施:运用DBMS提供的数据库语言(如SQL)及宿主语言,根据逻辑设计和物理设计的结果:a. 建立数据库;b. 编制与调试应用程序;c. 组织数据入库;d. 进行试运行
**⑥数据库运行和维护:数据库应用系统经过试运行后即可投入正式运行;在数据库系统运行过程中必须不断地对其进行评价、调整与修改。需求分析
概念设计
逻辑结构设计
物理设计
数据库的实施
数据库的运行与维护
MySQL
MySQL连接
控制台
C++
C#
java
JavaScript
Python
MySQL结构
用户
create user 'username'@'%' identified by '密码';
数据库
show databases;
select database();
create databases 数据库名;
或
create databases 数据库名 charset=utf8;
show tables;
use database 数据库名
drop database 数据库名
数据类型
数值类型
类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 Bytes (-128,127) (0,255) 小整数值 SMALLINT 2 Bytes (-32 768,32 767) (0,65 535) 大整数值 MEDIUMINT 3 Bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值 INT或INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值 BIGINT 8 Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值 FLOAT 4 Bytes (-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) 单精度 浮点数值 DOUBLE 8 Bytes (-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) 双精度 浮点数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值 日期和时间类型
类型 大小 ( bytes) 范围 格式 用途 DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间 YEAR 1 1901/2155 YYYY 年份值 DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值 TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07** YYYYMMDD HHMMSS 混合日期和时间值,时间戳 字符串类型
类型 大小 用途 CHAR 0-255 bytes 定长字符串 VARCHAR 0-65535 bytes 变长字符串 TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串 TINYTEXT 0-255 bytes 短文本字符串 BLOB 0-65 535 bytes 二进制形式的长文本数据 TEXT 0-65 535 bytes 长文本数据 MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据 MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据 LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据 LONGTEXT 0-4 294 967 295 bytes 极大文本数据 变量(编码等)
设置编码
charset utf8;
charset gbk;
set names gbk;
set "...“=utf8;
设置变量
set 变量名=...;
查找变量
show variables like "character%"
表
describe 表名
或
desc 表名
create table table_name(字段名 数据类型 可选的约束条件);
create table classes(
id int unsigned auto_increment primary key not null,
name varchar(10)
);
create table students(
id int unsigned primary key auto_increment not null,
name varchar(20) default '',
age tinyint unsigned default 0,
height decimal(5,2),
gender enum('男','女','人妖','保密'),
cls_id int unsigned default 0
);
CREATE TABLE IF NOT EXISTS `user`(
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`date` DATE,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
alter table 表名 add 列名 类型
demo:alter table students add birthday datetime;
alert table 表名 change 原名 新名 类型及约束
demo:alter table syudents change birthday birth datetime not null;
alter table 表名 modify 列名 类型及约束
demo : alter table students modify birth date nout noll;
alter table 表名 drop 列名
drop table 表名
show create table 表名
完整性约束
实体完整性(主键)
参照完整性(外键)
alter table ... drop foreign key ...
alter table Table1 add constraint 约束名 foreign key(编号) references Table2(编号);
alter table Table1 add constraint 约束名 foreign key(编号) references Table2(编号) on update;
alter table Table1 add constraint 约束名 foreign key(编号) references Table2(编号) on update cascade;
alter table Table1 add constraint 约束名 foreign key(编号) references Table2(编号) on delete cascade;
用户自定义完整性(触发器)
delimiter $$
create trigger st_ins_chk_age before insert
on student
for each row
begin
if new.年龄 is not null and new.年龄 <0 then
signal sqlstate 'HY000'
set message_text='年龄不能为负';
end if;
if OLD.年龄>NEW.年龄 then
SIGNAL SQLSTATE 'HY000'
set MESSAGE_TEXT='年龄不能减少' ;
end if;
end$$
delimiter ;
delimiter $$
create trigger tri after update on course
as
begin
declare @new char(3),@old vchar(3)
select @new = 课号 from inserted
select @old = 课号 from deleted
update course
set 课号 = @new where 课号 =@old
print '修改成功'
update score
set 课号=@new where 课号=@old
end$$
delimiter ;
查询
基本查询
select * from 表名
select 列1,列2,...from 表名;
select id as 序号, name as 名字, gender as 性别 from students;
select a.s,b.sd where a.e=d.f
连接查询
LEFT JOIN左边表中的数据都出现,右边没有数据以NULL填充
**RIGHT JOIN右边表中的数据都出现,左边没有数据以NULL填充select * from students inner join classes on students.cls_id = classes.id;
select * from 表1 left或right (outer) join 表2 on 表1.列 运算符 表2.列
**此处使用了as为表起别名,目的是编写简单select * from students as s left join classes as c on s.cls_id = c.id;
select * from students as s right join classes as c on s.cls_id = c.id;
select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id;
select student.* from student
join score on score.学号=student.学号
join course on score.课号=course.课号
join teacher on teacher.工号=course.任课教师编号
where teacher.姓名='等等'
组合查询
UNION
**SELECT country FROM apps;嵌套查询
标量子查询
select * from students where age > (select avg(age) from students);
select * from students where age > any (select age from students);
列级子查询
select name from classes where id not in (select cls_id from students);
行级子查询
select * from students where (height,age) = (select max(height),max(age) from students);
exists查询
Select 学号,姓名,系别 from student
where exists(
select * from score where score.学号 = student.学号 and score.成绩 <60
);
where not exists(
select * from score where score.学号 = student.学号 and score.成绩 <60
);
多重子查询
Select * from student where 学号= any (
Select 学号 from score where 课号=(
Select 课号 from course where 任课教师编号=(
Select 工号 from teacher where 姓名= '潘强'
)
)
);
条件语句查询
比较运算符
逻辑运算符
模糊查询
范围查询
**空判断比较运算符
大于: >
大于等于: >=
小于: <
小于等于: <=
**不等于: != 或 <>select * from students where id > 3;
select * from students where id <= 4;
select * from students where name != '黄蓉';
select * from students where is_delete=0
逻辑运算符
or
**notselect * from students where id > 3 and gender=0;
select * from students where id < 4 or is_delete=0;
模糊查询
%表示任意多个任意字符
**_表示一个任意字符select * from students where name like '黄%';
select * from students where name like '黄_';
select * from students where name like '黄%' or name like '%靖';
范围查询
select * from students where id in(1,3,8);
select * from students where id not in(1,3,8);
select * from students where id between 3 and 8;
select * from students where (id between 3 and 8) and gender=1;
定义变量查询
select r.id from
role r,user u
where r.id=u.id
分页查询
limit基本实现
limit
来解决这个问题。编排序号
order by num desc
**limit pageSize;增加
**此时 字段名列表不用填写insert into 表名 values (...)
**此时需要根据实际的数据的特点 填写对应字段列表insert into 表名 (列1,...) values(值1,...)
例:
insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');
insert into 表名 values(...),(...);
insert into 表名(列1,...) values(值1,...),(值1,...)...;
例:
insert into students(name) values('杨康'),('杨过'),('小龙女');
修改
update 表名 set 列1=值1,列2=值2... where 条件
删除
delete from 表名 where 条件
或
update 表名 set isdelete=1 where 条件
Mysql基本操作
视图
use 邢乔根;
create view xs_20 as
select * from 学生 where 年龄=20;
select * from xs_20;
排序
select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]
将行数据按照列1进行排序,如果某些行 列1 的值相同时,则按照 列2 排序,以此类推
asc从小到大排列,即升序
desc从大到小排序,即降序
**默认按照列值从小到大排列(即asc关键字)select * from students where gender=1 and is_delete=0 order by id desc;
select * from students where is_delete=0 order by name;
select * from students order by age desc,height desc;
索引
CREATE UNIQUE INDEX idx_xingqiaogen_xh ON 学生(学号 ASC);
CREATE INDEX idx_xingqiaogen_xh ON 学生(姓名 DESC);
存储过程
show procedure status where Name=''
call 存储过程名();
--打开数据库
use 邢乔根;
--如果存在就删除
drop procedure if exists genStudents;
--将sql命令结束标志修改为$$
delimiter $$
--创建储存过程,并指定参数
create procedure genStudents(in x int)
begin
--你的脚本
declare i int default 1;
declare xuehao varchar (8);
declare xingming varchar (4);
declare suijishu int;
declare xingbie varchar(4);
declare nianling int;
declare xi varchar(14);
declare shenggao int;
delete from 学生;
while i<=x do
select 系名 into xi from 系表 order by rand() limit 1;
set shenggao = cast(rand()*45 as SIGNED)+150;
set nianling = cast(rand()*7 as SIGNED)+18;
set xuehao = cast(20190000+i as char(8));
select 姓 into xingming from 姓表 order by rand() limit 1;
set suijishu =cast(rand()*10 as SIGNED)% 2;
if suijishu=0 then set xingbie='男';
else set xingbie='女';
end if;
select concat(xingming,名) into xingming
from 名表 order by rand() limit 1;
insert into 学生
values(xuehao,xingming,xingbie,nianling,xi,shenggao);
set i=i+1;
end while;
--结束脚本
end $$
--将sql命令结束标志修改为;
delimiter ;
游标
DECLARE <游标名>CURSOR FOR<SELECT语句>;
OPEN mycursor
FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
列表中的各个变量从左到右与游标结果集中的相应列相关联。
** 各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。 CLOSE mycursor
DEALLOCATE mycursor
declare @id nvarchar(20) --定义变量来保存ID号
declare @A float --定义变量来保存值
declare mycursor cursor for select * from tb_c --为所获得的数据集指定游标
open mycursor --打开游标
fetch next from mycursor into @id,@A --开始抓第一条数据
while(@@fetch_status=0) --如果数据集里一直有数据
begin
select tb_b.name,(tb_b.gz + @A) from tb_b where tb_b.id = @id --开始做想做的事(什么更新呀,删除呀)
fetch next from mycursor into @id,@A --跳到下一条数据
end
close mycursor --关闭游标
deallocate mycursor --删除游标
导入导出数据
mysql.exe程序导入sql文件
mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql)
source命令导入sql文件
mysql> create database abc; # 创建数据库
mysql> use abc; # 使用已创建的数据库
mysql> set names utf8; # 设置编码
mysql> source /home/abc/abc.sql # 导入备份数据库
LOAD DATA命令导入txt/excel数据
LOAD DATA LOCAL INFILE '文件路径' INTO TABLE 表名 FIELDS TERMINATED BY '\t' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' (field1, field2);
其中
路径不能有中文,路径分隔符为\\或/
TERMINATED BY 指数据之间的分隔符,空格用\t表示
ENCLOSED BY 如果你的数据用双引号括起来,你想忽略的话可以指定
LINES TERMINATED BY 行分割符 (windows 是 \r\n unix 系列是 \n)
(field1, field2) 指明对应的字段名称
LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL] --导入模式[最低优先级,需要别的sql执行完再执行|并行执行|指定local可以从客户端读取,没指定要在mysql服务器上读取]
INFILE 'file_name' -- 导入文件位置
[REPLACE | IGNORE] -- 冲突解决策略,对现有记录覆盖|跳过不处理
INTO TABLE tbl_name -- 指定需要插入的表
[PARTITION (partition_name [, partition_name] ...)] -- 表分区
[CHARACTER SET charset_name] -- 指定字符集
[{FIELDS | COLUMNS} -- 指定文件字段分隔格式
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES --指定每行记录分隔格式
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]
SELECT ... INTO OUTFILE 语句导出表
SELECT * FROM runoob_tbl INTO OUTFILE '/tmp/runoob.txt';
mysqldump.exe程序导出
mysqldump -u root -p 密码 runoob_tbl > dump.txt
mysqldump -u root -p database_name \ | mysql -h other-host.com database_name
分组
group by
group by + group_concat()
**group by + 聚合函数
**group by + having
having作用和where类似,但having只能用于group by 而where是用来过滤表数据
**group by + with rollup
**函数
count 总数
sum 求和
round(avg(),2) 平均,保留两位小数
max 最大
min 最小
算数逻辑
算数运算符
运算符 作用 + 加法 - 减法 * 乘法 / 或 DIV 除法 % 或 MOD 取余 比较运算符
符号 描述 备注 = 等于 <>, != 不等于 > 大于 < 小于 <= 小于等于 >= 大于等于 BETWEEN 在两值之间 >=min&&<=max NOT BETWEEN 不在两值之间 IN 在集合中 NOT IN 不在集合中 <=> 严格比较两个NULL值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 LIKE 模糊匹配 REGEXP 或 RLIKE 正则式匹配 IS NULL 为空 IS NOT NULL 不为空 逻辑运算符
运算符号 作用 NOT 或 ! 逻辑非 AND 逻辑与 OR 逻辑或 XOR 逻辑异或 位运算符
运算符号 作用 & 按位与 按位或 ^ 按位异或 ! 取反 << 左移 >> 右移 正则表达式
REGEXP ''
空判断
select * from students where height is null;
select * from students where height is not null;
优先级
**and比or先运算,如果同时出现并希望先算or,需要结合()使用MySQL企业级技术
事务
数据安全
防止SQL注入
权限
select * from mysql.tables_priv;
grant select,insert,update,delete on 数据库.表 to '用户名'@'%';
revoke select,insert,update,delete on 数据库.表 to '用户名'@'%';
create view myview as
select * from teacher where 职称='教授';
grant select on 数据库.myview to '用户名'@'%';
日志与数据恢复
启用日志
general-log=on
general-log-file=
log-bin=二进制日志路径
binlog-fromat=statement
show variables like "%log%"
定点恢复数据库
数据备份
分布式储存与大数据
并发效率
事务锁
lock table ...
lock table ... read
unlock table ...
或
unlock tables;
大规模并发
读写分离
问题日志
版本差异
注意事项
1、将该自增主键设置为null
2、将该自增主键设置为0
insert into user values(0,'root','123');
3、插入时提前声明属性列
insert into user(username,password) values('root','123'); 错误日志
wait_timeout=31536000**ALTER TABLE 表名 ORDER BY 字段名
//降序
select * from 表名 order by 字段名 desc
//升序
select * from 表名 order by 字段名 asc