- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
描述
students 表存储了所有学生的信息,包括学生 id 和学生姓名 name
companies 表存储了所有公司的信息,包括公司 id 和公司名称 name
recording 表存储了所有的简历投递数据,包括学生 id (student_id) 和 公司 id (company_id)
请编写 SQL 语句,查询所有没有向阿里巴巴 (Alibaba) 公司投递过简历的学生姓名。
表定义 1: students (学生表)
| 列名 | 类型 | 注释 |
|---|---|---|
| id | int unsigned | 主键 |
| name | varchar | 学生姓名 |
表定义 2: companies (公司表)
| 列名 | 类型 | 注释 |
|---|---|---|
| id | int unsigned | 主键 |
| name | varchar | 公司名称 |
| address | varchar | 公司地址 |
表定义 3: recording (记录表)
| 列名 | 类型 | 注释 |
|---|---|---|
| id | int unsigned | 主键 |
| delivery_date | date | 投递日期 |
| company_id | int | 公司 id |
| student_id | int | 学生 id |
样例
样例一:
表内容 1: students
| id | name |
|---|---|
| 1 | Da Ming |
| 2 | Amy |
| 3 | Mike |
| 4 | Park |
| 5 | George |
表内容 2: companies
| id | name | address |
|---|---|---|
| 1 | Alibaba | Hang Zhou |
| 2 | NetEase | Guang Zhou |
| 3 | Baidu | Bei Jing |
| 4 | Tencent | Shen Zhen |
表内容 3: recording
| id | delivery_date | company_id | student_id |
|---|---|---|---|
| 1 | 2020-01-08 | 3 | 4 |
| 2 | 2020-02-06 | 4 | 5 |
| 3 | 2020-03-12 | 1 | 1 |
| 4 | 2020-04-07 | 1 | 4 |
在运行你的 SQL 语句之后,表应返回:
| name |
|---|
| Amy |
| Mike |
| George |
样例二:
表内容 1: students
| id | name |
|---|---|
| 1 | Da Ming |
| 2 | Amy |
| 3 | Mike |
| 4 | Park |
| 5 | George |
表内容 2: companies
| id | name | address |
|---|---|---|
| 1 | Alibaba | Hang Zhou |
| 2 | NetEase | Guang Zhou |
| 3 | Baidu | Bei Jing |
| 4 | Tencent | Shen Zhen |
表内容 3: recording
| id | delivery_date | company_id | student_id |
|---|---|---|---|
| 1 | 2020-01-08 | 1 | 2 |
| 2 | 2020-02-06 | 1 | 5 |
| 3 | 2020-03-12 | 1 | 1 |
| 4 | 2020-04-07 | 1 | 4 |
在运行你的 SQL 语句之后,表应返回:
| name |
|---|
| Mike |
题解
第一步:left join companies c on r.company_id=c.id where c.name='Alibaba' 左连接company,查出名称为alibaba的公司id, 第二步:根据上面查到的id 找到所有投递的学生 第三步:根据找到的学生的,反选出没有投递的学生。
select
name
from students
where name not in (
select
s.name
from students s
left join recording r
on s.id=r.student_id
left join companies c
on r.company_id=c.id
where c.name='Alibaba'
)