-------------------练习1----------------------------------------------------------------
1.写一个查询,显示所有员工姓名,部门编号,部门名称。
select e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno=d.deptno;
2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
select e.ename,d.loc,e.comm
from emp e,dept d
where e.deptno=d.deptno and d.loc=‘CHICAGO’ and e.comm is not null;
3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
select e.ename,d.loc
from emp e,dept d
where e.deptno=d.deptno and e.ename like ‘%A%’;
-------------------练习2----------------------------------------------------------------
1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。
select e.empno,e.ename,e.sal,s.grade,d.loc
from emp e,salgrade s,dept d
where (e.sal between s.losal and s.hisal) and e.deptno=d.deptno
order by grade asc
-------------------练习3----------------------------------------------------------------
1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
select *from emp;
select *from dept;
select e.empno, e.ename,m.empno,m.ename,d.loc,d.deptno
from emp e,emp m,dept d
where e.mgr=m.empno and e.deptno=d.deptno and d.loc in(‘NEW YORK’,‘CHICAGO’);
-------在多表连接时,可以使用外部连接来查看哪些行,按照连接条件没有被匹配上。外部连接的符号是 (+)
2.第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。
select e.empno, e.ename,m.empno,m.ename,d.loc,d.deptno
from emp e,emp m,dept d
where e.mgr=m.empno(+) and e.deptno=d.deptno and d.loc in(‘NEW YORK’,‘CHICAGO’)
order by e.empno;
3.查询所有员工编号,姓名,部门名称,包括没有员工的部门也要显示出来。
select e.empno, e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno(+)=d.deptno
-------------------练习4----------------------------------------------------------------
使用SQL-99写法,完成如下练习
---------交叉连接 cross join 类似于笛卡尔积 行*行 ---------------------------
1.创建一个员工表和部门表的交叉连接。
select e.ename,e.empno,e.job,e.mgr,e.hiredate,d.deptno,d.dname,d.loc
from emp e
cross join dept d
------------自然连接:自然连接是对两个表之间相同名字和数据类型的列进行的等值连接;使用NATURAL JOIN子句来完成
2.使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
select e.ename,deptno,d.dname,e.hiredate
from emp e
natural join dept d; -----自己匹配出来相同名字和数据类型
------------USING子句:自然连接是使用所有名称和数据类型相匹配的列作为连接条件,而USING子句可以指定用某个或某几个相同名字和数据类型的列作为连接条件。-------
3.使用USING子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点
select e.ename,e.job,d.dname, deptno,d.loc
from emp e join dept d using(deptno)
where d.loc=‘CHICAGO’; --------区别于natural join 是它自己可以指定,而不是由系统匹配
----------ON子句:join–on 自然连接条件基本上是具有相同列名的表之间的等值连接;如果要指定任意连接条件,或指定要连接的列,则可以使用ON子句;ON子句可以提高代码的可读性。------
4.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点,薪资等级
select e.ename,e.job,d.dname, e.deptno,d.deptno,d.loc,s.grade
from salgrade s
join emp e
on (e.sal between s.losal and s.hisal)
join dept d
on (e.deptno=d.deptno)
where d.loc=‘CHICAGO’;
-------左连接:left outer join–on----------
5.使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.empno,e.ename,m.mgr,m.ename
from emp e
left outer join emp m
on (e.mgr=m.empno)
where
-------右连接:right outer join–on----------
6.使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.empno,e.ename,m.mgr,m.ename
from emp e
right outer join emp m
on (e.mgr=m.empno)
--------------------课后作业----------------------------------------------------------
-------自身连接--------
1.显示员工SMITH的姓名,部门名称,直接上级名称
select worker.ename,boss.ename,worker.deptno
from emp worker ,emp boss
where worker.mgr=boss.empno;
-------自身连接--------
2.显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
select e.ename,d.dname,e.sal,s.grade
from emp e,dept d,salgrade s
where (e.sal between s.losal and s.hisal) and s.grade>=4
-------自身连接--------
3.显示员工KING和FORD管理的员工姓名及其经理姓名。
select e.empno, e.ename,b.empno, b.ename
from emp e,emp b
where e.mgr=b.empno and b.ename in(‘KING’,‘FORD’);
-------自身连接--------
4.显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。
select e.ename,e.hiredate,m.ename,m.hiredate
from emp e,emp m
where e.mgr=m.empno and e.hiredate<=m.hiredate