MySQL查询:选择特定列和全部列

3
我在想为什么这个查询会返回错误:
SELECT column_name, *
FROM INFORMATION_SCHEMA.COLUMNS;

您的SQL语法存在错误;请检查与您的MySQL服务器版本相对应的手册,以获取正确使用方法,出错位置在'* FROM INFORMATION_SCHEMA.COLUMNS' 附近

其他变化正常:

SELECT column_name, c.*
FROM INFORMATION_SCHEMA.COLUMNS c;

SELECT *, column_name
FROM INFORMATION_SCHEMA.COLUMNS;

SELECT c.*, column_name
FROM INFORMATION_SCHEMA.COLUMNS c;

db<>fiddle演示 - MySQL

db<>fiddle演示 - PostgreSQL

db<>fiddle演示 - SQL Server


@TimBiegeleisen 请回答,我真的很想知道那个谜语的答案 :) - Lukasz Szozda
2
https://dev59.com/4YTba4cB1Zd3GeqP9a2m - Welder Lourenço
2
@WelderLourenço 但是也许现在阅读这个问题的某个人可以解释为什么会出现这种情况 :-) - Tim Biegeleisen
1
@LukaszSzozda 是的...但是那个重复仍然没有解释清楚。 - Tim Biegeleisen
1
@TimBiegeleisen 是的,我同意。也许有人会有更详细的答案 :) - Lukasz Szozda
3个回答

2
重复的链接基本上是这里提出关于 MySQL 的同一个问题。它没有解释为什么允许使用 SELECT *, col1,而不允许使用 SELECT col1, *。我很好奇,于是在 MySQL 8 中设置了以下演示: demo
WITH tb1 AS (
    SELECT 1 AS id UNION ALL SELECT 2 UNION ALL SELECT 3
),
tbl2 AS (
    SELECT 1 AS id UNION ALL SELECT 2 UNION ALL SELECT 3
)

SELECT tbl1.id, *
FROM tbl1
INNER JOIN tbl2
    ON tbl1.id = tbl2.id;

仔细观察,我在查询中错误地将第一个CTE称为“tbl1”,实际上应该称为“tb1”。它甚至无法执行到此步骤,并生成以下错误消息:
“您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册以使用正确的语法*”
当我修复CTE和查询名称以匹配时,然后我得到相同的错误。换句话说,查询失败于SELECT子句的解析步骤,并且甚至没有担心表名,或者*指代什么。
我发表这篇答案是因为它添加了关于MySQL分析器如何处理此情况的信息。SELECT col1, *语法之所以失败并不是因为*存在任何歧义,这是有道理的,因为SELECT *,col1可以工作。相反,由于某种原因,它似乎只是解析规则不喜欢这种语法。

我真的很喜欢那个案例。好线索! - Lukasz Szozda
2
它似乎在很早的时候就出现了问题,我敢打赌你可以破坏查询的任何其他部分并获得相同的错误消息。至于为什么,我只能猜测。我尝试在ANSI-92标准中查找,但没有结果。:-( - Tim Biegeleisen
1
我尝试在ANSI-92标准中查找,但没有找到相关内容。 ANSI SQL 92确实在使用星号时提到了序列顺序.. 7.9 <query specification> -> Syntax rules.. 但它确实没有解释为什么MySQL会在SELECT col, * ..上出错。 - Raymond Nijland

1
一些数据库将select *视为单个结构,就像select distinct是单个结构一样(distinct实际上并不是分开的)。
这影响了它的解析方式。MySQL对此有奇怪的规则。
例如,在Oracle中,您根本无法向select *添加其他表达式。
简单的解决方案是使用合格的引用和表别名:
SELECT c.column_name, c.*
FROM INFORMATION_SCHEMA.COLUMNS c;

因为我总是使用合格的列引用和表别名,所以不会遇到这个问题。但实际上,我有时也会犯错。所以,我知道Oracle有这种特定的行为。


1
它并没有解释为什么:“SELECT *,column_name FROM INFORMATION_SCHEMA.COLUMNS;”不会返回错误:Oracle最终会出现错误。 - Lukasz Szozda

0

你试图返回的不仅是 column_name,而是所有内容。因此,在其他示例中,你要么首先返回所有内容,因此 column_name 已经被返回,要么在子集中返回所有内容,因此它很好:)你可能需要阅读一些关于 SQL 中 * 运算符的内容。


1
这个答案显然是不正确的:反例,其中包含表达式。 - Lukasz Szozda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接