我们都知道,要从表中选择所有列,可以使用

SELECT * FROM tableA

是否有一种方法可以在不指定所有列的情况下从表中排除列?

SELECT * [except columnA] FROM tableA

我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。


当前回答

是否有一种方法可以在不指定的情况下从表中排除列 所有的列?

以通常的方式使用声明性SQL是不行的。

我认为你提出的语法是有价值的,是好的。事实上,关系数据库语言‘Tutorial D’有一个非常相似的语法,关键字ALL BUT后面跟着一组属性(列)。

然而,SQL的SELECT *已经受到了很多批评(@Guffa的回答是一个典型的反对),所以我不认为SELECT ALL BUT会很快进入SQL标准。

我认为最好的“工作”是创建一个视图,只有你想要的列,然后选择*从那个视图。

其他回答

在SSMS中,智能感知和混叠是一种更简单的方法。试试这个 在文本编辑器中右键单击,并确保启用了智能感知。 输入一个别名[SELECT t.* FROM tablename t]的查询。 输入文本t.*并删除*,SSMS将自动列出以f为别名的表的列。 然后,您可以快速指定您想要的列,而不必使用SSMS将选择写入另一个脚本,然后执行更多的复制/粘贴操作。 我一直在用这个。

如果你正在使用mysql-workbench,你可以右键单击表资源管理器,然后单击“发送到SQL编辑器->选择所有语句”。

它会发送一条语句,比如“Select col1, col2,…”从表”。

然后删除那些你不需要的。

下面是生成在查询中使用的列的列表(不是自动查询,因为这没有指定):

SELECT 
    GROUP_CONCAT(
        CONCAT('`', `COLUMN_NAME`, '`')
        SEPARATOR ',\n'
    ) AS `cols`
FROM information_schema.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'db'
AND `TABLE_NAME` = 'table_name_here'
AND `COLUMN_NAME` NOT IN ('exclude_col1', 'exclude_col2')

会产生:

`included_col1`,
`included_col2`,
`included_col3`

然后你可以复制这个在查询中使用:

SELECT
    `included_col1`,
    `included_col2`,
    `included_col3`
FROM db.table_name_here

总之,你不能这样做,但我不同意上面所有的评论,有“一些”情况下,你可以合法地使用* 当您创建一个嵌套查询以便从整个列表中选择一个特定的范围(例如分页)时,为什么要在外部选择语句中指定每一列,而您已经在内部选择语句中完成了呢?

在SQL Management Studio中,您可以展开对象资源管理器中的列,然后将columns树项拖到查询窗口中,以获得以逗号分隔的列列表。