MENU

内连接

June 12, 2018 • Read: 3614 • SQL阅读设置

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...
Last Modified: May 12, 2021
Archives Tip
QR Code for this page
Tipping QR Code