如何从 MySQL 的表中“选择 *”但省略某些列?

Posted

技术标签:

【中文标题】如何从 MySQL 的表中“选择 *”但省略某些列?【英文标题】:How can I "select *" from a table in MySQL but omit certain columns? 【发布时间】:2011-01-22 21:14:25 【问题描述】:

我有一个包含以下列的表格:

id,name,age,surname,lastname,catgory,active

代替:SELECT name,age,surname,lastname,catgory FROM table

我怎样才能做出这样的事情:SELECT * FROM table [but not select id,active]

【问题讨论】:

Select all columns except one in mysql?的可能重复 @tstenner 是的,我相信这是您链接到的那个的副本。虽然这个没有答案,但我相信这个有 donl 给出的更好、更准确的answer。 【参考方案1】:

虽然许多人说最好明确列出要返回的每一列,但在某些情况下,您可能希望节省时间并从结果中省略某些列(例如测试)。下面我给出了解决这个问题的两个选项。

1.创建一个检索所有所需列名的函数:(我创建了一个名为函数的架构来保存此函数)

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `getTableColumns`(_schemaName varchar(100), _tableName varchar(100), _omitColumns varchar(200)) RETURNS varchar(5000) CHARSET latin1
BEGIN
    SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns 
    WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,_omitColumns) = 0 ORDER BY ORDINAL_POSITION;
END

创建并执行select语句:

SET @sql = concat('SELECT ', (SELECT 
functions.getTableColumns('test', 'employees', 'age,dateOfHire')), ' FROM test.employees'); 
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

2。或者不写函数你可以:

SET @sql = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM 
information_schema.columns WHERE table_schema = 'test' AND table_name = 
'employees' AND column_name NOT IN ('age', 'dateOfHire')), 
' from test.eployees');  
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

*将 test 替换为您自己的架构名称

**用你自己的表名替换员工

***将 age,dateOfHire 替换为您要省略的列(您可以将其留空以返回所有列或只输入一个列名以省略)

** **您可以在函数中调整varchars的长度以满足您的需求

【讨论】:

别忘了增加group_concat_max_len,你的列可能会被截断。设置会话 group_concat_max_len = 20480 如果您测试此 sql,您可能需要为测试添加一些 LIMIT。例如。 ' from test.employees LIMIT 100'。例如。在 phpmyadmin 中显示 - 没有限制,这将在大表上超时,准备显示。然后删除该限制以进行最终处理。 将结果存储到表中可能很有用。例如,我这样做是为了导出一个没有 ID 的表(通过导出 temptable 代替)。 SET @sql = CONCAT('CREATE TABLE temptable SELECT '...【参考方案2】:

我知道的唯一方法是枚举您想要的每一列...没有我知道的负面过滤器。

select name, age, surname, lastname, category from table

【讨论】:

【参考方案3】:

你不能这样做,对不起。实际上,如果可以的话,您不应该这样做 - 明确指定这些东西总是更好,假设其他开发人员添加了新字段并且您的应用程序将失败

【讨论】:

【参考方案4】:

你太先进了。

我见过的唯一支持您的语法的数据语言是具有“...ALL BUT ...”结构的 D 语言:

Wikipedia - D Language Specification

有一些参考实现可用,但主要用于教学目的。

【讨论】:

【参考方案5】:

除非在 MySql 中有一些特殊的扩展,否则你不能这样做。你要么得到所有,要么必须明确说明你想要什么。最佳做法是始终命名列,因为即使基础表发生更改,这也不会改变查询行为。

【讨论】:

【参考方案6】:

没有支持的 SQL 语法:

select * from table but not select id,active

如果您想要除一列或多列之外的所有列,则必须明确定义所需列的列表。

【讨论】:

【参考方案7】:

无论如何,您都不应该使用 select *。枚举您想要的列并且只枚举您想要的列,这是最佳做法。

【讨论】:

【参考方案8】:

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), ',', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '' AND TABLE_SCHEMA = ''), ' FROM ');

从@sql 准备stmt1; 执行 stmt1;

【讨论】:

在为已有答案的旧问题添加答案时,请说明您的答案有何不同,以及在什么情况下您的答案可能更可取。谢谢。【参考方案9】:

我相当肯定你不能。可能我能想到的最好方法是创建SELECT name, age, surname, lastname, category FROM table 作为视图,然后创建SELECT * FROM view。无论如何,我更喜欢始终从视图中进行选择。

但是,正如其他人指出的那样,如果将另一列添加到视图中,您的应用程序可能会失败。在某些系统上也是如此(PostgreSQL 是候选系统),如果不先删除视图就无法更改表,因此它变得有点麻烦。

【讨论】:

【参考方案10】:

如果原因是为了避免列重复错误而不必指定一长串列:

    暂时更改重复列的名称以创建视图。

    从选择并保存视图中删除重复的列

    重命名更改的列名

如果原因只是为了省略一列或多列:

    创建视图并从选择中删除列

【讨论】:

以上是关于如何从 MySQL 的表中“选择 *”但省略某些列?的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含日期时间列的表中获取某些行和“先前”行?

如何从 MySQL 中的表中删除列

需要 Python 3.7 中的 Mysql 查询以从具有列 (table_no, is_new) 的表中选择记录

如何从 MySQL 表中选择消息列表?

我想从两个表中选择某些列,并创建一个连接到第三个表

如何使用列号从 MySQL 中的表中删除列