MENU

内连接

June 12, 2018 • Read: 3426 • 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