SELECT ... WHERE without FROM抛出语法错误

时间:2014-11-26 13:26:21

标签: mysql

我正在使用MySQL 5.5.38,而我正在尝试使用SELECT生成零行的结果。

使用不存在的DUAL表,它可以工作:

SELECT 123 FROM DUAL WHERE FALSE

但普通版本会出现语法错误:

SELECT 123 WHERE FALSE
  

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以获得正确的语法   靠近' WHERE FALSE'在第1行

这是一个MySQL错误还是我遗漏了什么?

http://sqlfiddle.com/#!9/d41d8/1028

6 个答案:

答案 0 :(得分:3)

检查syntax

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

请注意,虽然FROM 是可选的,但所有后续功能都包含在[]周围的FROM块中 - 如果您想要使用这些功能中的任何一个,您需要一个FROM子句。

答案 1 :(得分:3)

我找不到documented的语法,因此技术上不支持:

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
      [PARTITION partition_list]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

如您所见,FROM是可选的,但WHERE需要FROM

[FROM table_references
      [PARTITION partition_list]
    [WHERE where_condition]

在任何情况下,打印一行并立即将其过滤掉似乎没什么用处,是吗?

  

联合多个类似的选择

可能很有用

这是一个不同的查询,因此使用不同的语法... FROM; - )

SELECT *
FROM (
    SELECT 123 AS foo
    UNION
    SELECT 456
    UNION
    SELECT 789
) data
WHERE foo<>456

如果您只是在末尾附加一个简单的WHERE,那么您只会过滤最后一个SELECT。

答案 2 :(得分:2)

现在,在 2021 年,您的问题可以用来回答,这是可能的。使用 MySQL Common Table Expressions

你的例子是:

WITH foo AS (SELECT 123)
SELECT *
FROM   foo
WHERE  false;

使用 CTE,您可以创建非常复杂的语句。就我而言,它也帮助我创建了一个没有 SELECT 但有 FROMWHERE

答案 3 :(得分:1)

当我尝试使用单个查询有条件地向表中插入行时,我自己遇到了这个问题。能够INSERT / WHERE很有用,但是如果没有FROM子句就不能这样做,这可能来自MSSQL。我通过从仅返回一条记录的子查询中进行选择来解决该问题:

INSERT INTO table_name (column_1, column_2)
SELECT 'Value 1', 'Value 2'
FROM (SELECT 1 AS whocares) AS t
WHERE ....

答案 4 :(得分:0)

尝试

SELECT column FROM TABLE WHERE column = 'FALSE'

答案 5 :(得分:0)

FROM DUAL来自oracle数据库。在MySQL中你可以完全放弃

SELECT 123

SELECT now()

例如。