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...