SQL

1、自连接

2、单行子查询

3、多行子查询

in相当于多个=


1、选取job不是salesman和manager并且工资不在3000-7000之间的选项
select * from emp WHERE empno in (select empno from emp where (sal NOT BETWEEN 3000 and 7000) and not job in('SALESMAN','MANAGER'));


2、工资比部门30的所有员工的工资高的员工的姓名,工资和部门号码
all操作符
select ename,sal,deptno from emp where emp.sal> all(select sal from emp where emp.deptno=30);

max函数
select ename,sal,deptno from emp where emp.sal>(select max(sal) from emp where emp.deptno=30);
此句效率更高


3、工资比部门30任何一个员工的工资高的员工的姓名、工资和部门号
any操作符
select ename,sal,deptno from emp where sal>any(select sal from emp where emp.deptno=30);

min函数
select ename,sal,deptno from emp where sal>(select min(sal) from emp where emp.deptno=30);


4、查询与smith的部门和岗位完全相同的所有雇员
多列子查询
select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
或者select * from emp WHERE deptno = (SELECT deptno FROM emp WHERE ename='SMITH') and job =(SELECT job FROM emp WHERE ename='SMITH');


5、查询出高于自己部门平均工资的员工的信息
Oracle数据库中,数据表别名不能加as,列的别名可以加as也可以不加as
select * from emp a1,(SELECT deptno, AVG(sal) mysal FROM emp GROUP BY deptno) a2 WHERE a1.deptno = a2.deptno and a1.sal>a2.mysal;
说明:在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此也叫做内嵌视图,必须给子查询指定别名。


6、薪资大于2500或者工作职位是管理者的人员的姓名,薪资,职位
union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行
select ename,sal,job from emp where sal>2500
union
select ename,sal,job from emp where job='MANAGER';

union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中重复行。
select ename,sal,job from emp where sal>2500
union all
select ename,sal,job from emp where job='MANAGER';


7、薪资大于2500并且工作职位是管理者的人员的姓名,薪资,职位
intersect
使用该操作符用于取得两个结果集的交集
select ename,sal,job from emp where sal>2500
INTERSECT
select ename,sal,job from emp where job='MANAGER';

 

8、薪资大于2500且排除工作职位是管理者的人员的姓名,薪资,职位
minus
使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据,前者减后者
select ename,sal,job from emp where sal>2500
minus
select ename,sal,job from emp where job='MANAGER';

聚合函数
count(*|列名) 统计行数
avg(数值类型列名) 统计平均值
sum(数值类型列明) 求和
max(列名)最大值
min(列名)最小值
除count外,其它函数都会忽略null值

9、一条sql查出每个经理(MGR)手下有多少个员工,以及每个经理手下员工的平均薪资(sal)

自连接或者inner join

select e2.ename,count(*) 手下员工数量,avg(e1.sal) 平均薪资 FROM emp e1,emp e2 where e1.mgr= e2.empno GROUP by e2.ename;
select e.mgr,e1.ename,count(1),avg(e.SAL) from emp e inner join emp e1 on e.mgr=e1.empno group by e.MGR,e1.ename;

posted @ 2017-10-20 11:11  音为  阅读(164)  评论(0编辑  收藏  举报