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个方案,通过执行计划分析和实践测试那种方式最快

posted @ 2025-02-26 10:36  测试三思  阅读(19)  评论(0)    收藏  举报