0

在该SELECT语句的 mysql 文档中,它显示了以下语法:

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

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

  • 每个 select_expr 表示您要检索的列。必须至少有一个 select_expr。
  • SELECT 也可用于检索不参考任何表的计算行。例如:
    mysql> SELECT 1 + 1;
            -> 2
    

例如,我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语法。

4

2 回答 2

1

您还需要(例如,但不以任何方式完成):

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

手册 1CONCAT(field1, field2, ...),NOW()(SELECT id FROM othertable)都被归为“表达式”:

select_expr 术语列表包含选择列表,该列表指示要检索的列。术语指定列或表达式,或者可以使用 *-shorthand

该手册在“表达式语法”部分列出了所有可能的表达式形式。

于 2020-11-02T03:10:30.783 回答
1

用于解析mysql语句的Bison语法中,a select_item(我认为主要对应select_expr于手册中的)定义如下:(为了清楚起见,我删除了动作。)

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语句包含 a select_list,它是一个或多个select_items,如上所述,或单个*通配符标记(这就是为什么table_wild生产不包含不伴随的通配符标记。

所以基本上, aselect_expr

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

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

于 2020-11-02T15:31:42.000 回答