oracleday06

来源:互联网 发布:linux tail 显示行号 编辑:程序博客网 时间:2024/06/06 03:49

group by用于对查询的结果分组统计

 having 用于限制分组显示结果

显示每个部门 的每种岗位的平均工资和最高工资按照部门号升序排列

select avg(sal),max(sal) from emp group by deptno,job order by deptno

分组函数(avg max...)只能出现在选择列表、having、order by 子句中

select 中这3个的顺序1、group by2、 having 3、order by

在选择列中如果有列、表达式、分组函数 那么这些列和表达式必须有一个(1个不够就2个 )出现在group by中 不然报错

如select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000; 这里deptno 一定要出现在group by中 

多表查询

不可避免对两张或以上的表进行查询

比如显示雇员雇员工资和雇员部门名称

多表查询的原理:

select * from dept,emp;

从dept表中选出第一条记录,然后与emp的每一条记录进行匹配,形成新的记录 所以 4*16=54

笛卡尔集 在多表查询的时候 如果不带任何条件则会出现笛卡尔集 如何避免:多表查询的条件:至少不能少于表的个数-1

select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;


select emp.ename,emp.sal,salgrade.grade from emp,salgrade where emp.sal beteween salgrade.losal and salgrade.hisal;

多表查询的时候需不需要加表名:如果两个表的列同名则需要加表名区分 否则可以不加 建议都加增加可读性

比如 from emp t1,salgrade t2


自连接:

要先取个别名 worker.mgr=boss.empno(+)   +在右边是左外连 完全显示左边的

子查询

子查询是指嵌入其他sql语句中的select语句 也叫嵌套查询

单行子查询

 指只返还一行数据的子查询

多行子查询 distinct 去重

返回多行数据的子查询

如果子查询的数据有多个 要用 in  用= 号仅有1个

在子查询中使用all

select * from emp where sal > all(select sal from emp where deptno=30);

select * from emp where sal > (select max(sal) from emp where deptno=30);

在多行子查询中使用any 大于任意一个 就是最小的那个

select * from emp where sal >any(select sal from emp where deptno=30);

select * from emp where sal>(select min(sal) from emp where deptno=30) ;

多列子查询

select * from emp where(deptno,job) = (select deptno,job from emp where ename='SMITH')  oracle 中能用其他数据库不知道 而且括号内内容要相对应