- 论坛徽章:
- 7
|
作为一名dba,会写sql是一项基本功。
如果在做dba之前,从事过开发,可能写sql就相对容易些,如果直接就上手dba,可能写sql的能力会差一些。
本人也没有从事过开发,写sql也是在工作中慢慢的学会的。
不过,这也没有关系,多练习练习,就会了。
下面总共有sql练习55道题,这55道题目是itpub网友提供的,但没有提供作者的名字,这里先行谢谢了。
原版的55道题目,既有题也有答案,因为是学习写sql,不是去看人家怎么写的,我这里的练习的是自己这几天写出来的,
当然也参考了原作者的答案。原作者的文档命名为《Oracle_SQL:经典查询练手四篇(全)》可以到itpub上下载。
下面的sql基本上是我自己写出来的,因为我也是在不断的学习写sql中,有写的不妥的地方,请网友们指出,谢谢。
好了,转入正题,下面我们来一起写sql:
SQL学习1-18:
1.列出至少有一个员工的所有部门。
2.列出薪金比“MARTIN”多的所有员工。
3.列出所有员工的姓名及其直接上级的姓名。
4.列出受雇日期早于其直接上级的所有员工。
5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
6.列出所有“CLERK”(办事员)的姓名及其部门名称。
7.列出最低薪金大于1500的各种工作。
8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
9.列出薪金高于公司平均薪金的所有员工。
10.列出与“BLAKE”从事相同工作的所有员工。
11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
13.列出在每个部门工作的员工数量、平均工资和平均服务期限。
14.列出所有员工的姓名、部门名称和工资。
15.列出所有部门的详细信息和部门人数。
16.列出各种工作的最低工资。
17.列出各个部门的MANAGER(经理)的最低薪金。
18.列出所有员工的年工资,按年薪从低到高排序。
1.列出至少有一个员工的所有部门。
select dname from scott.dept a,(
select deptno,count(*) from scott.emp where deptno is not null group by deptno order by count(*) desc
) b
where a.deptno = b.deptno
DNAME
ACCOUNTING
RESEARCH
SALES
2. 列出薪金比“MARTIN”多的所有员工。
select * from scott.emp b where sal>
(select sal from scott.emp where ename='MARTIN')
3. 列出所有员工的姓名及其直接上级的姓名。
select a.empno as "员工编号",
a.ename as "员工姓名",
b.ename as "员工的直接领导"
from scott.emp a, scott.emp b
where a.mgr = b.empno(+)
员工编号 员工姓名 员工的直接领导
7902 FORD JONES
7900 JAMES BLAKE
7844 TURNER BLAKE
7654 MARTIN BLAKE
7521 WARD BLAKE
7499 ALLEN BLAKE
7934 MILLER CLARK
7782 CLARK KING
7698 BLAKE KING
7566 JONES KING
7369 SMITH FORD
7839 KING
4.列出受雇日期早于其直接上级的所有员工。
select a.empno as "员工编号",
a.ename as "员工姓名",
a.hiredate as "员工受雇日期",
b.ename as "员工的直接领导",
b.hiredate "员工的直接领导受雇日期"
from scott.emp a, scott.emp b
where a.mgr = b.empno(+)
and a.hiredate<b.hiredate
员工编号 员工姓名 员工受雇日期 员工的直接领导 员工的直接领导受雇日期
7521 WARD 1981/2/22 BLAKE 1981/5/1
7499 ALLEN 1981/2/20 BLAKE 1981/5/1
7782 CLARK 1981/6/9 KING 1981/11/17
7566 JONES 1981/4/2 KING 1981/11/17
7698 BLAKE 1981/5/1 KING 1981/11/17
7369 SMITH 1980/12/17 FORD 1981/12/3
红色标示的这些员工就是比直接领导受雇早的员工。
5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
select a.empno, a.ename, b.dname, b.deptno
from scott.emp a, scott.dept b
where a.deptno(+) = b.deptno
EMPNO ENAME DNAME DEPTNO
7782 CLARK ACCOUNTING 10
7934 MILLER ACCOUNTING 10
7902 FORD RESEARCH 20
7369 SMITH RESEARCH 20
7566 JONES RESEARCH 20
7900 JAMES SALES 30
7844 TURNER SALES 30
7654 MARTIN SALES 30
7521 WARD SALES 30
7499 ALLEN SALES 30
7698 BLAKE SALES 30
OPERATIONS 40
等同于:
select a.empno, a.ename, b.dname, b.deptno
from scott.emp a
right join scott.dept b
on a.deptno = b.deptno
6.列出所有“CLERK”(办事员)的姓名及其部门名称。
select c.job,c.ename,b.dname from scott.dept b,
(select a.ename,a.deptno,a.job from scott.emp a where job ='CLERK') c
where c.deptno = b.deptno
JOB ENAME DNAME
CLERK SMITH RESEARCH
CLERK JAMES SALES
CLERK MILLER ACCOUNTING
7. 列出最低薪金大于1500的各种工作。
select a.job,min(a.sal) from scott.emp a group by a.job having min(sal) >1500;
JOB MIN(A.SAL)
PRESIDENT 5000
MANAGER 2450
ANALYST 3000
8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
select a.ename from scott.emp a ,(
select b.deptno from scott.dept b where dname ='SALES') c where
c.deptno = a.deptno
或
select ename from scott.emp where deptno = (select deptno from scott.dept where dname ='SALES');
ENAME
ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES
9.列出薪金高于公司平均薪金的所有员工。
select ename from scott.emp where sal > (
select round(avg(sal)) from scott.emp )
ENAME
JONES
BLAKE
CLARK
KING
FORD
10.列出与“BLAKE”从事相同工作的所有员工。
select b.ename,b.job from scott.emp b,(
select a.job from scott.emp a where ename='BLAKE') c
where b.job = c.job
或
select ename,job from scott.emp b where job = (select a.job from scott.emp a where ename='BLAKE')
ENAME JOB
JONES MANAGER
BLAKE MANAGER
CLARK MANAGER
11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
select a.ename, a.sal
from scott.emp a
where a.sal in (select b.sal from scott.emp b where b.deptno = 30)
and a.deptno <> 30;
12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
select ename,sal from scott.emp where sal> all (
select sal from scott.emp where deptno=30)
或
select ename,sal from scott.emp where sal>(select max(sal) from scott.emp where deptno=30)
ENAME SAL
JONES 2975.00
KING 5000.00
FORD 3000.00
13.列出在每个部门工作的员工数量、平均工资和平均服务期限。
select b."部门平均工资","部门员工数量","平均服务年限" from scott.dept a,
(select deptno,
round(avg(sal)) as "部门平均工资",
count(*) as "部门员工数量",
round(avg(to_number(to_char(hiredate, 'yyyymmdd')))) as "平均服务年限"
from scott.emp
where deptno is not null
group by deptno) b
where a.deptno = b.deptno
部门平均工资 部门员工数量 平均服务年限
1567 6 19810664
2258 3 19807607
1875 2 19815366
14.列出所有员工的姓名、部门名称和工资。
select ename, dname, sal
from scott.dept a, (select * from scott.emp b) b
where a.deptno = b.deptno
ENAME DNAME SAL
CLARK ACCOUNTING 2450.00
MILLER ACCOUNTING 1300.00
FORD RESEARCH 3000.00
SMITH RESEARCH 800.00
JONES RESEARCH 2975.00
JAMES SALES 950.00
TURNER SALES 1500.00
MARTIN SALES 1250.00
WARD SALES 1250.00
ALLEN SALES 1600.00
BLAKE SALES 2850.00
15.列出所有部门的详细信息和部门人数。
select b.deptno, b.dname, b.loc, count(ename)
from scott.emp a, (select * from scott.dept) b
where a.deptno(+) = b.deptno
group by b.deptno, b.dname, b.loc;
或
select a.deptno,
a.dname,
a.loc,
(select count(*)
from scott.emp b
where b.deptno = a.deptno
group by b.deptno) as deptcount
from scott.dept a;
20 RESEARCH DALLAS 3
40 OPERATIONS BOSTON 0
10 ACCOUNTING NEW YORK 2
30 SALES CHICAGO 6
16.列出各种工作的最低工资。
select job,min(sal) from scott.emp group by job
JOB MIN(SAL)
CLERK 800
SALESMAN 1250
PRESIDENT 5000
MANAGER 2450
ANALYST 3000
17.列出各个部门的MANAGER(经理)的最低薪金。
select b.ename as "部门经理",
(select c.dname as "部门"
from scott.dept c
where c.deptno = a.deptno) as "部门",
min(a.sal) as "部门经理最低工资"
from scott.emp a, scott.emp b
where a.mgr = b.empno(+)
and b.ename <> 'KING'
group by b.ename, a.deptno
order by a.deptno desc
部门经理 部门 部门经理最低工资
BLAKE SALES 950
FORD RESEARCH 800
JONES RESEARCH 3000
CLARK ACCOUNTING 1300
18.列出所有员工的年工资,按年薪从低到高排序。
select ename, (sal + nvl(comm, 0)) * 12 as "年薪"
from scott.emp
order by "年薪";
|
|