oracle-标量子查询-with-- 重用结果集外连接-外连接

1、启动

SQL> startup
ORA-01081: cannot start already-running ORACLE - shut it down first

 

2、登录SCOTT用户,注意空格,SCOTT用户的默认密码是TIGER,orcl是你自己创建的实例名,根据个人情况来
SQL> conn scott / tiger@orcl
Connected.
SQL> 
第二天
SQL语言本质---集合的运算
不要认为SQL语句操作的一定是一个表里的数据,实际上SQL操作的是一个集合,整个
SQL的处理过程,实际上就是集合的运算过程------------------------------from后面跟的是一个集合 如果是一张表的话也认为是表里数据组成的集合

SQL=集合的运算

� 单表
– select count(*) from (select * from emp);
– select ename,sum(sal) sum_sal from ( select * from emp) group by ename;

� 多表
� 多表
select b.dname,a.ename
from
(select deptno,ename from emp) a,
(select deptno,dname from dept) b
where a.deptno=b.deptno order by 1,2;


select b.dname,a.sal
from
(select deptno,sum(sal) sal from emp group by deptno) a,
(select deptno,dname from dept) b
where a.deptno=b.deptno order by 1,2;

内连接 innner join
– 两个结果集的交集

 

 

 

外连接 outer join
– 左连接 左边集合的全集。===等号左边表的全集 加号再右边 反向

外连接 outer join
– 右连接 右边集合的全集 ====等号右边的全集 加号在左边 反向

 

 

 右外连接:

 

第三天
标量子查询
select (select dname from dept b where b.deptno=a.deptno),ename from emp a order by 1,2; 一个字段可以写成sql语句 一个字段可以用结果集写出来
上述语句等价于select b.dname,a.ename from emp a,dept b where a.deptno=b.deptno order by 1,2;


select (select dname from dept b where a.deptno=b.deptno),a.ename from emp a order by 1,2;
select (),a.ename from emp a order by 1,2; ()括号中是需要查询的字段

 

with-- 重用结果集
� 找出工资大于平均工资的员工
select ename,sum(sal) sal from emp group by ename having sum(sal)>= (select sum(sal)/14 from emp) ;

SQL> select sum(sal) from emp;

SUM(SAL)
----------
24875
总共的工资
SQL> select ename,sum(sal) sal from emp group by ename having sum(sal)>= (select sum(sal)/14 from emp) ;

ENAME SAL
-------------------- ----------
JONES 2975
FORD 3000
CLARK 2450
SCOTT 3000
BLAKE 2850
KING 5000

我们可以看到having的用法,对分组统计后的员工数量进行了大于平均工资的员工的条件过滤。
SQL> select ename,sum(sal) from emp group by ename;

ENAME SUM(SAL)
-------------------- ----------
ALLEN 1600
JONES 2975
FORD 3000
CLARK 2450
WARD 1250
MARTIN 1250
SCOTT 3000
TURNER 1500
BLAKE 2850
KING 5000
在有组函数的select中,不是组函数的列,一定要放在group by子句中。
分组查询出每个人的工资
� 使用with
with后面构造了一个结果集 之后可以反复使用这个结果集
SQL> with t as (select ename,sum(sal) sal from emp group by ename )
2 select ename,sal from t where sal>=(select sum(sal)/14 from t);

ENAME SAL
-------------------- ----------
JONES 2975
FORD 3000
CLARK 2450
SCOTT 3000
BLAKE 2850
KING 5000

 

posted @ 2020-10-16 13:38  貔貅526  阅读(282)  评论(0编辑  收藏  举报