select e.first_name,m.first_name, e.manager_id,m.id from s_emp e, s_emp m
where m.first_name = 'Carmen' and e.manager_id = m.id
例子45:请问哪些员工是领导? --- 外连接:
分析外连接的含义: from t1,t2
where t1.c1 = t2.c2; (inner join)
from t1,t2
where t1.c1 = t2.c2(+);(outer join)
把t1表中的匹配不到的记录重新找回来。(一个都不能少)
在t2表中虚拟一条空记录,所有的字段都为null。 结果集:outer join = inner join + 不匹配记录 外连接的思路:(+)放在什么位置上?
(+)在哪边 哪边就是虚拟一个空记录
指导思想就是确定哪个表的全部记录要找出来? 例子46:列出员工和领导的对应关系,包含‘Carmen’?
select e.first_name employee,
nvl(m.first_name,'Boss') manager
from s_emp e, s_emp m where e.manager_id(+) = m.id; 结果集:41 = 24 +(25 - 8)
41 = 24 +17
例子47:列出哪些人是员工?(或者)哪些员工不是领导?、 Select
e.id,e.first_name,m.id,m.first_name
from
s_emp e,s_emp m
Where m.id=e.manager_id(+) And e.first_name is null
--- 左、右、全外连接:自然连接:id=id 就是同名字段的进行连接natural join
交叉连接就是 cross join 就是 s_emp,s_dept 会形成笛卡尔积
※From s_emp,s_dept d where dept_id = d.id 和from s_emp inner join s_dept on detp_id = d.id
分析左、右、全外连接的另外一种实现方式: from t1,t2
where t1 left outer join t2 on t1.c1 = t2.c2 ;(left outer join)
和t1.c1 = t2.c2(+)一样
where t1 right outer join t2 on t1.c1 = t2.c2 ;(right outer join
和(+)t1.c1 = t2.c2一样
全连接:inner join + 左右各不匹配的 24+1+17
列出员工和领导的对应关系,包含‘Carmen’? select
e.first_name
employee,
nvl(m.first_name,'Boss') manager
from s_emp e left outer join s_emp m on e.manager_id = m.id;
列出哪些人是员工? select
e.first_name
employee,
nvl(m.first_name,'Boss') manager
from s_emp e right outer join s_emp m on e.manager_id = m.id where e.first_name is null; select
e.first_name
employee,
nvl(m.first_name,'Boss') manager
from s_emp e full outer join s_emp m on e.manager_id = m.id;
十四、 组函数
//求平均数
//求总记录数
AVG (DISTINCT|ALL|n)
COUNT (DISTINCT|ALL|expr|*) 默认对null忽略
MAX (DISTINCT|ALL|expr) MIN (DISTINCT|ALL|expr) 例子48:列出提成的平均值? 例子49:列出提成的最大值?
//求最大数 //求最小数
select max (commission_pct) from s_emp
注意:所有组函数会忽略null值,只对非空值进行处理。 例子50:求出有提成的员工个数?
select count(commission_pct) from s_emp或 select count(*) from s_emp where commission_pct is not null
例子51:求出各部门的平均工资?
Select dept_id,avg(salary) from s_emp Group by dept_id
Select first_name,max(commission_pct) From s_emp
Group by first_name或
Select dept_id,d.name,avg(salary) From s_emp,s_dept d Where dept_id = d.id Group by dept_id,d.name 部门的平均工资同时显示部门名称 例子52: 求出各职位的平均工资?
select title, avg(salary) from s_emp group by title order by 2 desc
例子53: 求出各部门不同职位的平均工资?
select d.id,title,d.name,avg(salary) from s_emp e,