PHP面试之MySQL数据库部分基础知识

你好,是我琉忆,PHP程序员面试笔试系列图书的做者。程序员

本周(2019.3.4至3.8)的一三五更新的文章以下:面试

周一:PHP面试MySQL数据库的基础知识
周三:PHP面试MySQL数据库的索引
周五:PHP面试MySQL数据库的面试真题
本身整理了一篇“ 一二三四范式有何区别?”的文章,关注公众号:“ 琉忆编程库”,回复:“ 范式”,我发给你。

如下内容来自《PHP程序员面试笔试宝典》如需转载请注明出处。数据库


1、几款开源数据库的对比和介绍

clipboard.png


2、SQL语言的功能有哪些?

SQL是结构化查询语言(Structured Query Language)的缩写,其功能包括数据查询、数据操纵、数据定义和数据控制四个部分。
数据查询是数据库中最多见的操做,经过select语句能够获得所需的信息。SQL语言的数据操纵语句(Data Manipulation Language,DML)主要包括插入数据、修改数据以及删除数据三种语句。SQL语言使用数据定义语言(Data Definition Language,DDL)实现数据定义功能,可对数据库用户、基本表、视图、索引进行定义与撤销。数据控制语句(Data Control Language,DCL)用于对数据库进行统一的控制管理,保证数据在多用户共享的状况下可以安全。
基本的SQL语句有select、insert、update、delete、create、drop、grant、revoke等。其具体使用方式见下表。编程

clipboard.png


本身整理了一篇“ 一二三四范式有何区别?”的文章,关注公众号:“ 琉忆编程库”,回复:“ 范式”,我发给你。

3、什么是事务?

事务是数据库中一个单独的执行单元(Unit),它一般由高级数据库操做语言(例如SQL)或编程语言(例如C++、Java等)书写的用户程序的执行所引发。当在数据库中更改数据成功时,在事务中更改的数据便会提交,再也不改变;不然,事务就取消或者回滚,更改无效。
例如网上购物,其交易过程至少包括如下几个步骤的操做:
1)更新客户所购商品的库存信息。
2)保存客户付款信息。
3)生成订单而且保存到数据库中。
4)更新用户相关信息,如购物数量等。
在正常的状况下,这些操做都将顺利进行,最终交易成功,与交易相关的全部数据库信息也成功地更新。可是,若是遇到忽然掉电或是其余意外状况,致使这一系列过程当中任何一个环节出了差错,例如在更新商品库存信息时发生异常、顾客银行帐户余额不足等,都将致使整个交易过程失败。而一旦交易失败,数据库中全部信息都必须保持交易前的状态不变,例如最后一步更新用户信息时失败而致使交易失败,那么必须保证这笔失败的交易不影响数据库的状态,即原有的库存信息没有被更新、用户也没有付款、订单也没有生成。不然,数据库的信息将会不一致,或者出现更为严重的不可预测的后果,数据库事务正是用来保证这种状况下交易的平稳性和可预测性的技术。
事务必须知足四个属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),即ACID四种属性。
(1)原子性
事务是一个不可分割的总体,为了保证事务的整体目标,事务必须具备原子性,即当数据修改时,要么全执行,要么全都不执行,即不容许事务部分地完成,避免了只执行这些操做的一部分而带来的错误。原子性要求事务必须被完整执行。
(2)一致性
一个事务执行以前和执行以后数据库数据必须保持一致性状态。数据库的一致性状态应该知足模式锁指定的约束,那么在完整执行该事务后数据库仍然处于一致性状态。为了维护全部数据的完整性,在关系型数据库中,全部的规则必须应用到事务的修改上。数据库的一致性状态由用户来负责,由并发控制机制实现,例如银行转帐,转帐先后两个帐户金额之和应保持不变,因为并发操做带来的数据不一致性包括丢失数据修改、读“脏”数据、不可重复读和产生幽灵数据。
(3)隔离性
隔离性也被称为独立性,当两个或多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操做与事务的操做隔离起来,不被其余正在进行的事务看到。例如对任何一对事务T一、T2,对T1而言,T2要么在T1开始以前已经结束,要么在T1完成以后再开始执行。数据库有四种类型的事务隔离级别:不提交的读、提交的读、可重复的读和串行化。由于隔离性使得每一个事务的更新在它被提交以前,对其余事务都是不可见的,因此,实施隔离性是解决临时更新与消除级联回滚问题的一种方式。
(4)持久性
持久性也被称为永久性,事务完成之后,数据库管理系统(DBMS)保证它对数据库中的数据的修改是永久性的,当系统或介质发生故障时,该修改也永久保持。持久性通常经过数据库备份与恢复来保证。
严格来讲,数据库事务属性(ACID)都是由数据库管理系统来进行保证的,在整个应用程序运行过程当中应用无须去考虑数据库的ACID实现。
通常状况下,经过执行COMMIT或ROLLBACK语句来终止事务,当执行COMMIT语句时,自从事务启动以来对数据库所作的一切更改就成为永久性的了,即被写入磁盘,而当执行ROLLBACK语句时,自动事务启动以来对数据库所作的一切更改都会被撤销,而且数据库中内容返回到事务开始以前所处的状态。不管什么状况,在事务完成时,都能保证回到一致状态。安全


4、什么是触发器?

触发器是一种特殊类型的存储过程,它由事件触发,而不是程序调用或手工启动,当数据库有特殊的操做时,对这些操做由数据库中的事件来触发,自动完成这些SQL语句。使用触发器能够用来保证数据的有效性和完整性,完成比约束更复杂的数据约束。
具体而言,触发器与存储过程的区别见下表。服务器

clipboard.png

根据SQL语句的不一样,触发器可分为两类:DML触发器和DLL触发器。
DML触发器是当数据库服务器发生数据操做语言事件时执行的存储过程,有After和Instead Of这两种触发器。After触发器被激活触发是在记录改变以后进行的一种触发器。Instead Of触发器是在记录变动以前,去执行触发器自己所定义的操做,而不是执行原来SQL语句里的操做。DLL触发器是在响应数据定义语言事件时执行的存储过程。
具体而言,触发器的主要做用表现为以下几个方面:
1)增长安全性。
2)利用触发器记录所进行的修改以及相关信息,跟踪用户对数据库的操做,实现审计。
3)维护那些经过建立表时的声明约束不可能实现的复杂的完整性约束以及对数据库中特定事件进行监控与响应。
4)实现复杂的非标准的数据库相关完整性规则、同步实时地复制表中的数据。
5)触发器是自动的,它们在对表的数据作了任何修改以后就会被激活,例如能够自动计算数据值,若是数据的值达到了必定的要求,则进行特定的处理。以某企业财务管理为例,若是企业的资金链出现短缺,而且达到某种程度,则发送警告信息。
下面是一个触发器的例子,该触发器的功能是在每周末进行数据表更新,若是当前用户没有访问WEEKEND_UPDATE_OK表的权限,那么须要从新赋予权限。并发

CREATE OR REPLACE TRIGGER update_on_weekends_check
BEFORE UPDATE OF sal ON EMP
FOR EACH ROW 
DECLARE
my_count number(4);
BEGIN
SELECT COUNT(u_name) 
FROM WEEKEND_UPDATE_OK INTO my_count 
WHERE u_name = user_name; 
IF my_count=0 THEN 
RAISE_APPLICATION_ERROR(20508, 'Update not allowed'); 
END IF; 
END;

5、触发器分为事前触发和过后触发,两者有什么区别?语句级触发和行级触发有什么区别?

事前触发发生在事件发生以前验证一些条件或进行一些准备工做;过后触发发生在事件发生以后,作收尾工做,保证事务的完整性。而事前触发能够得到以前和新的字段值。语句级触发器能够在语句执行以前或以后执行,而行级触发在触发器所影响的每一行触发一次。编程语言


预告:本周三(3.6)将更新PHP面试MySQL数据库的索引,敬请期待。spa

以上内容摘自《PHP程序员面试笔试宝典》书籍,目前本书没有电子版,可到各大电商平台购买纸质版。
图片描述3d

更多PHP相关的面试知识、考题能够关注公众号获取:琉忆编程库
图片描述

对本文有什么问题或建议均可以进行留言,我将不断完善追求极致,感谢大家的支持。

相关文章
相关标签/搜索