【网学网提醒】:网学会员为您提供02_【基本SQL语句】SQL语法练习(二)参考,解决您在02_【基本SQL语句】SQL语法练习(二)学习中工作中的难题,参考学习。
SQL语法练习(二)语法练习(
使用scott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下
部门表部门表(dept))
DEPTDEPTNONUMBER(2)
DNAMEVARCHAR2(14)VARCHAR2(13)LOC
DEPTNODNAMELOC
部门编号部门名称部门地点
雇员表雇员表(emp))
EMPEMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNONUMBER(4)VARCHAR2(10)VARCHAR2(9)NUMBER(4)DATENUMBER(7,2)NUMBER(7,2)NUMBER(2)
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
雇员编号雇员职务领导编号受雇日期工资奖金所属部门
工资=薪金+佣金1、列出至少有一个员工的所有部门。SQL>selectdeptno,count(empno)fromempgroupbydeptnohavingcount(empno)>=1;
DEPTNOCOUNT(EMPNO)---------------------1032053062、列出薪金比“SMITH”多的所有员工。思路:1、先查出SMITH的工资2、所有的员工要与此工资比较,。大的满足条件select*fromempwheresal>(selectsalfromempwhereename=upper('smith'));
3、列出所有员工的及其直接上级的。selectw.ename,m.enamefromempw,empmwherew.mgr=m.empno;
4、列出受雇日期早于其直接上级的所有员工。selectw.ename,m.ename,w.hiredate"受雇日期"fromempw,empmwherew.hiredate 7、列出最低薪金大于1500的各种工作。MIN分组函数GROUPBYselectjob,min(sal)fromempgroupbyjobhavingmin(sal)>1500;8、列出在部门“SALES”(销售部)工作的员工的,假定不知道销售部的部门编号。Empdept思路:1、取出销售部门的部门编号selectenamefromempwheredeptno=(selectdeptnofromdeptwheredname='SALES');
selectenamefromempe,deptdwheree.deptno=d.deptnoandd.dname='SALES';9、列出薪金高于公司平均薪金的所有员工。
Avg求出平均值分组函数肯定做为条件出现selectename,salfromempwheresal>(selectavg(sal)fromemp);
GROUPBY中出现
10、列出与“SCOTT”从事相同工作的所有员工。selecte.empno,e.enamefromempewheree.job=(selectjobfromempwhereename='SCOTT')ANDe.ename<>'SCOTT';
11、列出薪金等于部门30中员工的薪金的所有员工的和薪金。selectename,sal,deptnofromempwheresal>ANY(selectsalfromempwheredeptno=30)ANDdeptno<>30;selectename,sal,deptnofromcempwheresal=ANY(selectsalfromcempwheredeptno=30)ANDdeptno<>30;12、列
出薪金高于在部门30工作的所有员工的薪金的员工和薪金。select*fromempwheresal>all(selectsalfromempwheredeptno=30);13、列出在每个部门工作的员工数量、平均工资和平均服务期限。、列出在每个部门工作的员工数量、平均工资和平均服务期限。
14、列出所有员工的、部门名称和工资。selecte.ename,d.dname,e.salfromempe,deptdwheree.deptno=d.deptno;15、列出所有部门的详细信息和部门人数。、列出所有部门的详细信息和部门人数。Deptnodname人数selectd.deptno,d.dname,d1.counfromdeptd,(selectd.deptno,count(e.empno)counfromempe,deptdwheree.deptno(+)=d.deptnogroupbyd.deptno)d1whered.deptno(+)=d1.deptno;先看子查询:先看子查询:selectd.deptno,count(e.empno)counfromempe,deptdwheree.deptno(+)=d.deptnogroupbyd.deptno
16、列出各种工作的最低工资。按工作分组selectjob,min(sal)fromempgroupbyjob17、列出各个部门的MANAGER(经理)的最低薪金。18、列出所有员工的年工资,按年薪从低到高排序。19、创建一个用户test,要求拥有scott用户表emp的查询与修改权限,dept的查询权限。20、查出某个员工的所有上级主管,并要求出这些主管中的薪水超过3000(用一条sql语句解决)selectename,job,salfromempwhereempnoin(selectmgrfromemp
)ANDsal>=3000;21、求出部门名称中,带‘S’字符的部门员工的、工资合计、部门人数要求:部门工资合计要大于5000,并且按照部门的人数排序。22、给任职日期超过10年的人加薪10%、任职日期超过10年updateempsetsal=sal*1.1where(to_char(sysdate,'yyyy')-to_char(hiredate,'yyyy'))>26;23、列出员工任职的年、月、日24、列出员工中薪水最低,任职日期最长的员工。select*fromempe,(selectmin(sal)ms,min(hiredate)mhfromemp)e1wheree.sal=e1.msANDe.hiredate=e1.mh;
25、求出职工的周薪,保留两位小数。
附录:附录:--orcle的等连接SELECT*FROMEMPE,DEPTDWHEREE.DEPTNO=D.DEPTNO;--orcla的外连接SELECT*FROMEMPE,DEPTDWHEREE.DEPTNO(+)=D.DEPTNO;--+放在没有匹配行的表一侧,所以dept表的记录完全显示