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