1.select ... from A,B的用法
--emp是14行 8列 dept是5行 3列
select * from emp,dept--结果是70行 11列
查询的结果是emp表和dept表的笛卡儿积。A表的所有记录与B表的第一行记录拼接在一起,然后A表的所有记录再与B表的第二行拼接在一起......,所以最后的行数是A表的行数乘以B表的行数,列数是两表列数的和
2.select ... from A,B where ...的用法
对select ... from A,B产生的笛卡儿积用where进行过滤
3.select ... from A join B on ... 的用法
select emp.ename,dept.dname
from emp join dept--join是连接
on emp.deptnp = dept.deptno
--有join就必须有on,on不能省略
4.join on和where的区别
select * from emp,dept
where emp.deptno = dept.deptno--sql92标准
--等价于
select * from emp
join dept
on dept.deptno = emp.deptno--sql99标准
--推荐使用sql99标准
--把工资大于2000的员工姓名和部门名称输出
--sql92的实现方式
select emp.ename,dept.dname
from emp,dept
where emp.sal > 2000 and emp.deptno = dept.deptno
--sql99的实现方式
select emp.ename,dept.dname
from emp
join dept
on emp.deptno = dept.deptno
where emp.sal > 2000
--把工资大于2000的员工姓名和部门名称和工资等级输出
--sql99标准
select emp.ename,dept.dname,salgrade.grade
from emp
join dept
on emp.deptno = dept.deptno
join salgrade
on emp.sal between salgrade.losal and salgrade.hisal
where emp.sal > 2000
--sql92标准
select emp.ename,dept.dname,salgrade.grade
from emp,dept,salgrade
where emp.deptno = dept.deptno
and (emp.sal between salgrade.losal and salgrade.hisal)
and emp.sal > 2000
为了方便理解99标准,我在下面放一张图。解释一下,首先通过deptno将dept和emp表连接起来看成一个整体,或者你认为看成一张表也行,然后将这个连接起来的“一张表”再去和salgrade表进行连接,这个连接的时候就不是依靠外键关系,而是单纯的依靠判断sal字段的值在salgrade表中losal和hisal的哪个区间
习题
- 查找每个部门的编号,该部门的所有员工的平均工资,平均工资的等级
select T.deptno,T.avg(sal),s.grade
from
(
select deptno,avg(sal)
from emp
group by deptno
) T
join salgrade s
on T.avg(sal) between s.losal and s.hisal
- 输出姓名不包含A的所有员工中工资最高的前三名的员工的姓名,工资,工资等级,部门名称
select top 3 dept.ename,dept.sal,salgrade.grade,dept.dname
from emp
join dept
on emp.deptno = dept.deptno
join salgrade
on emp.sal between salgrade.losal and salgrade.hisal
where emp.ename not like '%A%'
order by emp.sal desc
- 求出emp表中所有领导的信息
select * from emp
where empno in (slect mgr from emp)
- 求出平均薪水最高的部门编号和部门的平均工资
select top 1 deptno,avg(sal)
from emp
group by deptno
order by avg(sal) desc
- 把工资大于所有员工中工资最低的3个人的姓名,工资,部门编号,部门名称,工资等级输出
--有一个人工资最低,把这个人排除掉,剩下的人中工资最低的前三个人进行输出
select top 3 T.ename,T.sal,T.deptno,T.dname,T.grade
form(
select * from emp e
where sal > (select min(sal) from emp)
join dept d
) T
join dept d
on T.deptno = d.deptno
join salgrade s
on T.sal between s.losal and s.hisal
order by e.sal
重点:查询的顺序
select top...
from A
join B
on...
join C
on...
where ...
group by...
having...
order by...