
# 左半连接
#### 功能描述
左半连接（LEFT SEMI JOIN）用来查看左表中符合 JOIN 条件的记录。左半连接只返回左表中的记录，不返回右表的列。
#### 语法格式
```
SELECT attr_expr_list FROM table_reference
  LEFT SEMI JOIN table_reference ON join_condition;
```
#### 参数说明
| **参数**              | **说明**                                   |
|:---|:---|
| **attr_expr_list**  | 查询列表达式列表，指定需要返回的列。所涉及的字段只能是左表中的字段，否则会出错。 |
| **table_reference** | 进行连接的表名或子查询。必须是已存在的表，否则会出错。              |
| **LEFT SEMI JOIN**  | 左半连接关键字，只显示左表中满足 JOIN 条件的记录。             |
| **join_condition**  | 连接条件，通常为两表之间列的等值比较表达式。                   |
| **ON**              | 指定连接条件的关键字。                              |
   
#### 注意事项
- 所要进行 JOIN 连接的表必须是已经存在的表，否则会出错。
- attr_expr_list 中所涉及的字段只能是左表中的字段，否则会出错。
- 左半连接与左外连接的区别：左半连接只返回左表中符合 JOIN 条件的记录，而左外连接返回左表所有的记录，匹配不上 JOIN 条件的记录右表列返回 NULL。
- 左半连接的效果等价于 WHERE ... IN 或 WHERE EXISTS 子查询。
 
#### 示例
返回选课学生的姓名及其所选的课程编号。
```
SELECT student_info.name, student_info.courseId FROM student_info LEFT SEMI JOIN course_info ON student_info.courseId = course_info.courseId;
```
等价写法（使用 WHERE IN）：
```
SELECT name, courseId FROM student_info WHERE courseId IN (SELECT courseId FROM course_info);
```
等价写法（使用 WHERE EXISTS）：
```
SELECT name, courseId FROM student_info WHERE EXISTS (SELECT 1 FROM course_info WHERE student_info.courseId = course_info.courseId);
```
