What is the role of brackets in the below query?方括号和反勾用于在SQL查询中进行替换关键字,但我找不到使用方括号的适当解释.

SELECT (authorID) FROM AUTHOR;

在SQL中,这是有效的,但当您在其中包含两列时,它会给您一个错误,表明"操作数应该包含一列".当将每一列放在括号内并用逗号分隔每一列时,它不会给出错误,如下所示.

SELECT (authorID),(authorName) FROM AUTHOR;

推荐答案

括号或括号在您显示的上下文中是多余的.没有坏处,但不需要它们.

就像在代数中一样,以下两个表达在功能上是相同的:

x + y
(x + y)

额外的圆括号不会改变此运算式的结果.

您可以在代数中使用括号来更改运算符优先级.由于相乘比加法束缚得更紧,因此以下两个公式不相同:

x + y * z
(x + y) * z

对于一个如此简单以至于只有一个变量的表达,括号确实是多余的.

(x)

这与SQL中的第一个示例类似,其中括号位于select-list中的每个相应列周围:

SELECT (authorID),(authorName) FROM AUTHOR;

在SQL或大多数其他SQL实现中,这些括号没有必要或用途(我不使用Microsoft Access,所以这可能是一个例外).

在SQL中,不冗余的括号的一个特殊用途是将多个表达式的列表放入row value constructor中.这允许比较二元组:

(col1, col2) = (123, 456)
(col1, col2, col3) IN ((1, 2, 3), (4, 5, 6), (7, 8, 9))

在某些上下文中,例如VALUES statement,行值构造函数看起来像ROW(...list...).

但在 Select 列表中,每个表达都必须是一个纯量表达.即,一个列、一个运算式或一个文本值,但不是行值.

同样,在行值构造函数中,该列表中的每个项都必须是纯量表达.换句话说,您不能在行值构造函数中嵌套另一个行值构造函数.

在这个例子中,我使用了行值,但 Select 列表中的表达是比较,所以它只是一个布尔结果:

mysql> select (1, 2) = (1, 2) as `same`;
+------+
| same |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

但我不能在行值内使用另一行值:

mysql> select (1, 2) = (1, (2,3)) as `same`;
ERROR 1241 (21000): Operand should contain 1 column(s)

Mysql相关问答推荐

计算符合字段值只能包含一种事件类型这一事实的记录

MySQL-带有用户定义变量的IF-THEN语句

根据时间戳分组删除

在MySQL查询中查找和替换表内的值

MySQL如何在触发器内部 Select 多行然后插入它们

MySQL - 如何根据单列查找重复行?

SQL查询以查找两个特定行的总和

生成直到 10 的平方数序列

SQL: Select TEXT 字段的子字符串比整个值快

有人可以帮我用 R 编程解决这个问题吗?

从多到多表中 Select 数据而无需重复

动态创建内联 SQL 表(用于排除左连接)

如何为 php 启用 mysqlnd?

如何在 MySQL 中为用户设置默认架构

用户 'User'@'%' 和 'User'@'localhost' 不一样吗?

#1030 - 从存储引擎 Aria 收到错误 176读取错误校验和的页面

如何改进 INSERT INTO ... SELECT 锁定行为

在osx的命令行中使用Mysql-找不到命令?

Python 是否支持 MySQL 准备好的语句?

获取最后一组不同的记录