版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据库面试宝典一是关于怎样找出和去除重复数据,这在另一个帖子利已有详细介绍。二是关于找出某一列里最大或最小的前几个,或是大于或小于某一个值(最大值或平均值)的数据。针对这种情况,再此做一个介绍。1:找出公司里收入最高的前三名员工:SQL> select rownum, last_name, salary2 from (select last_name, salary3 from s_emp4 order by salary desc)5 where rown
2、um<=3; ROWNUM LAST_NAME SALARY- - - 1 Velasquez 4750 2 Ropeburn
3、 2945 3 Nguyen 2897.5注意:请大家分析一下一下语句为什么不对:SQL> select rownum, last_name, salary2 from s_emp3 where rownum<=34 orde
4、r by salary desc; ROWNUM LAST_NAME SALARY- - - 1 Velasquez 4750 3 Nagayama
5、 2660 2 Ngao 20002: 找出表中的某一行或某几行的数据:(1):找出表中第三行数据:用以下方法是不行的,因为rownum后面至可以用<或<=号,不可以用=,>号和其它的比较符号。SQL> s
6、elect * from s_emp2 where rownum=3;no rows selectedSQL> select * from s_emp2 where rownum between 3 and 5;no rows selected正确的方法如下:SQL> l1 select last_name, salary2 from (select rownum a, b.*3 from s_emp b)4* where a=3SQL> /LAST_NAME
7、 SALARY- -Nagayama 2660(2):找出第三行到第五行之间的数据:SQL> l1 select last_name, salary2 from (select rownum a, b.*3 from s_em
8、p b)4* where a between 3 and 5SQL> /LAST_NAME SALARY- -Nagayama 2660Quick-To-See
9、 2755Ropeburn 29453:找出那些工资高于他们所在部门的平均工资的员工。(1):第一种方法:SQL> select last_name, dept_id, salary2 from s_emp a3 where salary>(select avg(salary)4
10、0;from s_emp5 where dept_id=a.dept_id);LAST_NAME DEPT_ID SALARY- - -Velasquez
11、50 4750Urguhart 41 2280Menchu 42 2375Biri &
12、#160; 43 2090Catchpole 44 2470Havel
13、 45 2483.3Nguyen 34 2897.5Maduro
14、160;41 2660Nozaki 42 2280Schwartz 45 209010 rows s
15、elected.(2):第二种方法:SQL> l1 select a.last_name, a.salary, a.dept_id, b.avgsal2 from s_emp a, (select dept_id, avg(salary) avgsal3 from s_emp4 group by dept_id) b5 where a.dept_id=b.de
16、pt_id6* and a.salary>b.avgsalSQL> /LAST_NAME SALARY DEPT_ID AVGSAL- - - -Velasquez 4750 50 &
17、#160; 3847.5Urguhart 2280 41 2181.5Menchu 2375 42
18、2055.16667Biri 2090 43 1710Catchpole 2470 44
19、0; 1995Havel 2483.3 45 2069.1Nguyen 2897.5 34
20、60; 2204Maduro 2660 41 2181.5Nozaki 2280
21、160; 42 2055.16667Schwartz 2090 45 2069.110 rows selected.4:找出那些工资高于他们所在部门的manager的工资的员工。SQL> l1 select id, last_name, salary, manager_id2 from s_emp a3 w
22、here salary>(select salary4 from s_emp5* where id=a.manager_id)SQL> / ID LAST_NAME SALARY MANAGER_ID
23、- - - - 6 Urguhart 2280 2 7 Menchu 2375 &
24、#160; 2 8 Biri 2090 2 9 Catchpole
25、 2470 2 10 Havel 2483.3 2 12 Giljum
26、60; 2831 3 13 Sedeghi 2878.5 3 14 Nguyen
27、; 2897.5 3 15 Dumas 2755 3 16 Maduro
28、160; 2660 610 rows selected.找出部门工资排名第二,三的员工1 select name,salary,deptno from (2 select concat(last_name,first_name) name,salary,department_id deptno,3 rank() over (partition by department
29、_id order by salary desc) rnk4* from employees) where rnk=2 or rnk=3SQL> /NAME- SALARY DEPTNO- -FayPat 6000 20KhooAlexander 3100 30BaidaShelli 2900
30、30NAME- SALARY DEPTNO- -WeissMatthew 8000 50KauflingPayam 7900 50ErnstBruce 6000 60NAME- SALARY DEPTNO- -AustinDavid 4800
31、160; 60PataballaValli 4800 60PartnersKaren 13500 80NAME- SALARY DEPTNO- -ErrazurizAlberto 12000 80KochharNeena 17000
32、160; 90De HaanLex 17000 90NAME- SALARY DEPTNO- -FavietDaniel 9000 100ChenJohn 8200 100GietzWilliam 8300 11
33、015 rows selected.SQL>找出部门工资排名第二,三的员工1 select name,salary,deptno from (2 select concat(last_name,first_name) name,salary,department_id deptno,3 rank() over (partition by department_id order by salary desc) rnk4* from employees) where rnk=2 or rnk=3SQL> /NAME- SALA
34、RY DEPTNO- -FayPat 6000 20KhooAlexander 3100 30BaidaShelli 2900 30NAME- SALARY DEPTNO- -WeissMatthew 8000
35、60; 50KauflingPayam 7900 50ErnstBruce 6000 60NAME- SALARY DEPTNO- -AustinDavid 4800 60PataballaValli 4800 60Partners
36、Karen 13500 80NAME- SALARY DEPTNO- -ErrazurizAlberto 12000 80KochharNeena 17000 90De HaanLex 17000 90NAME- SALARY
37、 DEPTNO- -FavietDaniel 9000 100ChenJohn 8200 100GietzWilliam 8300 11015 rows selected.SQL>又是一道面试题:原表:id proid proname1 1 M1 2 F2 1 N2 2 G3 1 B3 2 A查询后的表:id pro1 pro
38、21 M F2 N G3 B A写出查询语句 又是一道面试题:原表:id proid proname1 1 M1 2 F2 1 N2 2 G3 1 B3 2 A查询后的表:id pro1 pro21 M F2 N G3 B A写出查询语句 又是一道面试题:原表:id proid proname1 1 M1 2 F2 1 N2 2 G3 1 B3 2 A查询后的表:id pro1 pro21 M F2 N G3 B A写出查询语句 又是一道面试题: 原表: id proid proname 1 1 M 1 2 F 2 1 N 2 2 G 3 1 B 3 2 A 查询后的表: id pro1 pr
39、o2 1 M F 2 N G 3 B A 写出查询语句 解决方案可有以下三种作参考:1:使用pl/sql代码实现,但要求你组合后的长度不能超出oracle varchar2长度的限制。 下面是一个例子 create or replace type strings_table is table of varchar2(20);/create or replace function merge (pv in strings_table) return varchar2isls varchar2(4000);beginfor i in 1.pv.count loop ls := ls |
40、 pv(i);end loop;return ls;end;/create table t (id number,name varchar2(10);insert into t values(1,'Joan');insert into t values(1,'Jack');insert into t values(1,'Tom');insert into t values(2,'Rose');insert into t values(2,'Jenny');column names format a80;select
41、 t0.id,merge(cast(multiset(select name from t where t.id = t0.id) as strings_table) names from (select distinct id from t) t0;drop type strings_table;drop function merge;drop table t;2:用sql: Well if you have a thoretical maximum, which I would assume you would given the legibility of listing hundred
42、s of employees in the way you describe then yes. But the SQL needs to use the LAG function for each employee, hence a hundred emps a hundred LAGs, so kind of bulky. This example uses a max of 6, and would need more cut n pasting to do more than that. SQL> select deptno, dname, emps 2 from ( 3 sel
43、ect d.deptno, d.dname, rtrim(e.ename |', '| 4 lead(e.ename,1) over (partition by d.deptno 5 order by e.ename) |', '| 6 lead(e.ename,2) over (partition by d.deptno 7 order by e.ename) |', '| 8 lead(e.ename,3) over (partition by d.deptno 9 order by e.ename) |', '| 10 le
44、ad(e.ename,4) over (partition by d.deptno 11 order by e.ename) |', '| 12 lead(e.ename,5) over (partition by d.deptno 13 order by e.ename),', ') emps, 14 row_number () over (partition by d.deptno 15 order by e.ename) x 16 from emp e, dept d 17 where d.deptno = e.deptno 18 ) 19 where x
45、 = 1 20 / DEPTNO DNAME EMPS - - - 10 ACCOUNTING CLARK, KING, MILLER 20 RESEARCH ADAMS, FORD, JONES, ROONEY, SCOTT, SMITH 30 SALES ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD3:先用pl/sql创建一个函数(create function get_a2); create or replace function get_a2( tmp_a1 number) return varchar2 is Col_a2 varchar2(4000); begin Col_a2:='' for cur in (sele
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《陋室铭》教案设计
- 苏教版五年级语文下册教案
- 山东创新创业基地建设合同
- 物理研究人防设备安装合同
- 水上婚礼婚礼演艺游艇租赁合同
- 工业园区配电房施工协议
- 机场航站楼大理石施工合同
- 体育场馆黄金屋租赁合同
- 餐饮批发租赁合同样本
- 商业店铺租赁协议
- GB 29743.1-2022机动车冷却液第1部分:燃油汽车发动机冷却液
- 辩论赛-结果比过程更重要
- (完整版)新概念英语青少版2B期末测试卷
- 工业数字化智能化2030白皮书
- 隧道高空作业安全要求
- 小学道德与法治人教六上册我们的国家机构我们是场外代表
- 医院水电后勤保障操作规范
- 国家开放大学2022年秋季《建筑测量》形成性考核及实验报告
- 物资放行管理办法放行审批权限规定放行条填写规范
- 第五版-FMEA-新版FMEA【第五版】
- 新能源无人机技术研究报告
评论
0/150
提交评论