技术需求:查询学生姓名及对应导师姓名,排除无学生的导师
这题我熟,咱们一步步来解决!
表结构
先把你给出的表整理成更清晰的Markdown表格:
students表
| student_id | first_name | last_name | advisor_id |
|---|---|---|---|
| 1 | Tanisha | Blake | 2 |
| 2 | Jess | Goldsmith | NULL |
| 3 | Tracy | Wu | 3 |
| 4 | Alvin | Grand | 1 |
| 5 | Felix | Zimmermann | 2 |
Advisors表
| advisor_id | first_name | last_name |
|---|---|---|
| 1 | James | Francis |
| 2 | Amy | Cheng |
| 3 | Lamar | Alexander |
| 4 | Anita | Woods |
需求分析
我们需要:
- 获取所有学生的姓名(first_name、last_name)
- 显示对应导师的姓名(如果有的话)
- 排除那些没有分配任何学生的导师(比如Anita Woods,没有学生关联她的advisor_id=4)
SQL查询语句
方案1:保留所有学生(包括无导师的)
这个方案会展示所有学生,无导师的学生对应的导师字段会显示为NULL,同时自动排除无学生的导师:
SELECT s.first_name AS student_first_name, s.last_name AS student_last_name, a.first_name AS advisor_first_name, a.last_name AS advisor_last_name FROM students s LEFT JOIN advisors a ON s.advisor_id = a.advisor_id;
语句解释:
- 使用
LEFT JOIN(左连接)是以students表为主表,确保所有学生记录都被保留,哪怕没有匹配的导师。 - 因为是从学生表关联导师表,那些没有学生的导师(比如Anita)不会出现在结果集中,完美满足“排除未分配学生的导师”的要求。
- 给字段起别名是为了让结果列名更直观,避免混淆学生和导师的姓名。
方案2:只保留有导师的学生
如果你只需要展示已经分配了导师的学生,同时排除无学生的导师,可以用INNER JOIN(内连接):
SELECT s.first_name AS student_first_name, s.last_name AS student_last_name, a.first_name AS advisor_first_name, a.last_name AS advisor_last_name FROM students s INNER JOIN advisors a ON s.advisor_id = a.advisor_id;
语句解释:
INNER JOIN只会保留两张表中匹配的记录,也就是只有分配了导师的学生才会被显示,同时无学生的导师也不会出现在结果里。
内容的提问来源于stack exchange,提问作者Amrut Hunashyal
相关产品推荐
相关产品推荐

