'select_expr' 是如何定义的?
How is a 'select_expr' defined?
在 mysql 文档中 SELECT
语句显示了以下语法:
SELECT
...
select_expr [, select_expr] ...
[FROM table_references]
...
但它并没有真正严格地谈论 select_expr
到底是什么,只是举了几个例子,例如:
- 每个 select_expr 表示您要检索的列。必须至少有一个 select_expr.
- SELECT 也可用于检索未引用任何 table 计算的行。例如:
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
语法。
您还需要(例如,但无论如何都不完整):
SELECT 1 -- a constant
SELECT * -- grab all fields from all tables
SELECT table.* -- grab all fields from a specific table
在manual中,1
、CONCAT(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
和一个别名。
不过,这只是语法。语句解析后,将进行各种语义有效性检查,这可能会拒绝某些表达式。
在 mysql 文档中 SELECT
语句显示了以下语法:
SELECT
...
select_expr [, select_expr] ...
[FROM table_references]
...
但它并没有真正严格地谈论 select_expr
到底是什么,只是举了几个例子,例如:
- 每个 select_expr 表示您要检索的列。必须至少有一个 select_expr.
- SELECT 也可用于检索未引用任何 table 计算的行。例如:
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
语法。
您还需要(例如,但无论如何都不完整):
SELECT 1 -- a constant
SELECT * -- grab all fields from all tables
SELECT table.* -- grab all fields from a specific table
在manual中,1
、CONCAT(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
和一个别名。
不过,这只是语法。语句解析后,将进行各种语义有效性检查,这可能会拒绝某些表达式。