我正在使用MySQL 5.5.38,而我正在尝试使用SELECT
生成零行的结果。
使用不存在的DUAL
表,它可以工作:
SELECT 123 FROM DUAL WHERE FALSE
但普通版本会出现语法错误:
SELECT 123 WHERE FALSE
1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以获得正确的语法 靠近' WHERE FALSE'在第1行
这是一个MySQL错误还是我遗漏了什么?
答案 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
但有 FROM
的 WHERE
。
答案 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()
例如。