
# FROM
#### 功能描述
FROM子句用于指定查询的数据源。Spark 4.0增强了FROM子句，支持LATERAL子查询、TABLE关键字、VALUES行构造等多种数据源形式。
#### 语法格式
```
FROM table_reference [, ...]
```
其中 table_reference 为：
```
{ table_name [ TABLE ] [ alias ]
  | join_table
  | LATERAL ( subquery ) [ alias ]
  | ( subquery ) [ alias ]
  | VALUES ( { expression } [, ...] ) [, ...] [ alias ]
  }
```
join_table 为：
```
table_reference [ join_type ] JOIN table_reference [ ON join_condition | USING ( column [, ...] ) ]
```
join_type 为：
```
{ INNER | CROSS | LEFT [ OUTER ] | RIGHT [ OUTER ] | FULL [ OUTER ] | LEFT SEMI | LEFT ANTI }
```
#### 参数说明
| 参数                 | 说明                                                                        |
|:---|:---|
| table_name         | 表名，指定要查询的表。可使用TABLE关键字引用表值。                                               |
| alias              | 为表或子查询指定别名。子查询必须指定别名。                                                     |
| LATERAL (subquery) | LATERAL子查询，允许子查询引用同一FROM子句中先前出现的表的列。Spark 4.0增强支持。                        |
| (subquery)         | 嵌套子查询，子查询结果作为中间过渡表。子查询必须指定别名。                                             |
| VALUES             | 行构造器，直接构造行数据作为数据源。                                                        |
| join_type          | 连接类型，包括INNER、CROSS、LEFT OUTER、RIGHT OUTER、FULL OUTER、LEFT SEMI、LEFT ANTI。 |
| ON join_condition  | JOIN连接条件。                                                                 |
| USING (column)     | 使用同名字段进行JOIN的简写方式。                                                        |
   
#### 注意事项
- 所要查询的表必须是已经存在的表，否则会出错。
- FROM嵌套子查询中，子查询必须指定别名。
- LATERAL子查询可以引用同一FROM子句中左侧表的列，普通子查询不能引用外部列。
 
#### 示例
子查询作为数据源：
```
SELECT DISTINCT name FROM (SELECT name FROM student_info   JOIN course_info ON student_info.courseId = course_info.courseId) temp;
```
LATERAL子查询引用外部列：
```
SELECT * FROM orders o,   LATERAL (SELECT * FROM order_items WHERE order_id = o.id) items;
```
VALUES构造数据：
```
SELECT * FROM VALUES (1, 'a'), (2, 'b'), (3, 'c') AS t(id, name);
```
LATERAL VIEW与explode配合：
```
SELECT name, course FROM student   LATERAL VIEW EXPLODE(courses) t AS course;
```
