目录
1.SQL语言功能有哪些
SQL是结构化查询语言(Structured Query Language)的缩写,功能包括数据查询、数据操纵、数据定义和数据控制4个部分。
数据查询是最常见的操作,通过select语句得到所需信息。以下是基本SQL语句使用方式:
关键字 | 描述 | 语法格式 | |
数据查询 | select | 选择符合条件的记录 | select * from table where 条件语句 |
数据操纵 | insert | 插入记录 | insert into table(字段1,字段2)values(值1,值2) |
update | 更新记录 | update table set 字段名=字段值 where 条件表达式 | |
delete | 删除记录 | delete from table where 条件表达式 | |
数据定义 | create | 数据表的建立 | create table tablename(字段1,字段2…) |
drop | 数据表的删除 | drop table tablename | |
数据控制 | grant | 为用户授予系统权限 | grant <系统权限>|<角色>[,<系统权限>|<角色>]…to<用户名>|<角色>|public[,<用户名>|<角色>]…[with admin option] |
revoke | 收回系统权限 | revoke <系统权限>|<角色>[,<系统权限>|<角色>]…to<用户名>|<角色>|public[,<用户名>|<角色>]… |
引申:delete 和 truncate 命令有哪些区别?
相同点:都可以用来删除一个表中的数据
不同点:
truncate | delete |
是一个数据定义语言(Data Definition Language,DDL),它会被隐式提交,一旦提交后不能回滚。 | 每次从表中删除一行数据,同时将删除的操作以日志的形式保存,一边将来进行回滚操作。 |
删除数据后,被删除的数据会立刻释放占用的存储空间,且不可恢复。 | 被删除的数据占用的存储空间还在,还可以恢复。 |
速度比delete快。 |
问:Oracle 数据库一个表中有若干条数据,占用存储空间为10MB,如果用delete语句删除表中所有数据,此时该表所占存储空间多大?
答:10MB。数据库中delete操作类似在Windows系统中把数据放进回收站,可被恢复,因此不会立即释放所占存储空间。如果想在删除数据后立即释放存储空间,可用truncate。
2.内连接和外连接有何区别
内连接:
也称自然连接,只有两个表相匹配才能在结果集中出现。返回的结果集选取两个表中所有相匹配的数据,舍弃不匹配的数据。可能会造成信息的丢失。语法如下:
select fieldlist from table [inner] join table2 on table.column = table2.column
外连接:
不仅包含符合连接条件的行,而且包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
举个例子:
学号 | 姓名 |
001 | 林逸 |
002 | 杨明 |
003 | 萧炎 |
学号 | 课程名 |
001 | 人工智能 |
002 | 高等数学 |
003 | 线性代数 |
004 | 控制工程 |
分别对两个表进行内连接和左外连接:
学号 | 姓名 | 课程名 |
001 | 林逸 | 人工智能 |
002 | 杨明 | 高等数学 |
003 | 萧炎 | 线性代数 |
学号 | 姓名 | 课程名 |
001 | 林逸 | 人工智能 |
002 | 杨明 | 高等数学 |
003 | 萧炎 | 线性代数 |
004 | 控制工程 |
3.什么是事务
事务是数据库中一个单独的执行单元(Unit),它通常由高级数据库语言(如SQL)或编程语言(如C++、Java)编写的用户程序的执行所引起的。
当在数据库中更改数据成功时,在事务中更改的数据就会提交,不再改变。否则,事务就取消或回滚,更改无效。
事务必须满足4个属性,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),概括为ACID 这4种属性。
原子性 | 事务是一个不可分割的整体,为保证事务的总体目标,事务必须具有原子性。 当数据修改时,要么全执行,要么全不执行,不允许执行部分事务。 |
一致性 | 一个事务执行之前和执行之后,数据库数据必须保持一致性。 数据库的一致性状态应满足模式锁指定的约束,那么在完整执行该事务后数据库仍然处于一致性状态。 如银行卡转账,转账前后两个账户余额的总和应保持不变。 (由于并发操作带来的数据不一致性包括丢失数据修改、读“脏”数据、不可重复读和产生“幽灵”数据) |
隔离性 | 隔离性也称独立性,当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作与事务的操作隔离起来,不被其他正在进行的事务看到。 实现隔离性是解决临时更新与消除级联回滚问题的一种方式。 |
持久性 | 也称永久性,事务完成以后,DBMS保证它对数据库中的数据的修改是永久性的,当系统或介质发生故障,该修改也永久保持。 持久性一般通过数据库备份与恢复来保证。 |
一般情况,通过执行COMMIT或ROLLBACK语句来终止事务。当执行COMMIT时,自执行事务以来的所有对数据库的修改都成为永久性的了,已被写入磁盘;而执行ROLLBACK时,自执行事务以来所有对数据库的操作被撤销,数据库返回到事务开始之前的状态。无论哪种情况,在事务完成时,都能保证回到一致状态。
4.什么是存储过程?它与函数有什么区别和联系?
SQL语句在执行时要先编译,然后再被执行。在大型数据库系统中,为提高效率,将为完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字调用执行。
常用语法:
创建存储过程:
create procedure chs @[参数名][类型]
as
begin
…… //sql语句
end
调用存储过程:
exec chs[参数名]
删除存储过程:
drop procedure chs
使用存储过程有何好处:
1)增强SQL语言的功能和灵活性,由于可用控制流程语句编写存储过程,有很强的灵活性,因此可完成复杂的判断和运算。
2)保证数据的安全性和稳定性。
3)存储过程可以使没有权限的用户在控制之下间接地存取数据库,也保证了数据的安全。
存储过程不等于函数,本质没区别,但还是存在不同的:
存储过程 | 函数 |
一般作为一个独立地部分执行 | 可以作为查询语句地一个部分类调用。 由于函数可以返回一个对象,因此它可以在查询语句中位于From关键字的后面。 |
一般实现功能较复杂 | 实现功能针对性较强 |
可以返回多个参数 | 需要用括号包住输入的参数,且只能返回一个值或表对象 |
不可以嵌入SQL | 可以嵌入在SQL中使用,可以在select中调用 |
只能操作内建表 | 不能直接操作实体表 |
在创建时即在服务器上进行了编译,执行速度比函数快。 |
5.各种范式有什么区别
按照“数据库规范化”对表进行设计,目的是减少数据库中的数据冗余,以增加数据的一致性。
范化是在识别数据库中的数据元素、关系以及定义所需的表和各表中的项目这些初始工作之后的一个细化过程。常见的范式有1NF、2NF、3NF、BCNF以及4NF。
1NF(第一范式) | 1)数据库表的每一列都是不可分割的基本数据项,同一列不能有多个值,即实体中的某个属性不能有多个值或不能有重复属性。 2)如果出现重复属性,需要定义一个新的实体,新实体由重复属性构成,新实体和原实体之间为一对多关系。 3)第一范式的模式要求属性指不可再分裂为更小部分,即属性项不能是属性组合或由组属性组成。 简而言之就是无重复的列 |
2NF(第二范式) | 1)满足第二范式(2NF)必须先满足第一范式(1NF) 2)要求数据库表中的每个实例或行必须可以被唯一区分。为实现区分通常给表加上一个列,以存储各个实例的唯一标识。 3)若A是关系模式R的候选键的一个属性,则称A为R的主属性,否则就是非主属性。 4)若非主属性对关键字只是部分依赖,而非完全依赖,会导致数据冗余或更新异常问题,需要将其分为两个关系模式,新关系通过外关键字联系,在需要时进行连接。 |
3NF(第三范式) | 满足第二范式,且每个非主属性都不传递依赖于R的候选键,则称R为第三范式模式。 |
BCNF | 构建在第三范式基础上,如果关系模式R是第一范式,且每个属性都不传递依赖于R的候选键,则R为BCNF模式。 如果存在关键字段决定关键字段的情况,就不符合BCNF。 |
4NF(第四范式) | 设R是一个关系模式,D是R上多值依赖集合。如果D中存在凡多值依赖X→Y时,X必是R的超键,则称R是第四范式模式。 |
6.什么是触发器
一种特殊类型的存储过程,由事件触发,而不是由程序调动或手工启动。
使用触发器可以用来保证数据的有效性和完整性,完成比约束更复杂的数据约束。
触发器 | 存储过程 |
当某类数据操纵DML语句发生时隐式调用 | 从一个应用或过程中显式地调用 |
触发器体内禁止使用COMMIT和ROLLBACK语句 | 可以使用所有 PL/SQL 块中能使用的 SQL 语句,包括 COMMIT 和 ROLLBACK 语句 |
不能接受参数输入 | 可以接受参数输入 |
根据SQL语句不同,触发器分为DML触发器和DLL触发器。
DML触发器是当数据库服务器发生数据操作语言事件时执行的存储过程,由 After 和 Instead Of 两种触发器。顾名思义,After触发器被激活触发是在记录改变之后进行的一种触发器;而Instead Of触发器是在记录变更之前,去执行触发器本身定义的操作,而不是执行原来SQL语句里的操作。DLL触发器是在响应数据定义语言事件时执行的存储过程。
触发器作用主要由以下几方面:
1)增加安全性。
2)利用触发器记录所进行的修改和相关信息,跟踪用户对数据库的操作,实现审计。
3)维护那些通过创建表时的声明 约束 不可能实现的 复杂的完整性约束,并且对数据库中特定事件 进行监控和响应。
4)实现复杂的 非标准的 数据库相关完整性规则、同步实时复制表中的数据。
5)触发器是自动的,它们在对表中的数据做了任何修改之后就会被激活。
引申:触发器分事前触发和事后触发,这两者有什么区别?语句级触发和行级触发有什么区别?
事前触发发生在事件发生之前,用于验证一些条件或进行一些准备工作;事后触发发生在事件发生之后,做收尾工作。
事前触发可以获得之前和新的字段值,而事后触发可以保证事务的完整性。
语句级触发可以在语句执行之前或之后执行,而行级触发在触发器所影响的每一行触发一次。
7.什么是游标
游标提供了一种对从表中检索出的数据进行操作的手段,实际上是一种能从包含多条数据记录的结果集中每次提取一条记录的机制。
游标总是与一条SQL语句相关联,因为游标是由结果集和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理,必须声明一个指向该结果集的游标。
举个例子:声明一个游标 student_cursor,用于访问数据库SCHOOL中的“学生基本信息表”,
USE SCHOOL
GO
DECLARE student_cursor CURSOR
FROM SELECT * FROM 学生基本信息表
声明游标时,在SELECT语句中未使用WHERE子语句,故此游标返回的结果集是由“学生基本信息表”中的所有记录构成的。
在select返回的结果集中,游标不允许程序对整个行集合执行相同的操作,但对每一行数据的操作不作要求。
游标有两个优点:
1)在使用游标的表中,对行提供删除和更新功能。
2)游标将面临集合的数据库管理系统和面向行的程序设计连接了起来。
8.数据库日志特点及注意事项
日志文件(Log File)记录所有对数据库数据的修改,主要是保护数据库以防故障发生,以及恢复数据时使用。
主要有以下特点:
1)每一个数据库至少包含两个日志文件组。每个日志文件组至少包含两个日志文件成员。
2)日志文件组以循环方式进行写操作。
3)每一个日志文件成员对应一个物理文件。
通过日志文件来记录数据库事务可以最大限度地保证数据的一致性和安全性,但一旦数据库中日志满了,就只能执行查询等读操作,不能执行更改、备份等操作,原因是任何写操作都要记录日志,也就是说,基本上处于不能使用的状态。
9.union和union all有什么区别
union在进行表 求并集合 后会去掉重复的元素,所以会对产生的结果集进行排序运算,删除重复的记录再返回结果。
union all则只是简单地将两个结果集合并后就返回结果,可能包含重复的数据。
在执行查询操作时,union all 要比 union 快很多,如果可以确认要合并的两个结果集不包含重复数据,最好使用union all。
10.什么是视图
视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,与基本表不同,它是一个虚表。在数据库中,存放的只是视图的定义,不存放视图包含的数据项,这些数据仍存在在原理啊的基本表中。
视图作用主要有:
1)简化数据查询语句
2)可以让用户从多角度看待同一数据
3)引入视图可以提高数据的安全性
4)视图提供了一定程度的逻辑独立性等。