天天看点

SQL 的复杂查询语句,例子及解析

select *from emp where deptno=

(select deptno from emp where ename="smith")

这是查询出与smith同一部门的员工信息。

-----------------------------------------------------------------------------------------------------

select *from emp,(select avg(sal) mysal,detno from emp group by deptno) tem

where emp.deptno=tem.deptno and emp.sal>tem.mysal

这是查出高于对应部门平均工资的员工信息。

---------------------------------------------------------------------------------------------

select *from emp where job in (select distinct job from emp where deptno=10)

这是查询与部门id为10的部门里面的工作相同的人员信息

---------------------------------------------------------------------------------------------

select top*4 from emp order by hiredate 

查出表的前四条信息

select top6 *from emp where empno   not in (select top4 empno from emp order by hiredate)

order by hiredate

查出5-10的信息条,

这里使用的是先把前4条信息的empno查询出来,然后使用not in ,来再查询前6条,

这样达到查询出5-10的信息条

---------------------------------------------------------------------------------------------

insert into 表名 (字段,字段) select 字段 ,字段 from 表名

简单的多条数据压力测试

---------------------------------------------------------------------------------------------

删除数据库表中的重复数据

如果是查询的话,思路就是利用distict直接把不唯一的数据查询出来;

但是如果是永久性删除重复数据的话,这就得:

先用distict把数据库表里面的不唯一数据先查询出来,放进一个临时表里面;

然后直接把原表里面的数据全部删除;

最后把临时表里面的不唯一数据全部添加进原表里面,这样就达到删除数据库表中的重复数据。

  select distict * into 临时表名 from 原表名

  delect *from 原表名

  insert into 原表名  select * from 临时表名

  drop table 临时表名

---------------------------------------------------------------------------------------------

select replace('XX' , 'xx') from 表名

----------------------------------------------------------------------------------------------

select ename ,datepart(year,hiredate) y,datepart(month,hiredate) m from emp 

order by m,y

按照年和月去对职工排序,先优先对月去排序,再对年去排序,如果月相同,再对年排序

这个给datepart取别名的操作很重要,可以用与后面的函数调用

----------------------------------------------------------------------------------------------

select *from emp where sal>(select sal from emp where name='xxx')

查出工资大于名字为‘xxx’的员工信息

----------------------------------------------------------------------------------------------

select count(*),deptid from emp group by deptid having count(*)>1

查出部门成员大于1的部门,用having count(*)>1作为条件部分

-----------------------------------------------------------------------------------------------

select emp.ename,boss.ename from work emp,work boss where emp.bossid=boss.eid

查询出员工信息及其上级的信息

在这基础上扩展,查出进入公司的时间比其上司晚的员工信息:

select emp.ename,emp.hiredate,boss.ename ,boss.hiredate from work emp,work boss where emp.bossid=boss.eid

and emp.hiredate>boss.hiredate

----------------------------------------------------------------------------------------------

列出部门信息和部门的员工信息,同时也把没有员工的部门信息列出来

select dep.dname,emp.ename from department dep,emp where dep.depid=emp.eid

以上只能够查询出部门信息和部门的员工信息。

但是那些没有员工的部门信息没列出来。

这时候需要用到的是右外连接,就是以department表为主,右连接上emp表,

这样部门全部都能列出来,然后员工的话看具体情况显示,没有就显示‘NULL’值。

select dep.dname,emp.ename from department emp right  jion department dep on

emp.depid=dep.depid

如果是用左外连的话,那就是 emp left jion department

----------------------------------------------------------------------------------------------

select name ,salary from employee where salary >

(select max(salary) from employee where depid=2 )

 查询出工资高于某个部门员工工资的员工信息

这边在()里面的sql语句使用max函数是必须的,因为>这个符号是不能与多条信息做比较的

。用max的话返回数据就是一条。

----------------------------------------------------------------------------------------------

select count(*) 总人数,avg(sal)平均工资,avg(datediff(year,hiredate,getdate()))平均服务年限,

deptno from emp group by depid

在SQL server里面给表起别名加不加as 都oK