SQLServer内连接总复习


1、SQLServer查询语句的书写顺序
2、什么是表连接
3、在SQLServer查询的过程当中如何表示一个临时表
4、9个例子讲明白如何进行SQLserver查询


最近一直比较忙,今天是大周末,决定认真、详细的写一篇博客。

1、SQLServer查询语句的书写顺序

从网上看了很多关于编写SQL查询语句的编写顺序问题,但是大部分都是大同小异,经过博主自己总结,SQLServer查询语句的编写应该是下面的顺序:
from–>where–>select—>group by+聚集函数—>having—>distinct—>order by —>top。
其中from–>where–>select这个结构要作为一个查询的标配,即使你写的是where 1=1,要作为一个查询习惯。

2、什么是表连接

先讲述一下什么是笛卡尔积:
1、在笛卡尔积中,连接是没有条件的,所有的都必须连接在一起。
2、将A表的每一条记录都和B表的每一条记录组合在一起(或者说将B表的每一条记录都和A表的每一条记录组合在一起)
3、笛卡尔积的产生方式为两种:
①select…….from A,B where 1=1
②select…….from A join B on 1=1
4、笛卡尔产生的结果:行相乘、列相加
什么是表连接:它是从两个关系的笛卡尔积中,通过on和where选取属性间满足一定条件的元组。
表连接的方式:
select…….from A
join B 其中join表示链接的哪一张表
on……. on表示链接的条件
where ……. where表示对表中的记录进行过滤,表示过滤条件。
在这里说明一下on和where的区别和联系:
on中既可以写连接条件,也可以写过滤条件,但是不推荐,应该分开写,on中只写连接条件,where中写过滤条件;有join的必须有on。
on指定的是连接的条件,而where指的是过滤的条件。

3、在SQLServer查询的过程当中如何表示一个临时表

临时表的产生方式:将结果集加上括号,并起一个别名,但是有的时候也不用起别名。
(
…….
……. ) “T”
就OK了,其中…….代表中间查询的结果 。

4、8个例子讲明白如何进行SQLserver查询

1、将员工的名字不包含I的所有员工中工资最高的前3名的每个员工的姓名、工资、工资等级和部门名称进行输出

select top 3 "E".ename,"E".sal,"D".dname,"S".GRADE
from emp "E"
join dept "D"
on "E".deptno = "D".deptno --此时将emp表和dept表进行了连接操作
join SALGRADE "S"
on "E".sal >= "S".LOSAL and "E".sal <= "S".HISAL
where  "E".ename not like '%I%'
order by "E".sal desc

具体的查询结果:
这里写图片描述
2、求出每个员工的姓名、部门编号、部门的名称和工资的等级

select "E".ename,"E".deptno,"D".dname,"S".GRADE
from emp "E"
join dept "D"
on "E".deptno = "D".deptno 
join SALGRADE "S"
on "E".sal >= "S".LOSAL and "E".sal <= "S".HISAL
where 1=1 

产生的结果:
这里写图片描述
3、输出部门名称不包含S的所有的员工中工资最高的前3名的每个员工的姓名、工资、工资的等级、部门的名称。

select top 3 "E".ename,"E".sal,"D".dname,"S".GRADE
from emp "E"
join dept "D"
on "E".deptno = "D".deptno
join SALGRADE "S"
on "E".sal >= "S".LOSAL and "E".sal <= "S".HISAL 
where "D".dname not like '%S%'
order by "E".sal desc 

运行的结果:
这里写图片描述
4、求出每个部门的编号,该部门所有员工的平均工资,以及相应平均工资的等级

select "T".sal_avg,"S".GRADE
from (
        select "E".deptno,avg("E".sal) as "sal_avg"
        from emp "E"
        where 1=1 
        group by "E".deptno 
     )  "T"
join SALGRADE "S"
on "T".sal_avg >= "S".LOSAL and "T".sal_avg <= "S".HISAL
where 1=1 

运行结果:
这里写图片描述
5、求出每个部门的编号,部门的名称,该部门所有员工的平均工资以及平均工资的等级

select "T".deptno,"T".dname,"T".avg_sal,"S".GRADE
from (
        select "D".deptno,"D".dname,avg("E".sal) as "avg_sal"
        from emp "E"
        join dept "D"
        on "E".deptno = "D".deptno 
        where 1=1 
        group by "D".deptno,"D".dname
     ) "T"
join SALGRADE "S"
on "T".avg_sal >= "S".LOSAL and "T".avg_sal <= "S".HISAL
where 1=1

运行结果:
这里写图片描述
6、求出emp表中所有领导的姓名

select *
from emp 
where emp.EMPNO in (
            select mgr
            from emp 
            where 1=1 
       ) 

运行结果:
这里写图片描述
7、求出平均薪水最高的部门的编号和部门的平均工资

select top 1 emp.deptno,avg(emp.sal) as "avg_sal"
from emp 
where 1=1 
group by emp.deptno
order by avg_sal desc

运行结果:
这里写图片描述
8、有一个人工资最低,把这个人排除掉,剩下的人中工资最低的前3个人的姓名、工资、部门编号、部门名称和工资等级输出

select top 3 "E".ename,"E".deptno,"E"."sal","D".dname,"S".GRADE
from emp "E"
join dept "D"
on "E".deptno = "D".deptno 
join SALGRADE "S"
on "E".sal >= "S".LOSAL and "E".sal <= "S".HISAL
where "E".sal > (
                   select min(sal)
                   from emp 
                   where 1=1 
                ) 
order by "E".sal asc 

运行结果:
这里写图片描述
9、把工资大于1500的所有的员工按照部门编号进行分组,并按照降序输出(前2个)部门平均工资大于2000的部门的编号、部门的名称、部门平均工资的等级。

select "T".deptno,"D".dname,"S".GRADE
from (
        select top 2 "E".deptno,avg("E".sal) as "avg_sal"
        from emp "E"
        where "E".sal > 1500
        group by "E".deptno
        having avg("E".sal) > 2000 --有点类似于distinct
        order by avg("E".sal) desc
     ) "T"
join dept "D"
on "T".deptno = "D".deptno 
join SALGRADE "S"
on "T".avg_sal >= "S".LOSAL and "T".avg_sal <= "S".HISAL
where 1=1 

运行结果:
这里写图片描述
OK,如有问题,欢迎留言指针!qq:991469838

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只懒得睁眼的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值