'select_expr' 是如何定义的?

How is a 'select_expr' defined?

在 mysql 文档中 SELECT 语句显示了以下语法:

SELECT
    ...
    select_expr [, select_expr] ...
    [FROM table_references]
    ...

但它并没有真正严格地谈论 select_expr 到底是什么,只是举了几个例子,例如:

什么是 select_expr 的更正式的定义,例如,我能想到的一些例子是:

SELECT field...                         // grab a field
SELECT CONCAT(field1, field2, ...)...   // grab a calculated field
SELECT NOW()  ...                       // grab a value that has nothing to do with a field
SELECT (SELECT id FROM othertable)...   // grab a value from a subselect that returns a scalar

当然,后者可能会变得相当复杂,因为理论上它可以在其中执行任意多个 SQL 语句。

注意上面使用的是 mysql 参考手册,但我认为这是一个一般的 SQL 问题,任何后端都可以用来回答这个问题,据我所知(postgres, mysql, mssql, sqlite, oracle) 或多或少具有相同的 select_expr 语法。

您还需要(例如,但无论如何都不完整):

SELECT 1         -- a constant
SELECT *         -- grab all fields from all tables
SELECT table.*   -- grab all fields from a specific table

manual中,1CONCAT(field1, field2, ...)NOW()(SELECT id FROM othertable)都统称为“表达式”:

The list of select_expr terms comprises the select list that indicates which columns to retrieve. Terms specify a column or expression or can use *-shorthand

手册在 Expression Syntax 部分列出了所有可能的表达式形式。

Bison grammar used to parse mysql statements, a select_item (which I think mostly corresponds to select_expr in the manual) is defined as follows 中:(为清楚起见,我删除了操作。)

select_item:
          table_wild
        | expr select_alias

本作品指的是:

select_alias:
          /* empty */
        | AS ident
        | AS TEXT_STRING_validated
        | ident
        | TEXT_STRING_validated

table_wild:
          ident '.' '*'
        | ident '.' ident '.' '*'

expr 本质上是参考手册所说的表达式,ident 是写列标识符的各种可能方式之一。

SELECT 语句包含一个 select_list,它是一个或多个 select_item,如上,或单个 * 通配符标记(这就是为什么table_wild 产品不包含无人陪伴的通配符令牌。

所以基本上,select_expr

  • 一个通配符*-shortcut,(但如果它只是*,它必须是列表中唯一的select_expr),或者
  • 一个 expr,可能后跟一个可选的 AS 和一个别名。

不过,这只是语法。语句解析后,将进行各种语义有效性检查,这可能会拒绝某些表达式。