SQL Inner Join中表别名含义及跨表关联逻辑的技术疑问
关于SQL表别名与Join关联的解释
表别名a和ph的作用
- 这两个是表的别名,
a指代admissions表,ph指代doctors表。 - 核心作用是简化SQL代码:不用反复输入冗长的完整表名,在多表查询或多次引用表字段时,能大幅提升代码的可读性和编写效率。比如写
a.attending_doctor_id比写admissions.attending_doctor_id简洁得多。
两张表能用Inner Join关联的原因
- 关联的核心是匹配关联字段:
admissions表的attending_doctor_id字段,存储的是负责该入院记录的医生ID;而doctors表的doctor_id是医生的唯一标识ID。 - Inner Join的逻辑是:只保留两张表中满足
ph.doctor_id = a.attending_doctor_id条件的行——也就是只筛选那些有对应医生信息的入院记录,同时将两张表的字段合并输出。
Left Join/Right Join的差异与适用场景
- Left Join:如果写成
from admissions a left join doctors ph on ph.doctor_id = a.attending_doctor_id,会保留admissions表的所有行,哪怕某条入院记录的医生ID在doctors表中不存在(此时first_name和last_name会显示为NULL)。 - Right Join:如果写成
from admissions a right join doctors ph on ph.doctor_id = a.attending_doctor_id,会保留doctors表的所有行,哪怕某个医生没有任何入院记录(此时admissions_total需要用count(a.attending_doctor_id)才能得到0,用count(*)会得到1,因为医生本身的行存在)。 - 你尝试这两种Join没解决问题,大概率是你的需求是统计有接诊记录的医生的入院次数,这时候Inner Join才是精准匹配的选择;如果需求是统计所有医生(包括无接诊的),才需要用Left/Right Join配合调整聚合逻辑。
原SQL的小问题提示
原SQL的group by attending_doctor_id在严格的SQL模式(比如MySQL的ONLY_FULL_GROUP_BY)下会报错,因为SELECT中的first_name和last_name没有包含在分组条件里。更严谨的写法是:
SELECT first_name, last_name, count(*) as admissions_total from admissions a join doctors ph on ph.doctor_id = a.attending_doctor_id group by ph.doctor_id, first_name, last_name
因为doctor_id是医生的唯一标识,对应的姓名是唯一的,这样分组符合SQL标准。
内容的提问来源于stack exchange,提问作者hoss
相关产品推荐
相关产品推荐

