部分常见ORACLE面试题以及SQL注意事项(共45页).doc
《部分常见ORACLE面试题以及SQL注意事项(共45页).doc》由会员分享,可在线阅读,更多相关《部分常见ORACLE面试题以及SQL注意事项(共45页).doc(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上部分常见ORACLE面试题以及SQL注意事项一、表的创建:一个通过单列外键联系起父表和子表的简单例子如下:CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id) CREATE TABLE child(id INT, parent_id INT,INDEX par_ind (parent_id),FOREIGN KEY (parent_id) REFERENCES parent(id)ON DELETE CASCADE) 建表时注意不要用关键字当表名或字段名,如insert,use等。CREATE TABLE pare
2、nt(id INT NOT NULL,PRIMARY KEY (id) TYPE=INNODB;二、InnoDB Tables 概述 InnoDB给MySQL提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant)型表。 InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB
3、表中不需要扩大锁定(lock escalation), 因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。 InnoDB 是 MySQL 上第一个提供外键约束(FOREIGNKEYconstraints)的表引擎。InnoDB的设计目标是处理大容量数据库系统,它的CPU利用率是其它基于磁盘的关系数据库引擎所不能比的。 三、从一个表中查询出数据插入到另一个表中的方法:select * into destTbl from srcTbl ;(在oracle中不适用)insert into destTbl(fld1, fld2) select fld1, 5 from s
4、rcTbl insert into aa select * from dept 第三句同第二句。create table s_emp_42 as select * from s_emp where 1=2;/ 永假式 只想要结构而不要数据。以上三句都是将 srcTbl 的数据到 destTbl,但两句又有区别的。 第一句(select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建。 第二句(insert into select from)要求目标表(destTbl)存在,由于目标表已经存在,所以我们除了插入源表(srcTbl)的字段外,还可以插入常量,如例中的
5、:5,或者插入字符 字符四、SQL查询练习题(1) 表1:book表,字段有id(主键),name (书名);表2:bookEnrol表(图书借出归还登记),字段有id,bookId(外键),dependDate(变更时间),state(1.借出 2.归还)。 id name 1 English2 Math3 JAVAiddependDate state bookId12009-01-02 1 122009-01-12 2 13 2009-01-14 1 242009-01-17 1 152009-02-14 2 262009-02-15 1 272009-02-18 1 382009-02-
6、19 2 3要求查询结果应为:(被借出的书和被借出的日期)Id Name dependDate1 English 2009-01-172 Math 2009-02-15第二个表是用来登记的,不管你是借还是还,都要添加一条记录。请写一个SQL语句,获取到现在状态为已借出的所有图书的相关信息。参考语句:select book.id,book.name,max(dependDate)from book inner join bookEnrol on book.id=bookEnrol.bookid AND booker.state=1 group by book.id ;(这个答案是错误的)正确的语
7、句一:select book.id,book.name,dependdate from book,bookEnrol where dependdate in(select max(dependdate) from bookEnrol group by bookid) and book.id=bookEnrol.bookid and bookEnrol.state=1;正确的语句二:select book.id,book.name,dependdate from book inner join bookEnrol on book.id=bookEnrol.bookid where dependd
8、ate in(select max(dependdate) from bookEnrol group by bookid) and bookEnrol.state=1;(2)表一:各种产品年销售量统计表 sale 年 产品 销量 2005 a 700 2005 b 550 2005 c 600 2006 a 340 2006 b 500 2007 a 220 2007 b 350 要求得到的结果应为: 年 产品 销量 2005 a 700 2006 b 500 2007 b 350 即:每年销量最多的产品的相关信息。参考答案一: Select * from sale a where not e
9、xists(select * from sale where 年=a.年 and 销量a.销量);参考答案二: select * from sale a inner join (select 年,max(销量) as 销量from sale group by 年) b on a.年=b.年 and a.销量=b.销量 参考答案三(我的答案):select * from sale where 销量 in (select max(销量) from sale group by 年);(3).查询语句排名问题:表一:名次 姓名 月积分(char) 总积分(char) 1 WhatIsJava 1 99
10、 2 水王 76 981 3 新浪网 65 96 4 牛人 22 9 5 中国队 64 89 6 北林信息 66 66 7 加太阳 53 66 8 中成药 11 33 9 西洋参 25 26 10 大拿 33 23 如果用总积分做降序排序.因为总积分是字符型,所以排出来是这样子(9,8,7,6,5.),要求按照总积分的数字大小排序。参考答案:select * from tablename order by cast(总积分 as int) desc 参考答案(我的答案):select * from tablename order by to_number(总积分) desc;表tb uid m
11、ark 1 7 1 6 2 3 2 2 2 5 3 4 3 3 4 8 4 1 4 3 想查出uid=4的名次: uid he mc 412 2 我的答案:select * from (select rownum mc,ui,he from (select ui,sum(mark) he from tb group by ui order by he desc) where ui=4;表A字段如下 month name income 月份 人员 收入 1 a 10002 a 20003 a 3000要求用一个SQL语句(注意是一个)的处所有人(不区分人员)每个月及上月和下月的总收入 要求列表输
12、出为 月份 当月收入 上月收入 下月收入 2 2000 1000 3000Select (Select Month From Table Where Month = To_Char(Sysdate, mm) 月份,(Select Sum(Income) From Table Where Month = To_Char(Sysdate, mm) 当月收入,(Select Sum(Income) From Table Where To_Number(Month) = To_Number(Extract(Month From Sysdate) - 1) 上月收入,(Select Sum(Income
13、) From Table Where To_Number(Month) = To_Number(Extract(Month From Sysdate) + 1) 下月收入From Dual算排名列出每一行的排名是一个常见的需求,可惜 SQL 并没有一个很直接的方式达到这个需求。要以 SQL 列出排名,基本的概念是要做一个表格自我连结 (self join),将结果依序列出,然后算出每一行之前 (包含那一行本身) 有多少行数。这样讲读者听得可能有点困惑,所以最好的方式是用一个实例来介绍。假设我们有以下的表格: NameSalesJohn10Jennifer15Stella20Sophia40Gr
14、eg50Jeff20Total_Sales 表格要找出每一行的排名,我们就打入以下的 SQL 语句:SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank FROM Total_Sales a1, Total_Sales a2 WHERE a1.Sales = a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name) GROUP BY a1.Name, a1.Sales ORDER BY a1.Sales DESC, a1.Name DESC;结果:Name Sales Sales_Rank G
15、reg 50 1 Sophia 40 2 Stella 20 3 Jeff 20 3 Jennifer 15 5 John 10 6 我们先来看 WHERE 子句。在字句的第一部分 (a1.Sales = a2.Sales),我们算出有多少笔资料 Sales 栏位的值是比自己本身的值小或是相等。如果在 Sales 栏位中没有同样大小的资料,那这部分的 WHERE 子句本身就可以产生出正确的排名。 子句的第二部分,(a1.Sales=a2.Sales and a1.Name = a2.Name),则是让我们在 Sales 栏位中有同样大小的资料时 (像 Stella 及 Jeff 这两笔资料),
16、仍然能够产生正确的排名。 算中位数要算出中位数,我们必须要能够达成以下几个目标: 将资料依序排出,并找出每一行资料的排名。 找出中间的排名为何。举例来说,如果总共有 9 笔资料,那中间排名就是 5 (有 4 笔资料比第 5 笔资料大,有 4 笔资料比第 5 笔资料小)。 找出中间排名资料的值。 来看看以下的例子。假设我们有以下的表格: Total_Sales 表格NameSalesJohn10Jennifer15Stella20Sophia40Greg50Jeff20要找出中位数,我们就键入:SELECT Sales Median FROM (SELECT a1.Name, a1.Sales,
17、 COUNT(a1.Sales) Rank FROM Total_Sales a1, Total_Sales a2 WHERE a1.Sales a2.Sales OR (a1.Sales=a2.Sales AND a1.Name = a2.Name) group by a1.Name, a1.Sales order by a1.Sales desc) a3 WHERE Rank = (SELECT (COUNT(*)+1) DIV 2 FROM Total_Sales); 结果:Median 20 读者将会发现,第 2 行到第 6 行是跟产生 排名 的语句完全一样。第 7 行则是算出中间的排
18、名。DIV 是在 MySQL 中算出商的方式。在不同的数据库中会有不同的方式求商。第 1 行则是列出排名中间的资料值。 算累积总计算出累积总计是一个常见的需求,可惜以 SQL 并没有一个很直接的方式达到这个需求。要以 SQL 算出累积总计,基本上的概念与列出排名类似:第一是先做个表格自我连结 (self join),然后将结果依序列出。在做列出排名时,我们算出每一行之前 (包含那一行本身) 有多少行数;而在做累积总计时,我们则是算出每一行之前 (包含那一行本身) 的总合。 来看看以下的例子。假设我们有以下的表格: Total_Sales 表格NameSalesJohn10Jennifer15S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 部分 常见 ORACLE 试题 以及 SQL 注意事项 45
限制150内