sql练习题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

oracle_sql_练习2009年12月08日星期二14:32(1)总结理解ORACLE软件安装步骤,注意事项(2)总结理解建库步骤,注意事项(3)注意区分一下几个概念:ORACLESERVER--amachinerunningoracle(almostonlyrunningoracle)\--INSTANCE--一段内存(是访问数据库的途径(媒介))\--ORACLEDB--oracledatabasesGLOBALDBNAME--全局数据库名称(db_name,db_domain),唯一标识数据库名字\--db_name\--db_domainORACLE_SID--作为环境变量,指定实例名称(4)把服务器和客户端2台机器安装配置好[题01]请找出薪资大于2500的员工的信息且将结果倒序输出,要求显示员工姓名。考点:1理解sal2500执行过程2select列和orderby列的关系3orderby后面可接的3种方式SQLselectename,salfromemp2wheresal25003orderbysaldesc;ENAMESAL--------------------BLAKE2850JONES2975FORD3000SCOTT3000KING5000[题02]请找出所有员工的姓名并显示ul_xxx_ok字样.,显示形如ul_smith_ok..的字样.注意smith是小写考点:1concat和lower函数的使用2理解基于函数时的SQL执行过程3理解concat和lower各执行的次数4理解函数永远返回值5函数的嵌套SQLselectconcat(lower(concat('ul_',ename)),'_ok')fromemp;CONCAT(LOWER(CON----------------ul_smith_okul_allen_okul_ward_ok或者:SQLselect'ul_'||lower(ename)||'_ok'newnamefromemp;NEWNAME----------------ul_allen_okul_ward_okul_jones_ok[题03]请找出81年7月以后入职的人有哪些?显示姓名,日期(用三种思想)考点:1to_date和to_char灵活使用2日期和字符串的隐式转换3找出最好的语句SQLselectename,hiredatefromemp2whereto_char(hiredate,'yyyy-mm-dd')'1981-07-01';ENAMEHIREDATE-----------------------------MARTIN1981-09-2800:00:00SCOTT1987-04-1900:00:00KING1981-11-1700:00:00TURNER1981-09-0800:00:00ADAMS1987-05-2300:00:00JAMES1981-12-0300:00:00FORD1981-12-0300:00:00MILLER1982-01-2300:00:008rowsselected.[题04]清找出近三个月入职的人有哪些?显示姓名,日期(用两种思想)考点:1months_between的使用2add_months的使用SQLselectmax(hiredate)fromemp;MAX(HIREDATE)-------------------1987-05-2300:00:00SQLselectename,hiredatefromemp2wherehiredatebetween'1987-03-01'and'1987-05-23';ENAMEHIREDATE-----------------------------SCOTT1987-04-1900:00:00ADAMS1987-05-2300:00:00[题05]请计算每个人入职年数,保留小数点1位(末尾数直接进数).并且按照入职的年数倒序输出考点:1months_between和ceil使用2函数的嵌入使用3有关计算年的思路(工作中常用)SQLselectround((sysdate-hiredate)/365,1)aswork_years2fromemp3orderbywork_yearsdesc;WORK_YEARS----------2928.828.828.728.628.528.328.228.12828WORK_YEARS----------27.922.622.514rowsselected.[题06]请根据每个人的job计算其调薪前和调薪后的情况。显示姓名,调薪前、调薪后(调薪的标准如下)PRESIDENT=原来的1.1倍MANAGER=原来的1.2倍ANALYST=原来的1.3倍其余=原来的1.4倍考点:1decode简单使用SQLselectename,sal,decode(2job,'PRESIDENT',sal*1.1,3'MANAGER',sal*1.2,4'ANALYST',sal*1.3,5'SALESMAN',SAL*1.4,6'CLERK',sal*1.4,sal)7asincreasefromemp;####注意,这里的increase要用号,不能用''号.ENAMESALincrease------------------------------SMITH8001120ALLEN16002240WARD12501750JONES29753570MARTIN12501750BLAKE28503420[题07]请统计历史数据中每个季度入职人数(不考虑年数的不同),显示季度数,入职人数(如果某季度没有人数则不用显示)考点:1decode思路扩展2分组的使用3groupby需要注意的几点SQLselectsum(decode(to_char(hiredate,'fmmm'),1,1,2,1,3,1,0))season_1,2sum(decode(to_char(hiredate,'fmmm'),4,2,5,2,6,2,0))season_2,3sum(decode(to_char(hiredate,'fmmm'),7,3,8,3,9,3,0))season_3,4sum(decode(to_char(hiredate,'fmmm'),10,4,11,4,12,4,0))season_4fromemp;SEASON_1SEASON_2SEASON_3SEASON_4----------------------------------------310616[题08]请找出每个部门中薪资最高的人和薪资最低的人,显示部门名称,员工姓名,员工最高薪资|最低薪资考点:1子查询2in3union|unionallSQLselectdeptno,ename,salfromemp2wheresalin(selectmax(sal)fromempgroupbydeptno)orsalin(selectmin(sal)fromempgroupbydeptno)3orderbydeptno;DEPTNOENAMESAL------------------------------10KING500010MILLER130020SCOTT300020FORD300020SMITH80030JAMES95030BLAKE28507rowsselected.[题09]请分别用两种格式显示1980~1983年之间的每年的入职人数。-----------------------------1980x1981y1982z-----------------------------198019811982xyz考点:1经典的行转列问题2分组和聚合函数SQLselectto_char(hiredate,'yyyy'),count(*)fromemp2groupbyto_char(hiredate,'yyyy');TO_CCOUNT(*)--------------1987211982119818SQLselectsum(decode(to_char(hiredate,'yyyy'),'1980',1,0))1980,2sum(decode(to_char(hiredate,'yyyy'),'1981',1,0))1981,3sum(decode(to_char(hiredate,'yyyy'),'1982',1,0))1982,4sum(decode(to_char(hiredate,'yyyy'),'1987',1,0))19875fromemp;1980198119821987----------------------------------------0812[题10]请找出哪个部门的员工薪资大于2500,显示部门名称即可.(要求用两种思想)1深入理解exists的运行过程SQLselectd.dnamefromdeptd2whereexists(select'x'fromempewheree.deptno=d.deptno3ande.sal2500);DNAME--------------ACCOUNTINGRESEARCHSALES[题11]请找出被领导者的薪资高于(直接)领导者的薪资,显示其被领导者姓名和薪资(要求用两种思想分别实现)考点:1自连接2深入理解exists的运行过程1自连接:SQLselecte.ename,e.salfromempem,empe2whereem.empno=e.mgrande.salem.sal;ENAMESAL--------------------SCOTT3000FORD3000查询不直接领导同事的员工的信息(即有上司无下属),包括工号,名字,薪水和领导者:SQLselecte.empno,e.ename,e.sal,e.mgrfromempe2wheree.empnonotin3(selectdistinctmgrfromempwheremgrisnotnull);EMPNOENAMESALMGR----------------------------------------1117844TURNER150076987934MILLER130077827902FORD300075667654MARTIN125076987876ADAMS110077887900JAMES95076987rowsselected.[题12]请找出哪个部门未分配员工,只显示部门名称即可.(要求用三种思想分别实现)请统计所有部门的人数,显示部门名称、部门人数.(注意是所有部门)SQLselectd.dnamefromdeptd2wherenotexists3(select'x'fromempewheree.deptno=d.deptno);DNAME--------------OPERATIONS请统计所有部门的人数,显示部门名称、部门人数.(注意是所有部门)SQLselectd.dname,x.countfromdeptd,2(selectdeptno,count(*)countfromempgroupbydeptno)x3whered.deptno=x.deptno(+);DNAMECOUNT------------------------ACCOUNTING3RESEARCH4SALES4OPERATIONS[题13]请找出部门人数超过3人的部门里的人员名单,要求显示部门名称、显示姓名。考点:1exists使用SQLselectd.dnamefromdeptd2whereexists3(selectdeptno,count(*)fromempgroupbydeptno4havingcount(*)3);DNAME-------

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功