简答题1. 什么是多表连接查询?
多表连接查询是指基于两个或两个以上的表或视图的查询。在实际应用中,查洵单表不可能满足业务的需求,只能通过多表的连接来获取所需要的数据。多表连接查询主要分为等值连接、非等值连接、外连接和自连接四类。
需要注意的是,WHERE子句中的连接条件的个数不能少于FROM后表的个数减1,这样可以确保不会形成笛卡儿积。即为了连接n个表,至少需要n-1个连接条件。例如,为了连接5个表,至少需要4个连接条件。
[考点] SQL编写
2. 笛卡儿积是什么?
笛卡儿积是把表中所有的记录做乘积操作,生成大量的结果,而通常结果中可用的值有限。笛卡儿积出现的原因多种多样,通常是由于连接条件缺失造成的。对笛卡儿积的使用,需要注意以下几点:
1)笛卡儿积会在下面条件下产生:
①省略连接条件或连接条件缺失。
②连接条件无效,例如,表A和表B进行连接,但连接条件为A.ID=A.ID,这里的连接条件无效。
③统计信息不准确,例如,表A有1000W的数据量,但是在统计信息中记录的是0行,这种情况下表的连接易形成笛卡儿积。
2)由于笛卡儿积中的所有表中的所有行互相连接,所以,形成笛卡儿积的结果集的记录数是组成它的各个子集的乘积。
3)为了避免笛卡儿积,需要在WHERE字句中加入有效的连接条件。
4)默认情况下,查询会返回全部行,包括重复行。
[考点] SQL编写
3. 什么是Fop-N查询?
在数据库查询中,“Top-N分析”也称“Top-N查询”,就是获取某一数据集合(表或查询结果集)中的前N条记录,例如,考试成绩前三名的学生信息、销量前十名的畅销书信息、从当前时刻开始最早起飞的五次航班信息等,实际应用中Top-N分析经常会用到。以下几点是Top-N的性质:
1)Top-N分析就是查询前几名的意思。
2)在Oracle数据库中,Top-N分析通过ROWNUM实现。
3)Top-N分析中必须使用ORDER BY排序子句。
4)Top-N分析中通常会有内建视图,一般的方法是先对内建视图的某一列或某些列排序,然后对此内建视图使用ROWNUM取前多少行数据。
如果要按照某种规则对符合条件的查询结果进行排序,再返回查询结果中的全部记录行,那么这是很容易做到的。例如,要查询10号和20号部门所有员工的工资信息,可采用如下方式:
SELECT EMPNO,ENAME,SAL FROM SCOTT.EMP DWHERE DEPTNO IN(10,20)ORDER BY D.EMPNO;
如果是要在排序查询中进行Top-N分析,那么情况要复杂一些。例如,要求按照工资降序排列,查询10号和20号部门工资最高前五名员工的信息,则SQL语句为
在以上结果中,“原始行号”RN的含义为子查询结果排序前的行号(子查询执行了WHERE子句之后,但尚未执行ORDER BY子句排序时的行号)。ROWNUM是Oracle数据库对查询结果自动添加的一个伪列。简单地说,就是在每一次查询操作中,Oracle都会对符合条件的查询结果中的每一条记录行自动进行编号,该编号总是从1开始,并保存在伪列ROWNUM中。之所以称之为“伪列”,是因为它在物理上(查询目标表中)并不是真的存在,而是在每一次查询过程中动态生成的。此外,由于伪列ROWNUM在物理上并不存在,因此,不允许以任何查询基表的名称作为前缀。
[考点] SQL编写
4. 什么是子查询?子查询包括哪几种类型?
所谓子查询是指嵌套在其他查询中的查询语句,又称为内部查询或嵌套查询。主查询又称为外部查询,是包含其他子查询的查询语句。按照子查询与主查询的关联关系,可以将子查询分为“标量子查询(Scalar Subquery)”和“关联子查询”两种,其中,关联子查询又可以分为相关子查询(Correlated Subquery)和非相关子查询(Uncorrelated Subquery),非相关子查询也叫独立子查询。子查询根据返回的行数分为单行子查询和多行子查询,若根据返回的列数则分为单列子查询和多列子查询。子查询的分类可以参考下图。
[考点] SQL编写
5. 什么是合并查询(集合查询)?
有时在实际应用中,为了合并多个SELECT语句的结果,可以使用集合操作符UNION、UNION ALL、INTERSECT、MINUS,这些集合操作符多用于数据量比较大的数据库,运行速度快,称为合并查询,也叫集合查询。以下分别对这几个命令进行分析与讲解。
1)UNION:该操作符用于计算两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行,只保留重复行的一行结果。需要注意的是:
①当执行联合查询时,必须保证它们具有相同个数的结果列,否则报如下的错误:ORA-01789:查询块的结果列数。
②列的数据类型不同也报错:ORA-01790:expression must have same datatype AS corresponding expression。数据类型的长度不一样是可以的,但是必须保证是相同的数据类型。
2)UNION ALL:该操作符与UNION相似,但是它不会取消重复行,而且不会排序。
3)INTERSECT(相交):该操作符用于计算两个结果集的交集。
4)MINUS(相减):该操作符用于计算两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据,而且第一个集合中的相同数据只输出一个。
MINUS具有如下的实用功能:
1)比较两个表中的某一个字段中的不同的数据。
2)比较两个表的结构的不同。示例如下:
SYS@lhrdb>CREATE TABLE T_LHR_01(ID NUMBER);
Table treatcd.
SYS@lhrdb>CREATE TABLE T_LHR_02(ID NUMBER,NAME VARCHAR2(255));
Table created.
SYS@lhrdb>SELECT C.COLUMN_NAME FROM COLS C WHERE C. TABLE_NAME='T_LHR_02'
2 MINUS
3 SELECT C.COLUMN_NAME FROM COLS C WHERE C.TABLE_NAME='T_LHR_01';
COLUMN_NAME
-----------------------
NAME
可见,表T_LHR_02比表T_LHR_01多出一列NAME。
[考点] SQL编写
6. SQL:1999语法是什么?
Oracle除了自己的连接语法外,同时支持ANSI(American National Standards Institute,美国国家标准协会)的SQL:1999标准的连接语法。SQL:1999是ANSI制定的通用标准,各数据库厂商都支持的一个标准。
SQL:1999语法格式如下:
SELECT table.column,
table2.column
FROM tablel
CROSS JOINtable2|NATURAL JOIN table2|JOIN table2
USING (column_name)|
JOIN table2
ON (table1.column_name=table2.column_name)|
LEFT |RIGHT |FULL OUTER JOIN table2
ON (table1.column_name=table2.column_name)
WHERE...;
其中,INNER JOIN表示内连接;LEFT JOIN表示左外连接;RIGHT JOIN表示右外连接;FULL JOIN表示完全外连接;ON子句用于指定连接条件。连接分类图如下图所示。
各种表之间的连接方式见下表。
[考点] SQL编写
7. 什么是交叉连接(Cross Join)?
交叉连接(Cross Join)子句是在SQL:1999标准中开始支持的,为了生成笛卡儿积而设计。连接语法中,交叉连接不使用WHERE子句,而是在FROM子句中的两个连接表之间使用CROSS JOIN显式标明。例如:
SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAMEFROM SCOTT.EMP CROSS JOIN SCOTT.DEPT;
上述语句返回的是被连接的两个表所有符合查询条件记录行的笛卡儿积,其结果集合中的记录行数等于第一个表中符合查询条件的记录行数乘以第二个表中符合查询条件的记录行数,其效果等同于如下语句:
SELECT EMPNO,ENAME,SAL,EMP.DEPTNO,DNAME FROM SCOTI.EMP,SCOTT.DEP;
[考点] SQL编写
8. 什么是内连接(Inner Join/Join)?
内连接(Inner Join/Join)是常用的查询方式,也叫简单连接,是从两个或更多的表中筛选出符合连接条件的数据(记录行),对其连接后再进行查询并返回结果,如果遇到无法满足连接条件的数据,那么将之丢弃。内连接在FROM子句中使用INNER JOIN或JOIN关键字标识,并使用ON子句指定连接条件以及其他的查询限定条件。
内连接可以分为等值连接和非等值连接。例如,“SELECT* FROM A,B WHERE A.FIELD1=B.FIELD2”属于等值连接,它返回满足左表输入与右表输入连接的每一行。
[考点] SQL编写
9. 请使用ON子句连接查询SCOTT.EMP和SCOTT.DEPT表,要求显示EMPNO、ENAME、JOB和SAL字段。
题目要求使用ON子句,这是一个考查点,SQL语句如下:
SYS@LHRDB>SELECT EMPNO, ENAME, JOB, SAL FROM SCOTT.EMP E JOIN SCOTT.DEPT D ONE.DEPTNO=D.DEPTNO;
[考点] SQL编写
10. 什么是等值连接?
等值连接就是当两个表的公共字段相等的时候把两个表连接在一起,它是连接条件中最常见的一种。公共字段是两个表中具有相同含义的列。如下两个连接都属于等值连接:
连接1:
SELECT ENAME 姓名,(SELECT D.DNAME FROM SCOTT.DEPT D WHERE E.DEPTNO=D.DEPTNO) 部门名称
FROM SCOTT.EMP E ORDERBY E.ENAME;
连接2:
SELECT E.ENAME 姓名,D.DNAME部门名称
FROM SCOTT.EMP E,SCOTT.DEPT D
WHERE E.DEPTNO=D.DEPTNO ORDER BY E.ENAME;
[考点] SQL编写
11. 什么是自然连接?
自然连接属于等值连接的一种特殊形式,它是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将它们连接起来,并返回所有符合条件的结果。自然连接以相同列为条件创建等值的列,不推荐使用。若没有任何相同的字段,则会产生笛卡儿积,这对数据库的性能有较大影响。
需要注意的是,自然连接只能发生在两个表中有相同名字和数据类型的列上。如果表中的数据列有相同的名字,但数据类型不同,那么自然连接语法会提示错误。
有关自然连接的一些注意事项如下:
1)如果进行自然连接的两个表有多个字段都具有相同名称和类型,那么它们都会被作为自然连接的条件。
2)如果进行自然连接的两个表仅有字段名称相同,而数据类型不同,那么将会返回一个错误。
自然连接自动进行关联字段的匹配。示例如下:
SYS@RACLHR2>SELECT*FROM SCOTT.EMP NATURAL JOIN SCOTT.DEPT;
[考点] SQL编写
12. 什么是自连接?
自连接(Self Join)是SQL语句中的一种特殊连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。
例如,在SCOTT.EMP中的每一个员工都有自己的MGR(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理。如果需要将每一个员工自己的名字及其经理的名字都查询出来,SQL语句应该如何写呢?这个时候就可以用到自连接了。最终SQL如下:
SELECT A.ENAME WORKER, B.ENAME MANAGER FROM SCOTT.EMP A,SCOTT.EMP B WHERE A.MGR=B.EMPNO ORDER BY A.ENAME;
对于非等值连接,理解起来比较简单,即表和表之间是通过非等值运算符来连接的,例如,<>、BETWEEN...AND...等,如下:
SELECT EMP.EMPNO,EMP.ENAME,DEPT.LOC FROM SCOTT.EMP INNER JOIN SCOTT.DEPT ON EMP.DEPTNO <>DEPT.DEPTNO
WHERE EMPNO=7788 ORDER BY EMPNO;
13. 外连接包含哪几种类型?
外连接分为3种,即左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN),通常可以省略OUTER这个关键字,所以,也称为左连接、右连接和全连接。
[考点] SQL编写
14. 使用SCOTT/TIGER用户下的EMP表和DEPT表完成下列练习,表的结构说明如下:
EMP员工表(EMPNO员工号/ENAME员工姓名/JOB工作/MGR上级编号MIREDATE受雇日期/SAL薪金/COMM佣金/DEPTNO部门编号)
DEPT部门表(DEPTNO部门编号/DNAME部门名称/LOC地点)
工资=薪金+佣金
1)列出至少有一个员工的所有部门。
2)列出薪金比“SMITH”多的所有员工。
3)列出所有员工的姓名及其直接上级的姓名。
4)列出受雇日期早于其直接上级的所有员工。
5)列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
6)列出所有工作为“CLERK”办事员的姓名及其部门名称。
7)列出最低薪金大于1500的各种工作。
8)列出在部门“SALES”销售部工作的员工的姓名,假定不知道销售部的部门编号。
9)列出薪金高于公司平均薪金的所有员工。
10)列出与员工“SCOTT”从事相同工作的所有员工。
11)列出薪金等于部门编号为30的员工的薪金的所有员工的姓名和薪金。
12)列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
13)列出在每个部门工作的员工数量、平均工资和平均服务期限。
14)列出所有员工的姓名、部门名称和工资。
15)列出所有部门的详细信息和部门人数。
16)列出各种工作的最低工资。
17)列出工作为“MANAGER”的员工的最低薪金。
18)列出所有员工的年工资,按年薪从低到高排序。
本题考查编写SQL语句的能力,答案如下:
1)考查两个表联合查询,及GROUPBY...HAVING的用法,最终的SQL如下:
SELECT DNAME FROM SCOTT.DEPT T WHERE T.DEPTNO IN (SELECT T.DEPTNO FROM SCOTT.EMP GROUP BY T.DEPTNO HAVING COUNT(*)>1)
2)经典的自连接查询,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP T WHERE SAL>(SELECT SAL FROM SCOTT.EMP WHERE ENAME LIKE='SMITH);
3)多次对自己查询,为表取个别名,内部查询可以像对象一样引用外部的对象的字段,这里引用与编程中的作用域相似,即与{}类比,最终的SQL如下:
SELECT ENANE,(SELECT ENAME FROM SCOTT.EMP WHERE SCOTT.EMPNOIN(A.MGR)) FROM SCOTT.EMP A;
4)日期可直接用来比较,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP AWHERE HIREDATE<(SELECT HIREDATE FROM SCOTT.EMP WHERE SCOTT.EMPNO IN (A.MGR));
5)以SCOTT.DEPT表为主,左连接查询,最终的SQL如下:
SELECT DNAME, B.*FROM SCOTT.DEPTALEFT JOIN SCOTT.EMPB ON A.DEPTNO=B.DEPTNO;
6)最终的SQL如下:
SELECT ENAME,(SELECT DNAME FROM SCOTT.DEPT WHERE T.DEPTNO IN(A.DEPTNO))AS DNAME FROM SCOTT.EMP A WHERE JOB='CLERK';
7)找出哪些工作的所有员工的薪金都大于1500,最终的SQL如下:
SELECT T.JOB FROM SCOTT.SCOTT.EMP T GROUP BY T.JOB HAVING MIN(SAL)>1500;
8)经典的两个表连接,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP WHERE T.DEPTNO=(SELECT T.DEPTNO FROM SCOTT.DEPT WHERE DNAME='SALES');
9)反复查自己,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP WHERE SAL>(SELECT AVG(SAL) FROM SCOTT.EMP);
10)排除自己,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP WHERE JOB IN (SELECT JOB FROM SCOTT.EMP WHERE ENAME='SCOTT) AND ENAME !='SCOTT;
11)考查ANY的用法,且排除自己,最终的SQL如下:
SELECT ENAME, SAL FROM SCOTT.EMP WHERE SAL=ANY (SELECT SAL FROM SCOTT.EMP WHERET.DEPTNO=30) AND T.DEPTNO!=30;
12)MAX的用法,最终的SQL如下:
SELECT SAL, ENAME FROM SCOTT.EMP WHERE SAL>(SELECT MAX(SAL) FROM SCOTT.EMP WHERE T.DEPTNO=30);
13)经典的GROUP BY用法,最终的SQL如下:
SELECT T.DEPTNO, COUNT(*), AVG(A.SAL+COMM), AVG(SYSDATE-HIREDATE) FROM SCOIT.EMP A GROUP BY T.DEPTNO;
14)经典的两个表的连接查询,用具体的名称替换一个表中的主键的ID(解决很多人在实际运用中会遇到的不能绑定多列的问题),也可用WHERE来查询,与题5)比较,最终的SQL如下:
SELECT ENAME,SAL+COMM,(SELECT DNAME FROM SCOTT.DEPT A WHERE A.DEPTNO=B.DEPTNO) AS DNAME FROM SCOTT.EMP B;
15)因为使用了SELECT*,将显示SCOTT.DEPT和后面临时表B的全部字段(注意:不只是SCOTT.DEPT的字段,注意*号),最终的SQL如下:
SELECT * FROM SCOTT.DEPT A LEFT JOIN (SELECT DEPTNO, COUNT(*) FROM SCOTT.EMP GROUP BY DEPTNO) B ON A.DEPTNO=B.DEPTNO;
16)考查MIN的用法,最终的SQL如下:
SELECT JOB, MIN(SAL) FROM SCOTT.EMP GROUP BY JOB;
17)因为MANAGER是值而不是字段,所以不能用小写,最终的SQL如下:
SELECT MIN(SAL+COMM) FROM SCOTT.EMP WHERE JOB='MANAGER';
18)NVL:空转化函数。最终的SQL如下:
SELECT ENAME, (SAL+NVL(COMM,0))* 12 AS SAL FROM SCOTT.EMP ORDER BY SAL;
[考点] SQL编写
15. E-R图向关系模型的转换一般遵循哪些原则?
E-R图向关系模型的转换一般遵循如下原则:
1)一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。
例如,学生实体可以转换为如下关系模式,其中,学号为学生关系的码:
学生(学号,姓名,出生日期,所在系,年级,平均成绩)。同样,性别、宿舍、班级、档案材料、教师、课程、教室、教科书都分别转换为一个关系模式。
2)一个联系转化为一个关系模式,与该联系相连的各实体的码以及联系的属性转化为关系的属性。该关系的码有如下3种情况:
①若联系为1:1,则每个实体的码均是该关系的候选码。
②若联系为1:n,则关系的码为n端实体的码。
③若联系为m:n,则关系的码为诸实体码的组合。
下面分别来讲解这3种情况。
①联系为1:1
一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
a)如果转换为一个独立的关系模式,那么与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是该关系的候选码。
b)如果与某一端对应的关系模式合并,那么需要在该关系模式的属性中加入另一个关系模式的码和联系本身的属性。
②联系为1:n
一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
a)如果转换为一个独立的关系模式,那么与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
b)如果与n端对应的关系模式合并,那么在n端实体对应模式中加入1端实体所对应关系模式的码,以及联系本身的属性。而关系的码为n端实体的码。
③联系为m:n
一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为各实体码的组合。
3)同一实体集的实体间的联系,即自联系,也可按上述1:1、1:n和m:n三种情况分别处理。
例如,如果教师实体集内部存在领导与被领导的1:n自联系,那么可以将该联系与教师实体合并,这时主键职工号将多次出现,但作用不同,可用不同的属性名加以区分。例如,在合并后的关系模式中,主键仍为职工号,再增设一个“系主任”属性,存放相应系主任的职工号。
4)具有相同码的关系模式可合并。
为了减少系统中的关系个数,如果两个关系模式具有相同的主键,那么可以考虑将它们合并为一个关系模式。合并方法是将其中一个关系模式的全部属性加入另一个关系模式中,然后去掉其中的同义属性(可能同名也可能不同名),并适当调整属性的次序。
[考点] E-R模型
16. 假定一个部门的数据库包括以下信息。
1)职工的信息:职工号、姓名、地址和所在部门。
2)部门的信息:部门所有职工、部门名、经理和销售的产品。
3)产品的信息:产品名、制造商、价格、型号及产品的内部编号。
4)制造商的信息:制造商名称、地址、生产的产品名和价格。
试画出这个数据库的E-R图。
17. 某学校学籍科管理中心需建立一个学生选修课数据库,该数据库中需要存储和管理下列信息:
学生:学号,姓名,性别,年龄
课程:课程号,课程名,学时
以上数据存在的约束条件是:
一名学生可以选修多门课程,一门课程可以有多名学生,并且选修课要有成绩的登记。
I)画出该关系的E-R图。
2)用SQL语句创建E-R关系图中所有涉及的表。
1)建立E-R图如下图所示。
2)建表语句如下:
CREATE TABLE学生
学号 VARCHAR(10) PRIMARYKEY,
姓名 VARCHAR(20) NOT NULL
性别 CHAR(2)CHECK(性别 IN('男','女')),
年龄 INT);
CREATE TABLE 课程(
课程号 VARCHAR(10)PRIMARY KEY,
课程号 VARCHAR(20)NOT NULL,
学时 TNT
);
CREATE TABLE 选修(
学号 VARCHAR(10),
课程号 VARCHAR(10),
成绩 INT,
PRIMARY KEY(学号,课程号),
FOREIGN KEY(学号)REFERENCES学生学号,
FOREIGN KEY(课程号)REFERENCES课程课程号,
);
[考点] E-R模型
18. 热备份和冷备份的区别有哪些?
冷备份和热备份的区别见下表。
|
冷备份
|
热备份
|
简 介
|
冷备份指在数据库已经正常关闭后,将关键性文件复制到另 外位置的一种备份方式,适用于所有模式的数据库
|
热备份是在数据库运行的情况下,采用归档方式备份数据的 方法。针对归档模式的数据库,在数据库仍旧处于工作状态时 进行备份
|
优 点
|
1)非常快速的备份方法,只需复制文件,备份与恢复操作相 当简单 2)容易归档,简单复制即可 3)容易恢复到某个时间点上,只需将文件再复制回去即可 4)能与归档方法相结合,做数据库“最新状态”的恢复 5)低度维护,高度安全
|
1)可在表空间或数据文件级备份,备份时间短 2)备份时数据库仍可使用 3)可以将数据库恢复到任意一个时间点 4)可对几乎所有数据库实体做恢复 5)恢复是快速的,大多数情况下在数据库仍工作时恢复
|
缺 点
|
1)当单独使用时,只能提供到“某一时间点上”的恢复 2)在实施备份的全过程中,数据库必须是关闭状态,所以, 在备份的过程中,数据库就不能做其他工作了 3)若磁盘空间有限,则复制到磁带等其他外部存储设备上, 速度会很慢 4)不能按表或按用户恢复
|
1)不能出错,否则后果严重 2)若热备份不成功,则所得结果不可用于时间点的恢复 3)维护困难,所以,要特别仔细小心,不允许“以失败而告 终”的情况发生
|
[考点] 热备份和冷备份
19. SQL注入的含义是什么?
所谓SQL注入(SQL Injection),就是通过把SQL命令插入WEB表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令的目的。例如,在代码中使用下面的SQL语句:SQL="SELECT TOP 1*FROM USER WHERE NAME='''+NAME+'''AND PASSWORD='''+PASSWORD+'''''来验证用户名和密码是否正确,其中,NAME和PASSWORD是用户输入的内容,当用户输入用户名为AA,密码为“BB或'A'='A'”时,拼接出来的SQL语句就为“SELECT TOP 1*FROM USER WHERE NAME='AA' AND PASSWORD='BB'OR'A'='A'”,那么只要USER表中有数据,这条SQL语句就会有返回结果,这就达到了SQL注入的目的。作为DBA,永远不要信任用户的输入,相反,必须认定用户输入的数据永远都是不安全的,对用户输入的数据必须都进行过滤处理。
[考点] SQL注入
20. 有哪些方法可以防止SQL注入?
为了防止SQL注入,需要注意以下几个要点:
1)永远不要信任用户的输入。可以通过正则表达式或限制长度的方式对用户的输入进行校验;对单引号进行转换等。
2)永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询、存取。
3)永远不要使用管理员权限的数据库连接,建议为每个应用赋予单独的权限。
4)不要把机密信息直接存放,建议对密码或敏感信息进行加密或:HASH处理。
5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
6)SQL注入的检测一般采取辅助软件或借助网站平台,软件一般采用SQL注入检测工具JSKY,网站平台就有亿思网站安全平台检测工具MDCSOFT SCAN等。
[考点] SQL注入
21. UML主要应用于哪些行业?
目前,UML已成功应用于电信、金融、政府、电子、国防、航天航空、制造与工业自动化、医疗、交通、电子商务等领域中。在这些领域中,UML的建模包括大型、复杂、实时、分布式、集中式数据或者计算,以及嵌入式系统等,而且还用于软件再生工程、质量管理、过程管理、配置管理的各方面。在软件无线电技术中,UML的应用是可行的,而且具有优势。
[考点] UML
22. 什么是OLAP和OLTP?它们之间的适用场景有什么不同?
数据处理大致可以分成两大类:OLTP(On-Line Transaction Processing,联机事务处理)和OLAP (On-Line Analytical Processing,联机分析处理)。
OLTP是传统的关系型数据库的主要应用,即记录实时的增、删、改,主要是执行基本的、日常的事务处理,例如,在银行存取一笔款,就是一个事务交易。OLTP系统强调数据库处理效率,强调内存各种指标的命中率,强调绑定变量,强调并发操作。一般情况下,OLTP系统数据量少,DML操作比较频繁,并行事务处理多,但是一般都比较短。OLTP表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主。评估系统的时候,一般看其每秒执行的事务数以及SQL执行的数量。在OLTP系统中,单个数据库每秒处理的事务数往往超过几百个,或者是几千个,SELECT语句的执行量每秒几千甚至几万个。典型的OLTP系统有电子商务系统、银行、证券等,例如,美国eBay的业务数据库就是很典型的OLTP数据库。在Oracle中创建OLTP系统时,使用一般用途或事务处理(General Purpose or Transaction Processing)模板。
具体而言,OLTP的特点一般有以下几点:
1)实时性要求高。
2)数据量不是很大。
3)交易一般是确定的,所以,OLTP是对确定性的数据进行存取。例如,存取款都有一个特定的金额。
4)并发性要求高,并且有严格的事务完整性、安全性。例如,有可能你和你的家人同时在不同的银行取同一个账号的存款。
OLAP的特点一般有以下几点:
1)实时性要求不是很高,很多应用都是每天晚上更新一次数据。
2)数据量大,因为OLAP支持的是动态查询,用户需要统计很多数据以后才能得到想要知道的信息,所以,OLAP处理的数据量很大。
3)因为重点在于决策支持,所以,OLAP查询一般是动态的,也就是说允许用户随时提出查询的要求。于是在OLAP中通过一个重要概念“维”来搭建一个动态查询的平台(或技术),供用户自己去决定需要知道什么信息。
OLAP和OLTP的区别见下表。
区分维度
|
OLTP|
|
OLAP
|
用户
|
操作人员、低级管理人员
|
决策人员、高级管理人员
|
功能
|
日常操作处理
|
分析决策
|
DB设计
|
面向应用,事务驱动
|
面向主题,面向分析,分析驱动
|
数据
|
原始的、当前的、最新细节的、二维的、分立的、实 时更新的
|
历史的、聚集的、多维的、集成的、统一的、导出的、 综合性的、提炼性的、不实时更新但周期性刷新
|
存取
|
读或写数十条记录,一次处理的数据量小
|
读上百万条记录,一次处理的数据量大
|
工作单位
|
简单的事务,DML操作比较频繁,并行事务处理多
|
复杂的查询,数据量大,DML操作少
|
用户数
|
上千个
|
上百个
|
DB大小
|
100MB-GB
|
100GB-TB
|
时间要求
|
具有实时性
|
对时间要求不严格
|
主要应用
|
数据库
|
数据仓库
|
[考点] OLAP和OLTP
23. 分布式数据库有哪些优点?
分布式数据库的优点如下:
1)增强了可用性。当某个数据库服务器出现故障后,可以继续使用分布式数据库中其他数据库提供的服务。
2)数据的分布访问。企业数据可以分布于若干城市,分析时可能需要访问不同场地的数据,但通常在访问模式中得到数据存储的局部性(例如银行经理通常是查询本地支行的顾客账户),这种局部性可用来分布数据。
3)分布数据的分析。企业需要分析所有可用的数据,即使这些数据存储在不同场地、不同的数据库系统中。
[考点] 分布式数据库与并行数据库
24. 分布式数据库与并行数据库有哪些不同点?
分布式数据库与并行数据库的不同点如下:
1)应用目标不同。并行数据库系统的目标是充分发挥并行计算机的优势,利用系统中的各个处理机节点并行完成数据库任务,提高数据库系统的整体性能。分布式数据库系统的主要目的在于实现场地自治和数据的全局透明共享,而不要求利用网络中的各个节点来提高系统处理性能。
2)实现方式不同。在具体实现方法上,并行数据库系统与分布式数据库系统也有着较大的不同。在并行数据库系统中,为了充分利用各个节点的处理能力,各节点间可以采用高速网络连接。节点间的数据传输代价相对较低,当某些节点处于空闲状态时,可以将工作负载过大的节点上的部分任务通过高速网传送给空闲节点处理,从而实现系统的负载平衡。
在分布式数据库系统中,为了适应应用的需要,各节点间一般采用局域网或广域网相连,网络带宽较低,点到点的通信开销较大。因此,在查询处理时一般应尽量减少节点间的数据传输量。
3)各节点的地位不同。在并行数据库系统中,各节点是完全非独立的,不存在全局应用和局部应用的概念,在数据处理中只能发挥协同作用,而不能有局部应用。在分布式数据库系统中,各节点除了能通过网络协同完成全局事务外,各节点具有场地自治性,每个场地都是独立的数据库系统,每个场地都有自己的数据库、客户、CPU等资源,运行自己的DBMS,执行局部应用,具有高度的自治性。
[考点] 分布式数据库与并行数据库
25. 数据库安全包括哪两层含义?
数据库安全包括两层含义:第一层是指系统运行安全,例如,一些网络不法分子通过网络、局域网等途径入侵计算机使系统无法正常启动,或超负荷让服务器运行大量算法,并关闭CPU风扇,使CPU过热烧坏等破坏性活动;第二层是指系统信息安全,例如,黑客对数据库入侵,并盗取想要的资料。数据库系统的安全特性主要是针对数据而言的,包括数据独立性、数据安全性、数据完整性、并发控制、故障恢复等几个方面。
[考点] 数据库安全
26. 数据独立性包括哪几个方面?
数据独立性包括物理独立性和逻辑独立性两个方面。物理独立性是指用户的应用程序与存储在磁盘上的数据库中的数据是相互独立的;逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的。
[考点] 数据库安全
27. 数据完整性包括哪几个方面?
数据完整性包括数据的正确性、有效性和一致性。正确性是指数据的输入值与数据表对应域的类型一样;有效性是指数据库中的理论数值满足现实应用中对该数值段的约束;一致性是指不同用户使用的同一数据应该是一样的。保证数据的完整性,需要防止合法用户使用数据库时向数据库中加入不合语义的数据。
[考点] 数据库安全
28. 常用的数据库安全措施有哪些?
数据的安全性控制是指要尽可能地杜绝所有可能的数据库非法访问。每种数据库管理系统都会提供一些安全性控制方法供数据库管理员选用。常用的数据库安全措施有用户标识和鉴别、用户存取权限控制、定义视图、数据加密、安全审计以及事务管理和故障恢复等几类。
[考点] 数据库安全