书名:数据库原理与应用基础(MySQL)
作者:李辉编写
ISBN:9787040507492
出版社:高等教育出版社
出版日期:2019-08-01
【课后习题参考答案】
数据库管理系统(DatabaseManagementSystem)安装于操作系统之上,是一个管理、控制数据库中各种数据库对象的系统软件。
主要功能包括:①数据库的建立和维护②数据定义功能③数据组织、存储和管理④数据操作功能⑤数据库事务管理和运行管理⑥其他功能。
数据库系统(DatabaseSystem),是由数据库及其管理软件组成的系统。数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。
特点:①数据的结构化②数据的共享性高,冗余度低,易扩充③数据独立性高④数据由DBMS统一管理和控制。
DBA职责:①决定数据库中的信息内容和结构②决定数据库中的存储结构和存取策略③定义数据的安全性要求和完整性约束条件④监控数据库的使用和运行⑤数据库的改进和重组重构。
模式(Schema):也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。外模式(ExternalSchema):也称子模式(Subschema)或用户模式,是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。内模式(InternalSchema):也称存储模式(StorageSchema),它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。
数据独立性:通过外模式-模式映射和模式-内模式映射这两个映射保证了数据库系统中的数据具有较高的逻辑独立性和物理独立性。当数据库模式发生变化时,可以调整外模式/模式间的映像关系,保证面向用户的各个外模式不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与应用程序的逻辑独立性,简称数据的逻辑独立性。当数据库中数据物理存储结构改变时,即内模式发生变化,可以调整模式/内模式映像关系,保持数据库模式不变,从而使数据库系统的外模式和各个应用程序不必随之改变。这样就保证了数据库中数据与应用程序间的物理独立性,简称数据的物理独立性。
这两种结构的区别非常明显,主要体现在下面几个方面:①硬件环境不同②对安全要求不同③对程序架构不同④软件重用不同⑤系统维护不同⑥处理问题不同⑦用户接口不同
略。
信息的三种世界分别是:信息的现实世界、信息世界和信息的计算机世界。
这3个领域是由客观到认识、由认识到使用管理的3个不同层次,后一领域是前一领域的抽象描述。信息的三种世界描述:
概念模型也称信息模型,按用户的观点对数据和信息建模,主要用于数据库设计。
实体:客观存在的实体事物。
实体型:用实体类型名和所有属性来共同表示同一类实体。
实体集:同一类型实体的集合
属性:实体所具有的某一特性
码:可以唯一标识一个实体的属性集
E-R图:E-R图也称实体-联系图(EntityRelationshipDiagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。
转换原则:一个实体转换为一个关系模式。实体的属性就是关系的属性。
联系类型的转换:
1)若实体间联系是1∶1,可以在两个实体类型转换成的两个关系模式中任意一个关系模式中加入另一个关系模式的码和联系类型的属性;
2)若实体间的联系是1∶n,则在n端实体类型转换成的关系模式中加入1端实体类型的码和联系类型的属性;
3)若实体间联系是m∶n,则将联系类型也转换成关系模式,其属性为两端实体类型的码加上联系类型的属性,而码为两端实体码的组合。
(1)学生与课程联系类型是多对多联系。
(2)课程与教师的联系类型是多对多联系。
(3)学生与教师的联系类型是一对多联系。
(4)完善本题E-R图的结果如下图所示:
(1)设计该计算机管理系统的E-R图,如下所示:
(2)对应的关系模型结构如下:
病房(病房号,床位号,科室名)
医生(工作证号,姓名,职称,科室名,年龄)
病人(病历号,姓名,性别,诊治,主管医生,病房号)
(3)每个关系模式的候选码如下:
科室的候选码是科名;
病房的候选码是科室名、病房号;
医生的候选码是工作证号;
病人的候选码是病历号。
(1)E-R图如下所示:
(2)这个ER图可转换4个关系模式:
商店(商店编号,商店名,地址)
主码:商店编号
职工(职工编号,姓名,性别,业绩,商店编号,聘期,月薪)
主码:职工编号外码:商店编号
商品(商品号,商品名,规格,单价)
主码:商品号
销售(商店编号,商品号,月销售量)
主码:商店编号,商品号
候选码:若关系中的某一属性或属性组的值能唯一地标识一个元组,则该属性或属性组为候选码;
主码:若一个关系中有多个候选码,则选定其中一个为主码;
组合码:多个属性构成的主码;
外码:关系R中的一个属性组,它不是R的主属性,但它与另一个关系S中的主码相对应,则称这个属性组为R的外码或外键。
关系模型的完整性有三类:实体完整性,参照完整性和用户定义完整性。
实体完整性:例如学生关系中,学号为主码,则学号的值必须唯一且非空。
参照完整性:成绩关系中,学号是外码,则学号的取值必须是学生关系中学号的有效值或取空值。
连接运算符是“=”的连接运算称为等值连接。它是从关系R与S的广义笛卡尔积中选取A,B属性值相等的那些元组;自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。
(1)不能,因为一个关系主键取值必须唯一。表中已有主键值“09088”,所以违背了实体完整性
(2)不可以,因为专业表中为专业名称设置唯一约束;插入的新记录违背了这一完整性约束
(3)不可以,参照完整性要求,外键取值必须是另一个关系主键的有效值或空值,教师表中的专业为外键,参照专业表中的专业号,“JK”不是专业表中的主键值,所以不可以更改。
(4)不能,因为教师表中有专业为“CS”的记录,若删除,则违背了实体完整性。
1)
2)
3)
4)
(1)基本的FD有三个:
(职工编号,日期)→日营业额
职工编号→部门名
部门名→部门经理
R的关键码为(职工编号,日期)。
(2)R中有两个这样的FD:
(职工编号,日期)→(部门名,部门经理)
职工编号→(部门名,部门经理)
可见前一个FD是局部依赖,所以R不是2NF模式。
R应分解成:
R1(职工编号,部门名,部门经理)
R2(职工编号,日期,日营业额)
此处,R1和R2都是2NF模式。
(3)R2已是3NF模式。
在R1中,存在两个FD:
因此,“职工编号→部门经理”是一个传递依赖,R1不是3NF模式。R1应分解成
R11(职工编号,部门名)
R12(部门名,部门经理)
这样,ρ={R11,R12,R2}是一个3NF模式集。
(1)基本的FD有:
教师编号→教师姓名,教师职称
系编号→系名称,系地址
课程号→课程名,学分
教师编号→系编号,系名称,系地址
R的关键码为(教师编号,课程号)。
部分依赖:
传递依赖:
教师编号→系名称,教师编号→系地址
(2)设计不合理,存在插入异常,更新异常,删除异常和数据冗余
(3)规范化为R1(教师编号,教师姓名,教师职称)R2(系编号,系名称,系地址)R3(课程号,课程名,学分)
(1)需求分析阶段
(2)概念结构设计阶段
是整个数据库设计的关键,通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。
(3)逻辑结构设计阶段
将概念结构转换为某个DBMS所支持的数据模型,对其进行优化。
(4)数据库物理设计阶段
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。
(5)数据库实施阶段
运用DBMS提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果,建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。
(6)数据库运行和维护阶段
数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。
需求分析阶段的设计目标是通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统或计算机系统)工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。调查的内容是“数据’夕和“处理”,即获得用户对数据库的如下要求:
(1)信息要求,指用户需要从数据库中获得信息的内容与性质,由信息要求可以导出数据要求,即在数据库中需要存储哪些数据;
(3)安全性与完整性要求。
数据字典的内容通常包括:数据项、数据结构、数据流、数据存储、处理过程五个部分。其中数据项是数据的最小组成单位,若干个数据项可以组成一个数据结构。数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容。
数据字典的作用:数据字典是关于数据库中数据的描述,在需求分析阶段建立,是下一步进行概念设计的基础,并在数据库设计过程中不断修改、充实、完善。
概念模型特点:
(1)能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求。是对现实世界的一个真实模型。
(2)易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参与是数据库的设计成功的关键。
(3)易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充。
(4)易于向关系、网状、层次等各种数据模型转换。
设计概念模型时常用的方法:ER方法
概念模型设计可分三步完成:
(1)设计局部概念模型
(2)设计全局概念模型,建立全局ER图
(3)概念模型的评审
(1)属性不能再具有需要描述的性质。
(2)属性不能与其他实体具有联系。
关键是消除各局部E-R图中的冲突。
属性冲突的解决方法是与用户协商后解决。
命名冲突解决方式是需要与各部门协商讨论后解决。
结构冲突解决方法是根据应用语义对实体联系的类型进行综合或调整。
(1)初始关系模式。
(2)关系模式规范化。
(3)模式的评价与改进。
主要任务是确定数据库的物理结构,同时对其进行评价。主要依据是需求和约束分析报告以及数据库的逻辑模式。
运用DBMS提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。
(1)学生选课和教师任课局部E-R图
学生选课局部E-R图:
教师任课局部E-R图:
(2)全局E-R图
(3)全局E-R图转换为等价的关系模型表示的数据库逻辑结构:
教师(教师号,职称,姓名,性别,名称)
学生(学号,姓名,性别,年龄,名称)
课程(编号,课程名,名称)
讲授(教师号,编号)
选修(学号,编号)
(1)E-R图
(2)转换为等价的关系模式
借书人(借书证号,姓名,单位)
图书(书号,书名,数量,位置,出版社名)
借阅(借书证号,书号,借书日期,还书日期)
(1)运动队局部E-R图和运动会局部E-R图
运动队局部E-R图:
运动会局部E-R图:
(3)命名冲突:项名、项目名异名同义,统一命名为项目名。
结构冲突:项目在两个局部E-R图中,一个作属性,一个作实体,合并统一为实体。
(1)E-R图
(2)关系模式
商家(商家号,姓名,性别,年龄,通信地址)
玩具(玩具编号,名称,类型,价格,所剩数量,订单号)
订单(订单号,玩具编号,客户号,订购数量,商家号)
订购(客户号,玩具编号)
(3)转换后的关系模式范式化为第三范式
玩具1(玩具编号,名称,价格,所剩数量,订单号)
玩具2(玩具编号,类型)
订单(订单号,客户号,订购数量,商家号)
1)使用C和C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。
2)支持AIX、FreeBSD、HP-UX、Linux、MacOS、NovellNetware、OpenBSD、OS/2Wrap、Solaris、Windows等多种操作系统。
3)为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和Tcl等。
4)支持多线程,充分利用CPU资源。
5)优化的SQL查询算法,有效地提高查询速度。
6)既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。
7)提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。
8)提供TCP/IP、ODBC和JDBC等多种数据库连接途径。
9)提供用于管理、检查、优化数据库操作的管理工具。
10)支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
11)支持多种存储引擎。
12)MySQL是开源的,所以你不需要支付额外的费用。
详见教材97-113页。
1)phpMyAdmin
phpMyAdmin是最常用的MySQL维护工具,是一个用PHP开发的基于Web方式架构在网站主机上的MySQL管理工具,支持中文,管理数据库非常方便。不足之处在于对大数据库的备份和恢复不方便。
2)MySQLDumper
MySQLDumper使用PHP开发的MySQL数据库备份恢复程序,解决了使用PHP进行大数据库备份和恢复的问题,数百兆的数据库都可以方便的备份恢复,不用担心网速太慢导致中间中断的问题,非常方便易用。这个软件是德国人开发的,还没有中文语言包。
作用:负责完成数据的存储、处理和安全管理。
MyISAM:拥有较高的插入,查询速度,但不支持事务
InnoDB:5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定
BDB:源自BerkeleyDB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
Memory:所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
Merge:将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
Archive:非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
Federated:将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
Cluster/NDB:高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
CSV:逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
(1)满足应用支持语言的需求,如果应用要处理各种各样的文字,或者需要发布到使用不同语言的国家或者地区,应该选择Unicode,对于MySQL来说,目前就是UTF-8。
(2)如果数据库只需要支持一般中文,数据量很大,性能要求也很高,那就应该选择双字节的中文字符集,相对于UTF-8而言GBK比较节省空间,减少磁盘IO。
(3)如果数据库需要做大量的字符运算,如比较,排序等,选择定长字符集可能更好,处理速度会更快。
(4)如果所有客户端程序都支持相同的字符集,应该有限选择该字符集作为数据库字符集,可以避免因字符级转换带来的性能开销和数据损失。
MySQL的字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级,它们分别在不同的地方设置,作用也不同。可以在MySQL服务启动的时候确定。
创建数据库:
CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]db_name
[[DEFAULT]CHARACTERSETcharset_name]
[[DEFALUT]COLLATEcollation_name]
修改数据库:
ALTER{DATABASE|SCHEMA}[db_name]
[DEFAULTCHARACTERSETcharset_name]
|[[DEFAULT]COLLATEcollation_name]
删除数据库:
DROPDATABASE[IFEXISTS]db_name
MySQL主要支持算术运算符、比较运算符、逻辑运算符和位运算符四种类型。
1)在符合应用要求的前提下,尽量选择短数据类型
2)数据类型越简单越好
3)尽量采用精确小数类型,而不采用浮点数类型
5)尽量避免NELL字段
使用数据库:
USE数据库名
DROPDATABASE[IFEXISTS]db_name;
(1)创建数据表可使用CREATETABLE命令,其语法格式:
CREATE[TEMPORARY]TABLE[IFNOTEXISTS]table_name
[([column_definition],…|[index_definition])]
[table_option][select_statement];
(2)修改数据表可以使用ALTERTABLE命令,其语法格式:
ALTER[IGNORE]TABLEtable_name
alter_specification[alter_specification]
ADD[COLUMN]column_definition[FIRST|AFTERcol_name]//添加字段
|ALTER[COLUMN]col_name{SETDEFAULTLITERAL|DROPDAFAULT}//修改字段
|CHANGE[COLUMN]old_col_namecolumn_definition[FIRST|AFTERcol_name]//重命名字段
|MODIFY[COLUMN]column_definition[FIRST|AFTERcol_name]//修改字段
|DROP[COLUMN]col_name//删除列
|RENAME[TO]new_table_name//对表重命名
|ORDERBYcol_name//按字段排序
|CONVERTTOCHARACTERSETcharacter_name[COLLATEcollation_name]//将字段集转化为二进制
|[DEFAULT]CHARACTERSETcharacter_name[COLLATEcollation_name]//修改字符集
(3)删除表可以用DROPTABLE命令,其语法格式:
DROPTABLE[IFEXISTS]table_name1[,table_name2]…
MySQL支持的常用约束条件有7种:主键(PRIMARYKEY)约束、外键(FOREIGNKEY)约束、非空(NOTNULL)约束、唯一性(UNIQUE)约束、默认值(DEFAULTt)约束、自增约束(AUTO_INCREMENT)以及检查(CHECK)约束。可以分为如下4类:
(1)实体完整性约束(每一行反应不同的实体)
通过索引,唯一约束。主键约束或标识属性来体现
(2)域完整性约束(指给定列的输入有效性)
通过限制数据类型,检查约束,输入格式,外键约束,默认值,非空等体现
(3)引用完整性约束(表之间的联系)
通过主外建
(4)自定义完整性约束(根据用户的需求)
UPDATEcontent
SETwords=’如何使用INSERT语句’
WHEREusername=’MySQL初学者’
DELETEFROMcontent
WHEREusemame=‘MySQL初学者’
HAVING子句与WHERE子句之后都写条件表达式,而且都会根据条件表达式的结果筛选数据,它们是有区别的,主要区别如下。
HAVING子句用于筛选组,而WHERE子句用于筛选记录。
HAVING子句中可以使用聚合函数,而WHERE子句中不能使用聚合函数。
HAVING子句中不能出现既不被GROUPBY子句包含,又不被聚合函数包含的字段,而WHERE子句中可以出现任意的字段。
通常,HAVING子句总是和GROUPBY子句配合使用,而WHERE子句可以不用任何子句的配合。
在使用WHERE子句或HAVING子句都能查询出相同的结果时,WHERE子句放在GROUPBY子句之前,而HAVING子句放在GROUPBY子句之后。
REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARYKEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。注意,除非表有一个PRIMARYKEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。所有列的值均取自在REPLACE语句中被指定的值。所有缺失的列被设置为各自的默认值,这和INSERT一样。您不能从当前行中引用值,也不能在新行中使用值。如果您使用一个例如“SETcol_name=col_name+1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SETcol_name=DEFAULT(col_name)+1。为了能够使用REPLACE,您必须同时拥有表的INSERT和DELETE权限。
TRUNCATETABLE在功能上与不带WHERE子句的DELETE语句相同:二者均删除表中的全部行。但TRUNCATETABLE比DELETE速度快,且使用的系统和事务日志资源少。DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATETABLE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
TRUNCATE,DELETE,DROP放在一起比较:
TRUNCATETABLE:删除内容、释放空间但不删除定义。
DELETETABLE:删除内容不删除定义,不释放空间。
DROPTABLE:删除内容和定义,释放空间。
索引是表示数据的另一种方式,它提供的数据顺序不同于数据在磁盘上的物理存储顺序。索引的主要作用是加快数据查询效率。
(1)FULLTEXT即为全文索引,目前只有MyISAM引擎支持。一种方式,它提供的数据顺序不同于数据在磁盘上的物理存储顺序,索引的特殊作用是在表内重新排列记录的物理位置;
(2)HASH,由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率;
(3)BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中。
(1)创建索引:CREATEINDEXindex_nameONtable_name(column_list)
CREATEUNIQUEINDEXindex_nameONtable_name(column_list)
(2)查看索引:showindexfromtblname;
(3)删除索引:DROPINDEXindex_nameONtalbe_name
确实,索引能够极大地提高数据检索效率,也能够改善排序分组操作的性能,但有不能忽略的一个问题就是索引是完全独立于基础数据之外的一部分数据。假设在Tableta中的Columnca创建了索引idx_ta_ca,那么任何更新Columnca的操作,MySQL在更新表中Columnca的同时,都须要更新Columnca的索引数据,调整因为更新带来键值变化的索引信息。而如果没有对Columnca进行索引,MySQL要做的仅仅是更新表中Columnca的信息。这样,最明显的资源消耗就是增加了更新所带来的IO量和调整索引所致的计算量。此外,Columnca的索引idx_ta_ca须要占用存储空间,而且随着Tableta数据量的增加,idx_ta_ca所占用的空间也会不断增加,所以索引还会带来存储空间资源消耗的增加。
表是实实在在得保存数据的实体,写入的数据都保存在表中;而视图是不保存数据的,也没有数据。可以这样理解“视图就是一条语句,实际上视图从表中去数据”,只是给我们的感觉好像直接从表中取得一样。表可以建立各种触发器,可以建立索引,可以建立主健、约束等。但是视图不能建立这些对象(视图可以建立替代触发器)。表和视图可以更新,但是视图的更新受到约束。
优点:视图能够集中数据,简化用户的数据查询和处理;视图便于用户共享数据;视图提高了数据的逻辑独立性;视图能够对机密数据提供安全保护。
(1)只有在创建视图的语句中使用了Top关键字之后才可以使用orderby字句,否则就会出错;
(2)当我们对视图使用了约束以后,如果在对视图进行操作的时,必须符合该约束条件,否则就不能够正确地进行操作.但是我们可以直接对数据表进行操作.此时就不再受视图约束的制约;
(3)在sqlserver2000中,我们不能够使用Substr()来代替substring()函数;
(4)我们使用substring()函数时.第一个字段名不能加引号.否则不能正确执行;
(5)我们在使用substring()函数的时候需要注意的是:第一个参数是字段的名称不需要加引号,第二个参数是截取字符串的开始位置,
第二个参数是截取字符串的结束位置。并且字符串的位置是从0开始的。
由于视图是一张虚表,所以对视图的更新,最终实际上是转换成对视图的底层表的更新。因此,可以通过更新视图的方式实现对表中数据的更新。视图的更新操作包括插入利用INSERTINTO语句实现、修改利用UPDATE语句实现和删除DELETE语句实现。满足以下条件才可以更新:
源表尽量使单表,否则限制会比较多。
下面的情况不应出现,否则不允许更新:
(1)distinct关键字
(2)集合运算或分组函数。
eg:intersect、sum、max、count....
出现groupby、orderby、model、startwith.....
出现伪列关键字:eg:rownum.
(3)还应考虑基表的一些约束,这些约束对视图数据的更新都有一定影响,如果需要创建可以更新的视图,可以使用insteadof触发器。
存储过程和存储函数是在数据库中定义一些被用户定义的SQL语句集合。
二者存在以下几个区别:
(1)存储过程实现的功能要复杂一点,而函数实现的功能针对性比较强。
(2)存储过程可以返回参数,而函数只能返回值或者表对象。
(3)存储过程可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
(4)存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用。
(1)存储过程的定义与调用
创建一个存储过程,根据学生的学号查询学生的姓名
createPROCEDUREgetnamebysno(inxhchar(10),outnamechar(20))
BEGIN
selectsnameintonamefromstudentwheresno=xh;
调用该存储过程:callgetnamebysno(‘1101’);
(2)存储函数的定义与调用
创建一个名为numstu的存储函数,查询学生的人数
Createfunctionnumstu()
Returnsinteger
Begin
Return(selectcount(*)fromstudent);
调用:selectnumstu()
存储过程的优点:
(1)存储过程增强了SQL语言的功能和灵活性
(2)存储过程能实现较快的执行速度。
(3)存储过程允许标准组件是编程。
(4)存储过程能过减少网络流量。
(5)存储过程可被作为一种安全机制来充分利用。
(1)通过showstatus语句
(2)如果要查看存储过程或函数的详细信息,要使用showcreate语句
游标是一个被SELECT语句检索出来的结果集。在存储了游标后,应用程序或用户就可以根据需要滚动或浏览其中的数据。
游标(cursor)具有以下特性:
打开游标:Opencursor_name
读取游标:fetchcursor_nameintovar_name[,var_name]…
关闭游标:closecursorname
CREATEPROCEDUREsp_updateemail(INUSer_nameVARCHAR(50),INe_mailVARCHAR(50))
UPDATEcontentSETemail=e_mailWHEREusername=user_name;
触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。它被定义为在对表或视图发出UPDATE、INSERT或DELETE语句时自动执行,在有数据修改时自动强制执行其业务规则。
(1)创建触发器:
createtriggertrigger_nametrigger_timetrigger_event
ontbl_nameforeachrowtrigger_stmt
(2)查看触发器:
showtriggers
(3)删除触发器:
droptrigger[schema_name.]trigger_name触发程序
(1)触发器不能调用将数据返回客户端的存储过程,也不能使用采用call语句的动态sql;
(2)触发器不能使用以显式或隐式方式开始或结束事务的语句,如starttransaction、commit或rollback。
事件调度器(eventscheduler):可以用做定时执行某些特定任务,可以精确到每秒钟执行一个任务,而操作系统的计划任务只能精确到每分钟执行一次。
事件调度器是在MySQL5.1中新增的另一个特色功能,可以作为定时任务调度器,取代部分原先只能用操作系统任务调度器才能完成的定时功能。
(1)创建事件:
createeventevent_name
onscheduleschedule
[oncompletion[not]preserve]
[enable|disable|disableonslave]
doevent_body;
schedule:
attimestamp
interval:
quantity
(2)修改事件:
altereventevent_name[onscheduleschedule]
[renametonew_event_name][oncompletion[not]preserve]
(3)删除事件:
dropevent[ifexists]event_name
CREATETRIGGERcontent_delete_triggerAFTERDELETE
ONcontentFOREACHROWSET@str=’oldcontentdeleted!’;
DELIMITER$$
CREATEEVENTIFNOTEXISTSevent_delete_content
ONSCHEDULEEVERYlMONTH
STARTSCURDATE()+INTERVALlMONTH
DO
IFYEAR(CURDATE())<2013THEN
ENDIF;
END$$
退出:mysql>exit;
列权限、表权限、数据库权限和用户权限。
数据库角色:
db_owner:在数据库中有全部权限;
db_accessadmin:可以添加或删除用户ID;
db_securityadmin:可以管理全部权限、对象所有权、角色和角色成员资格;
db_ddladmin:可以发出ALLDDL,但不能发出GRANT、REVOKE或DENY语句。
添加用户:
查看用户:
select*frommysql.user
wherehost=’host_name’anduser=‘user_name’
删除用户:
dropuseruser[,user]…
修改用户密码:
权限授予:grant
priv_type[(column_list)][,priv_type[(column_list)]]…
on[object_type]priv_level
touser_specification[,user_specification]…
[withwith_option…]
查看权限:
权限收回:revoke
fromuser[,user]…
revokeallprivileges,grantoption
第一步:使用安全密码
只有在使用密码的情况下,用户帐户才能得到安全保障。因此,当你安装MySQL时要做的第一件事就是给MySQL的根帐户设置一个密码(默认情况下密码为空)。
第二步:检查配置文件的许可
确保系统的其他用户无法查看类似于per-user这种配置文件,并把这些文件存储在非公共区域就显得至关重要。
第三步:对客户端服务器传输进行加密
第四步:禁用远程访问功能
设置服务器使用了--skip-networking选项启动,这样做能够屏蔽MySQL的TCP/IP网络连接,并确保没有用户能够远程连接到系统。
第五步:积极监控MySQL的访问日志
在windows下:
打开命令行窗口,停止mysql服务(或者在任务管理器里结束掉mysqld-nt.exe进程):Netstopmysql
启动mysql,一般到mysql的安装路径,找到mysqld-nt.exe
执行:mysqld-nt--skip-grant-tables
另外打开一个命令行窗口,执行mysql
usemysql
updateusersetpassword=password("123456")whereuser="root";
flushprivileges;
exit
GRANTSELECT,UPDATE
ONdb_test.content
事务是DB的逻辑工作单位,由用户定义的一组操作序列组成,序列中的操作要么全做要么全不做。
InnoDB和BDB存储引擎支持事务。
每个事务的处理必须满足ACID原则,即:
原子性(A):原子性意味着每个事务都必须被认为是一个不可分割的单元。
一致性(C):不管事务是完全成功完成还是中途失败,当事务使系统处于一致的状态时存在一致性。
隔离性(I):隔离性是指每个事务在它自己的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只有在它完全被执行时才能看到。
持久性(D):持久性是指即使系统崩溃,一个提交的事务仍然存在。
MySQL中可以使用begin开始事务,使用commint结束事务。
每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互的程度。
MySQL提供了下面4种隔离级:序列化(serializable)、可重复读(repeatableread)、提交读(readcommitted)、未提交读(readuncommitted)。
若对并发操作不加控制可能会存取和存储不正确的数据,就会出现数据的不一致问题。
(1)丢失更新(lostupdate)问题
(2)脏读(dirtyread)问题
(3)不可重复读(unrepeatableread)问题
(4)幻读(phantomread)问题
MySQL中可以使用begin开始事务,使用commint结束事务,中间可以使用rollback回滚事务。MySQL通过setautocommint、starttransaction、commit和rollback等语句支持本地事务。具体格式如下:
starttransaction|begin[work]
commit[work][and[no]chain][[no]release]
rollback[work][and[no]chain][[no]release]
setautocommit={0|1}
查询表级锁争用情况:showstatuslike’table%’:
查看系统上的行锁的争夺情况:showstatuslike‘innoDB_rowiock%’:
预防死锁的常用方法:
(1)在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访表,这样可以大大降低产生死锁的机会;
(2)在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大降低出现死锁的可能;
(3)在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不应先申请共享锁,更新时再申请排他锁;
(4)在repeatabie-read隔离级别下,如果两个线程同时对相同条件记录用select...forupdate加排他锁,在没有符合该条件记录情况下,两个线程都会加锁成功;
(5)当隔离级别为readcommitted时,如果两个线程都先执行select..forupdate,判断是否存在符合条件的记录,如果没有,就插入记录。
一些因素会使数据库中的数据部分或全部丢失,这些因素可能是:计算机硬件故障、计算机软件故障、自然灾害、盗窃、病毒、人为误操作。面对这些可能的因素会造成数据丢失或被破坏的风险,数据库系统提供了备份和恢复策略来保证数据库中数据的可靠性和完整性。
(1)完全备份
完全备份就是将数据库中的数据及所有对象全部备份。完全备份最简单也最快速的方式就是复制数据库文件,在复制时对MySQL数据库会有些要求。
(2)表备份
表备份就是仅将一张或多张表中的数据进行备份,可以使用selectinto…outfile或backuptable语句,只提取数据库中的数据,而不备份表的结构和定义。
(3)增量备份
增量备份就是在某次完全备份的基础上,只备份其后数据的变化。可用于定期备份和自动恢复。
数据库恢复的基础是利用转储的冗余数据。
mysqldump程序可以备份数据库表的结构,还可以备份一个数据库,甚至整个数据库系统,只需在mysql客户端实用程序的运行界面中输入mysqldump--help命令,即可查看到mysqldump程序对应的命令。语法格式:
mysqldump[options]database[tables]>filename
使用mysqlimport程序恢复数据
语法格式:
mysqlimport[options]databasetextfile...;
使用导入恢复语句loaddata...infile
使用直接从一个MySQL服务器拷贝文件到另一个服务器的方法,需要特别注意以下两点:
(1)两个服务器必须使用相同或兼容的MySQL版本。
(2)两个服务器必须硬件结构相同或相似,除非要复制的表使用MyISAM存储格式,这是因为这种表可以为在不同的硬件体系中共享数据提供了保证。
SELECT*FROMcontent
INTOOUTFILE’C:/BACKUP/backupcontent.txt’
FIELDSTERMINATEDBY’,’
OPTIONALLYENCLOSEDBY’"’
LINESTERMINATEDBY’’;
记录MySQL数据库中的日常操作和错误信息,分析这些日志文件可以了解MySQL数据库的运行情况、日常操作、错误信息以及哪些地方需要进行优化。
二进制日志:以二进制文件的形式记录了数据库中的操作,但不记录查询语句。
错误日志:记录MySQL服务器的启动、关闭、运行错误等信息。
错误日志、二进制日志。
二进制日志:
启动二进制日志:log-bin[=DIR[filename]]
查看二进制日志:mysqlbinlogfilename.number;
删除二进制日志:
删除所有二进制日志:resetmaster;
根据编号来删除二进制日志:purgemasterlogsto‘filename.number’;
慢查询日志:
启动慢查询日志:slow_query_log_file[=DIR[filename]]
删除慢查询日志:mysqladmin-uroot-pflush-logs
分布式数据库系统具有以下三个特点:
(1)适合分布式管理,能够有效提高系统性能。
(2)系统经济性和灵活性好
(3)系统可靠性高和可用性强
分布式数据库是基于网络连接的集中式数据库的逻辑集合,其模式结构既保留了集中式数据库模式特色,又具有更为复杂结构的特色。
具体表现为分布式数据库具有六层模式结构和五级映射与分布透明。
PHP是一种服务器端、跨平台、简单、面向对象、解释型、高性能、独立于框架、动态、可移植、HTML嵌入式等特点的脚本语言。其语法吸收了C语言、Java语言和Perl语言的特点,是一种被广泛应用的开源式的多用途脚本语言。
(1)使用函数mysql_connect建立非持久连接
(2)使用函数mysql_pconnect建立持久连接
(3)选择数据库
(4)执行数据库操作
(5)关闭与数据库服务器的连接
(1)非持久连接,当数据库操作结束之后将自动关闭,而持久连接会一直存在,是一种稳固持久的连接。
(2)持久连接,每次连接前都会检查是否使用了同样的servername、username、password进行连接,如果有,则直接使用上次的连接,而不会重复打开。
(3)非持久连接可以使用函数mysql_close关闭,而持久连接不能使用函数mysql_close关闭。
Mysql_fetch_row()以索引数组的方式取查询的结果集。
mysql_fetch_array()以索引数组和关联数组两种方式取查询的结果集。