SQL连接,内连接外连接实操
案例:

答案一:使用单表查询,返回的name值是错误的。不是employee_id对应的name
点击查看代码
``` select reports_to, count(employee_id) AS reports_count, Round(avg(age),0) AS average_age from Employees group by reports_to having count(employee_id)>=1 and reports_to is not null ```答案二:使用内连接。employee_id要和reports_to建立相等关联,输出employee_id对应的name,内连接只会显示键值相同的列
点击查看代码
select
a.employee_id AS employee_id,
a.name AS name,
count(b.employee_id) AS reports_count
Round(avg(b.age),0) AS average_age
from
Employees a
inner join
Employees b
on
a.employee_id=b.reports_to
group by
a.employee_id
order by
a.employee_id
答案三:使用外连接,外连接后存在null值要排除
学习过程中出现了几个错误
1、round(avg(age),0) AS average_age:编译器提示Column 'age' in field list is ambiguous。age在字段列表中是不确定的,改成round(avg(e2.age),0) AS average_age
2、having的使用限制
- 必须和group by 配合使用
- having可以使用聚合函数结果的筛选,一般不用单独的行值
-
i.为了筛选null值,在group by后面使用了 -
having -
e2.employee_id is not null -
编译器提示:Unknown column 'e2.employee_id' in 'having clause' 【限制条件使用where,放在group by之前】 - having后直接使用聚合函数,不要使用自定义的值:
-
i.错误示范having reports_count>1 应该是having count(e2.employee_id)>1
点击查看代码
SELECT
e1.employee_id AS employee_id,
e1.name AS name,
count(e2.employee_id) AS reports_count,
round(avg(e2.age),0) AS average_age
FROM
Employees e1
left JOIN
Employees e2
ON
e1.employee_id = e2.reports_to
where
e2.employee_id is not null
group by
e1.employee_id
order by
e1.employee_id
性能
在具体执行中,方案三外连接的耗时比方案二内连接更快。在后面sql的编写中,建议提供2个方案,通过执行计划分析和实践测试那种方式最快

浙公网安备 33010602011771号