1、存储过程和函数的区别
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,
而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
2、事务是什么?
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
3、游标的作用?如何知道游标已经到了最后?
是对查询出来的结果集作为一个单元来有效的处理,可从这个单元中逐条获取数据也可对数据进行修改。若要对查询结果集逐条处理,游标显得十分重要。
MSSQL通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。
Oracle通过判断游标的%notfound判断是否到达最后
4、什么是视图?视图的作用?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图实际上是存储了一个select语句。使用它获取数据更容易,特别是多表查询。
5、什么是存储过程?存储过程的优点?
存储过程是一个预编译的SQL语句,允许模块化的设计,只需创建一次,以后在该程序中就可以调用多次
1.存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。
2.可以降低网络的通信量。存储过程主要是在服务器上运行,减少对客户机的压力。
3、可实现复杂的数据处理,降低业务层的压力
6、内联接,外联接区别?
内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。
在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种
7、数据库第一,二,三 范式的概念与理解
第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。
第一范式的目标是确保每列的原子性
第二范式(2NF):如果一个关系满足1NF,并且除了主键以外的其他列,每个属性是功能依赖于整个主键, 而不只是部分的键则满足第二范式。
第二范式要求每个表只描述一件事情
第三范式(3NF):如果关系模式R(U,F)每个非键属性只功能依赖于主键,不功能依赖其他属性,则称关系R是属于第三范式的。
确保每列都和主键列直接相关,而不是间接相关
8、什么是触发器?触发器的作用?
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
9、索引的作用?和它的优点缺点是什么?
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索,它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
缺点是它减慢了数据录入、修改、删除的速度,同时也增加了数据库的尺寸大小
10、写分页有哪些方法,你一般用什么方法?用SQL语句写一个分页?如何用存储过程写分页? 在SQLSERVER中使用TOP分页,在ORACLE中用ROWNUM,或分析函数ROW_NUMBER 使用TOP: select top 20,n.* from tablename n minus select top 10,m.* from tablename m 使用分析函数: select * from (select n.*,row_number() over(order by columnname) num from tablename n) where num>=10 and num <=20; 使用过程时,只要将分页的范围用两个参数就可以实现。在ORACLE中,还要定义游标类型的输出参数将数据集返回。
11、什么叫做SQL注入式攻击?如何防范?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。防范SQL注入式攻击闯入:只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。如:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。
雇员表 emp
empno number(4) 表示雇员编号
ename varchar2(10) 表示雇员姓名
job varchar2(9) 表示工作职位
mgr number(4) 表示领导编号
hiredate date 表示雇佣日期
sal number(7,2) 表示月薪工资
comm number(7,2) 表示奖金,佣金
deptno number(2) 部门编号
一、编写一个触发器实现如下功能: 对修改职工薪金的操作进行合法性检查: a) 修改后的薪金要大于修改前的薪金 b) 工资增量不能超过原工资的10% c) 目前没有单位的职工不能涨工资
create or replace trigger tr1 after update of sal on emp for each row begin if :new.sal <= :old.sal then dbms_output.PUT_LINE('修改后的薪金要大于修改前的薪金'); elsif :new.sal > :old.sal * 1.1 then dbms_output.PUT_LINE('工资增量不能超过原工资的10%'); elsif :old.deptno is null then dbms_output.PUT_LINE('没有单位的职工不能涨工资'); end if; end;
二、编写一个存储过程,对名字以"A"或"S"开始的所有雇员按他们的基本薪水的10%加薪。 create or replace procedure proc_update_salary
as
CURSOR c1 IS SELECT * FROM emp WHERE SUBSTR(ename,1,1)=´A´ OR SUBSTR(ename,1,1)=´S´ FOR UPDATE OF sal; BEGIN FOR i IN c1 LOOP UPDATE emp SET sal=NVL(sal,0)+NVL(sal,0)*0.1 WHERE CURRENT OF c1; END LOOP; END;
3、创建一个序列,第一次从5循环到10,以后再从0开始循环 create sequence test_seq start with 5 increment by 1 maxvalue 10 minvalue 0 cycle nocache
四、 编写存储过程对直接上级是指定员工的所有员工,按照参加指定的工作的时间加薪: 例如:指定工作时间是81年6月 81年6月以前的加薪10% 81年6月以后的加薪5% declare cursor c1 is select * from emp where mgr = (select empno from emp where ename='BLAKE'); --直接上级是'BLAKE'的所有员工 c1rec c1%rowtype; begin for c1rec in c1 loop if c1rec.hiredate < '01-6月-81' then update emp set sal = sal * 1.1 where empno = c1rec.empno; else update emp set sal = sal * 1.05 where empno = c1rec.empno; end if; end loop; end;
五、根据Table1和Table2的完成下列操作
Table1:
Table2:
Table2的主键是复合主键(No,Type),Type 1:表示固话 2:为手机
1、根据table2的type类型,将表1中的固话插入表2中
2、创建一个触发器,表1删除一项数据,则相关表2的数据全删
3、将表1中的create-date数据进行修改,如:2009-1-9改为 200919,若为null则获得当前日期
4、创建视图名为table1_view,可现实Name、Address、tel、mobile、create_date列
本文来源:https://www.2haoxitong.net/k/doc/3c0f03f2900ef12d2af90242a8956bec0975a5cb.html
文档为doc格式