SELECT语句的常用元素
- Literal
- Expression
- Column specification
- User variable
- System variable
- Case expression
- Scalar function
- Null value
- Cast expression
- Compaund expression
- Row expression
- Table expression
- Aggregation function
一个table expression通常得到一个值,该表达式用在SELECT中以及SELECT语句的WHERE子句中。
我们通常按照表达式的数据类型或其值的复杂性或其形式来给表达式分类。表达式的数据类型和MySQL的数据类型是一致的,也包含数值型、字符型、时间型、十六进制和布尔类型。这时,表达式有一个确定的值,我们称其为标量scalar value。在按复杂性分类时,这些scalar value所表示的表达式被成为scalar expression。除此之外,还有row expression和table expression。需要注意的是,row expression是列表(有序),而table expression是集合(无序)
表达式的第三种划分方式是以上面两种为基础的。通常来说,带有运算符的表达式就是compaund expression。与之对应的是单一表达式singular expression。在MySQL中table expression是可复合的(如只用UNION关键字),而row expression是不可复合的。
SELECT语句的定义
1 |
|
下面我们来分析一下SQL语句的执行过程。
1 |
|
上面的SQL语句最终的结果集就是一个table expression,就像之前说的,a table expression is a collection of rows。table expression的定义如下:
1 |
|
一个table expression可以是一条SELECT语句(singular expression)或者使用()括号将自身包起来,再或者是多个table expression使用一些关键字来复合(eg:UNION),也就是所谓的compaund expression。而在使用UNION时,必须保证两个表表达式的度是相同的(列数相同)。
一个table expression可以调用另一个table expression(subquery或subselect)。理论上讲,table expression的嵌套可以是无限的。
1 |
|
根据子查询返回的结果集的类型,子查询又被分为table subquery(返回的是table expression)、row subquery(返回的row expression)、column subquery(返回的是只有一列的row expression)、scalar subquery(返回值是一行一列,即一个标量)
SELECT语句:FROM子句
一个table expression通常是从FROM子句开始执行的。除非它没有FROM子句,例如:select 1+2。FROM子句的定义如下:
1 |
|
定义看起来很复杂,用过MySQL的同学都知道这是很简单的。上面这段相当于:FROM 数据库名.表明 [AS] 别名。AS关键字可以省略。
上面这些规则同样适用于SELECT子句中的列。例如:SELECT 数据库名.表名.列名。需要注意的是,这些限定词都是可以使用别名替代的。例如:
1 |
|
最后,剩下FROM子句的一个难点,JOIN。具体看下图的分析,应该比较明了了。页面太长了 - -、,换下一章。