oracle数据库面试题

来源:互联网 发布:乾隆母亲 知乎 编辑:程序博客网 时间:2024/06/04 17:41

1.写出利用tar命令归档data目录,解压data.tar包

   tar  zxvf data.tar -C data /

2.以列表的形式显示当前目录下的内容,并以时间倒序排列

 ls -lrt

3.查看oracle数据库的进程 

ps -ef |grep -i "ora_"

4.杀死进程号为12306的进程

kill -9 12306

5.给getdata.sh赋予执行权

chmod +x getdata.sh

6.创建新用户时,需要赋予新用户什么权限才能使它连接上数据库

connect权限

7.如何在tablespace 添加数据文件

alter tablespace 表空间名 add datafile

8.比较truncate和delete drop的区别

相同点:1.truncate和不带where子句的delete、以及drop都会删除表内的数据。

 2.drop、truncate都是DDL语句(数据定义语言),执行后会自动提交。

不同点:1. truncate 和 delete 只删除数据不删除表的结构(定义)

drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。

 2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。

truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。

 3.delete 语句不影响表所占用的 extent,高水线(high watermark)保持原位置不动

drop 语句将表所占用的空间全部释放。
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。

 4.速度,一般来说: drop> truncate > delete

 5.安全性:小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及  使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大.

想删除表,当然用 drop
想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

6.delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。

7、TRUNCATE   TABLE   在功能上与不带   WHERE   子句的   DELETE   语句相同:二者均删除表中的全部行。但   TRUNCATE   TABLE   比   DELETE   速度快,且使用的系统和事务日志资源少。DELETE   语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE   TABLE   通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 

  8、TRUNCATE   TABLE   删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用   DELETE。如果要删除表定义及其数据,请使用   DROP   TABLE   语句。  

    9、对于由   FOREIGN   KEY   约束引用的表,不能使用   TRUNCATE   TABLE,而应使用不带   WHERE   子句的   DELETE   语句。由于   TRUNCATE   TABLE   不记录在日志中,所以它不能激活触发器。    
 10、TRUNCATE   TABLE   不能用于参与了索引视图的表。  

9.char和varchar的区别

CHAR的长度是固定的,而VARCHAR2的长度是可以变化的
10.表 EMPLOYEES的结构为:

(

EMP_ID NUMBER(4) NOT NULL

LAST_NAME VARCHAR2(30) NOT NULL

FIRST_NAME VARCHAR2(30)

DEPT_ID NUMBER(2)

JOB_CAT VARCHAR2(30)

SALARY NUMBER(8,2)

)

下面哪条语句可以查出各个 dept_id的最大salary值和最小 salary值

并且它的最值小于5000最大值大于15000?()

A. SELECT dept_id, MIN(salary), MAX(salary)

FROM employees

WHERE MIN(salary) < 5000 AND MAX(salary) > 15000;

B. SELECT dept_id, MIN(salary), MAX(salary) 2

FROM employees

WHERE MIN(salary) < 5000 AND MAX(salary) > 15000

GROUP BY dept_id;

C. SELECT dept_id, MIN(salary), MAX(salary)

FROM employees

HAVING MIN(salary) < 5000 AND MAX(salary) > 15000;

D. SELECT dept_id, MIN(salary), MAX(salary)

FROM employees

GROUP BY dept_id

HAVING MIN(salary) < 5000 AND MAX(salary) > 15000;

E. SELECT dept_id, MIN(salary), MAX(salary)

FROM employees

GROUP BY dept_id, salary

HAVING MIN(salary) < 5000 AND MAX(salary) > 15000;


11.请看以下oracle中存储过程

begin

begin

<语句1> 3

exception

when others then

dbms_output.put_line('错误1');

end;

begin

<语句2>

dbms_output.putline('错误 2');

end;

exception

when others then

dbms_output.put_line("错误3");

end;

请问,当<语句1>,<语句 2>出错时,该存储过程输出字符串分别是什么?()

A.错误1,错误3

B.错误 1,错误2

C.错误 1,错误2,错误 3

D.错误2,错误3

12.

name   kecheng    fenshu 
张三     语文     81
张三     数学     75
李四     语文     76
李四     数学     90
王五     语文     81
王五     数学     100
王五     英语     90

用一条sql语句查询出“每门”课程都大于80分的学生姓名

SELECT  D.name  FROM (SELECT  S.name,S.score AS ITEM1,S1.score AS ITEM2,S2.score AS ITEM3FROM Student S inner join Student S1 on S.name = S1.name and S.course <> S1.courseinner join Student S2 on S.name = S2.name and S.course <> S2.courseWHERE S.score>=80 and S1.score>=80 and S2.score>=80) D GROUP BY D.name 
13.

问题描述:
 S (SNO,SNAME)学生关系。SNO 为学号,SNAME 为姓名
 C (CNO,CNAME,CTEACHER)课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师
 SC(SNO,CNO,SCGRADE)选课关系。SCGRADE为成绩
 1.1)找出选修过李明老师讲授课程的所有学生姓名
 --实现代码:法一
Select*
FROM SC,C,S
Where SC.CNO=C.CNOAND SC.SNO=S.SNOAND CTEACHER='李明'
---法二:-------------
Select*
FROM S
Where SnoIN( Select Sno 
              FROM C,SC 
              Where C.[Cno]=SC.[Cno]AND CTEACHER='李明')
 
2)找出没有选修过李明老师讲授课程的所有学生姓名
 --实现代码:法一
Select SName
FROM S
Where [Sno]NOT IN(Select SC.[Sno]
                    FROM SC,C
                    Where SC.CNO=C.CNOAND CTEACHER='李明')
 
3)找出没有选修过课程号为"1"的所有学生姓名
 --实现代码
Select SName
FROM S
Where [Sno]NOT IN( Select [Sno] FROM SC Where CNO='1')
 
------------------------------------------------------------------------------------------------------------------------------------------ 
 2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
 --实现代码:
Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,(Select SNO
                     FROM SC 
                     Where SCGRADE<60 
                     GROUP BY SNO 
                     HAVING COUNT(DISTINCT CNO)>=2)A
Where S.SNO=A.SNOAND SC.SNO=A.SNO
GROUPBY S.SNO,S.SNAME
 --------------------------------------------------------------------------------------------------------------------------------------
 3. (1)列出既学过语文课程,又学过数学课程的所有学生姓名
 --实现代码:法一
Select S.SNO,S.SNAME
FROM S,(
   Select SC.SNO
   FROM SC,C
   Where SC.CNO=C.CNOAND C.CNAME IN('语文','数学')
   GROUPBY SNO
   HAVINGCOUNT(DISTINCT c.CNO)=2)SC
Where S.SNO=SC.SNO
---法二:-------------------------- 
select*
from(select s.snofrom s,sc,cwhere s.sno=sc.snoand sc.cno=c.cnoand c.cname='语文')t1,
     (select s.snofrom s,sc,cwhere s.sno=sc.snoand sc.cno=c.cnoand c.cname='数学')t2,
      s
where t1.sno=t2.snoand t1.sno=s.sno
------------------
(2)使用标准SQL嵌套语句查询选修全部课程的学员姓名
法一:一句SQL语句即可。注意有下划线的部分!
 
Select S.SNO,S.SNAME
FROM S,(
       Select SNO
       FROM SC
       GROUP BY SNO 
       HAVING COUNT(*)=(selectcount(*) from c) )SC 
Where S.SNO=SC.SNO
  
(3)查询选修课程超过2门的学员学号
 --实现代码:
                     Select Sno  FROM SCGROUP BY Sno HAVINGCOUNT(Cno)>2
查询选修课程超过2门的学员学号及姓名
 --实现代码:
Select SNo,SNAME
FROM S
Where SnoIN(Select Sno  FROM SCGROUP BY Sno HAVINGCOUNT(Cno)>2)
  
4)列出人数大于3的各科最高成绩的列表,显示科目号成绩两个字段
---正解如下:(科目号为2、3的选课人数大于3人)
Select cno,max(scgrade)as'最高分'
FROM SC
Where cnoIN (Select cnoFROM SC GROUP BY cno HAVING COUNT(sno)>3)
groupby cno
orderby cno
-----------------------------------------------------------------------------------------------------------------------------------
4. 列出语文课比数学课同学该门课成绩高的所有学生的学号、姓名及分数
 --实现代码:法一 
select*
from(select s.sno,s.sname,sc.SCGRADEfrom s,sc,c
      where s.sno=sc.snoand sc.cno=c.cnoand c.cname='语文')t1,
       (select s.sno,s.sname,sc.SCGRADEfrom s,sc,c
      where s.sno=sc.snoand sc.cno=c.cnoand c.cname='数学')t2
where t1.sno=t2.snoand t1.SCGRADE>t2.SCGRADE
------------------------------------------------------------------------------------------------------------------------------------ 
5. 查询选修了课程的学员人数
 --实现代码:
 Select学员人数=COUNT(DISTINCT [Sno]) FROM SC
 
总结:
1select* from a,bwhere a.id=b.id
     select* from a inner join b on a.id=b.id结果集相同;
2、在作找出没有选修过李明老师讲授课程的所有学生姓名这种题时,
   --Where [Sno] NOT IN(在此可以是SQL语句生成的一列值)比较好。
   Select SName
   FROM S
   Where [Sno]NOT IN( Select SC.[Sno]
                                   FROM SC,C
                                  Where SC.CNO=C.CNOAND CTEACHER='李明')
3、可以将selectcount(*) from c直接代入SQL语句,而不是非要写成存储过程;
    Select S.SNO,S.SNAME
    FROM S,(
           Select SC.SNO 
           FROM SC,
           Where SC.CNO=C.CNO
           GROUP BY SNO 
           HAVING COUNT(*)=(selectcount(*) from c) )SC
    Where S.SNO=SC.SNO

转载自:http://blog.csdn.net/zhangyj_315/article/details/2255995



原创粉丝点击