将首先执行括号中的所有内容吗?

时间:2016-05-27 15:17:46

标签: mysql sql parentheses

我有这样的查询:

IF ( FALSE AND (SELECT 1 FROM mytable WHERE id = :id) ) THEN

    /* INSERT something here */

ENDIF;

所有我想知道的是,SELECT声明是否会被执行?

如您所知,INSERT语句从未运行,因为条件中有FALSEAND,因此条件始终为FALSE

现在我只想知道SELECTIF - 声明之前执行了吗?我是这么说的,因为我听说括号中的所有内容都将首先在MySQL中执行。

2 个答案:

答案 0 :(得分:1)

关于您的代码:它会按您的意愿执行。它将执行SELECT,然后评估与您的IF

相关联的条件

这种行为在很多编程语言中都很常见。如有疑问,请使用括号。

答案 1 :(得分:1)

文档(MySQL :: 13.3.1 Operator Precedence)没有说明,但似乎是短路。有必要确认这些信息。

MariaDB提供了更多详细信息:MariaDB :: Operator Precedence :: Short-circuit evaluation

示例:

mysql> SET @`out` := 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT (FALSE AND (SELECT @`out` := 0));
+----------------------------------+
| (FALSE AND (SELECT @`out` := 0)) |
+----------------------------------+
|                                0 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> SELECT @`out`;
+--------+
| @`out` |
+--------+
|      1 | -- <-- Not change
+--------+
1 row in set (0.00 sec)

mysql> SELECT (TRUE AND (SELECT @`out` := 0));
+---------------------------------+
| (TRUE AND (SELECT @`out` := 0)) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> SELECT @`out`;
+--------+
| @`out` |
+--------+
|      0 | -- <-- Change
+--------+
1 row in set (0.00 sec)

<强>更新

mysql> SET @`out` := 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT (TRUE AND (SELECT @`out` := 1) AND FALSE);
+-------------------------------------------+
| (TRUE AND (SELECT @`out` := 1) AND FALSE) |
+-------------------------------------------+
|                                         0 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT @`out`;
+--------+
| @`out` |
+--------+
|      1 | -- <-- Change
+--------+
1 row in set (0.00 sec)