-
主查询和子查询可以不是一张表
即涉及到多表操作时,有两种解决方案,方案一是子查询,方案二是多表查询
例:查询部门名称是sales的员工信息
方法一
select *
from emp
where emp_no = ( select emp_no
from dept
where dept_name = ' sales');
方法二
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES';
查看全部 -
select子查询必须是单行子查询,单行子查询只能返回一行记录
from后面的子查询是把子查询的内容当作一个新表
查看全部 -
。。。。。
查看全部 -
自连接 核心:通过别名,将同一张表视为多张表
select e.ename 员工姓名,b.bname 老板姓名
from emp e,emp b
where e.mgr=b.empno;
自连接 一张表取两个别名
查看全部 -
不等值连接
select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
运用between and 查询条件 小值在前and 大值在后
查看全部 -
等值连接
select e.empno,e.ename,e.sal,d.dname
from emp e,dept d
where e.deptno = d.deptno;
查看全部 -
每张表的列数相加,行数相乘就得到了笛卡尔积最终表
多表查询进行笛卡尔集运算时,产生的所有结果中并不是完全正确的,有部分结果是不需要的,为了避免笛卡尔全集中的一些错误,需要在where中使用连接条件,然而连接条件的个数与参加进行笛卡尔集运算的表的个数存在一定关系: 连接条件个数=n-1 (n为参加笛卡尔集运算的表的总个数)
查看全部 -
分组函数可以进行嵌套,例子如下:
求部门平均工资的最大值
select max(avg(sal)) from emp group by deptno;
查看全部 -
orderby可以根据列,别名,表达式,序号进行排序
1.select deptno,avg(sal)平均工资 from emp group by deptno
order by 平均工资
*平均工资是avg(sal)的别名,order by语句可以直接使用别名,默认按升序排序
2.select deptno,avg(sal)平均工资 from emp group by deptno
order by 2
*select语句第二列是平均工资,所以order by语句后面直接写2也是跟第一条语句执行结果一样
a命令-append
a命令表示在上一条命令后面追加语句
a命令后必须跟两个或两个以上的空格,若只打一个空格则表示追加语句紧跟上一条语句
实例 a desc:order by 2desc
实例 a desc:order by 2 desc
查看全部 -
1 having 作用是过滤分组,因此having排在group后面
格式:select column, group_function
from table
where..
group by..
having...
order by...;
2 where, having功能相似,但是区别在于where不能使用组函数而having能,没有组函数的情况下,where和having可以互换,尽量使用where
查看全部 -
select a, 组函数(x)
from table
group by a;
select 列表中所有未包含在组函数中的列都要包含在GROUP BY 子句中;而GROUP BY子句中的列不必包含在SELECT列表中,此时查询结果也只有select中的列
select a,b,c,avg(sal)
from emp
group by a,b,c;
查看全部 -
找到员工表中薪水大于本部门平均薪水的员工
select empno,ename,sal
from emp e
where sal>(select avg(sal) from emp where deptno=e.deptno);
查看全部 -
group by rollup(a,b)
相当于
group by a,b
+
group by a
+
group by null
例:
select deptno,job,sum(sal) from emp group by rollup(deptno,job);
先按照不同部门不同职位查出薪资总和显示(deptno,job,sum(sal))
再按照不同部门查出薪资总和显示(deptno,sum(sal))
再查出薪资总和显示(sum(sal))
修改报表格式(只在sqlplus中有效):
break on deptno skip 2; 相同的deptno只显示一次,不同的跳过两行
set pagesize 30;
查看全部 -
求部门平均工资的最大值
select max(avg(sal)) from emp group by deptno;
查看全部 -
select count(*) as total,
sum(case to_char(t.hiredate,'yyyy') when'1981' then 1 else 0 end) "1981",
sum(case to_char(t.hiredate,'yyyy') when'1980' then 1 else 0 end) "1980",
sum(case to_char(t.hiredate,'yyyy') when'1987' then 1 else 0 end) "1987",
sum(case to_char(t.hiredate,'yyyy') when'1982' then 1 else 0 end) "1982"
from emp t;
查看全部
举报