MySQL查询中如何实现排除特定字段的功能?

新手上路,请多包涵

Mysql库 查询 排除固定的某几个字段(如create_time,update_time这种) 因为有很多表 想将表名作为参数动态地查询 但这些表的其余字段又是不一致的 怎样建立查询语句可以固定排除这些不想要的字段呢

类似 SELECT * EXCEPT(a,b) FROM table 这样

阅读 539
3 个回答

🚀 MySQL: 实现 SELECT * EXCEPT (a, b) 的动态查询

MySQL 不支持 BigQuery 中 SELECT * EXCEPT (a, b) 这样的语法,但可以通过 动态 SQL + information_schema 来实现类似的功能。

实现思路

  1. 通过 information_schema.columns 获取指定表的所有字段名。
  2. 排除 不需要的字段,例如 create_timeupdate_time
  3. 拼接 成完整的 SELECT 语句,然后执行。

🧩 示例 SQL(适用于 MySQL)

假设要查询表 your_table排除字段 create_timeupdate_time

SELECT 
  GROUP_CONCAT(COLUMN_NAME) 
INTO @columns
FROM information_schema.columns
WHERE table_schema = 'your_database'
  AND table_name = 'your_table'
  AND COLUMN_NAME NOT IN ('create_time', 'update_time');

SET @sql = CONCAT('SELECT ', @columns, ' FROM your_table');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

🧠 针对有很多表

可以封装成一个 存储过程,传入表名作为参数,自动排除指定字段并执行查询。

完整 SQL:存储过程实现

DELIMITER $$

CREATE PROCEDURE SelectWithoutFields(
    IN db_name VARCHAR(64),
    IN tbl_name VARCHAR(64)
)
BEGIN
    DECLARE col_list TEXT;

    SELECT GROUP_CONCAT(COLUMN_NAME)
    INTO col_list
    FROM information_schema.columns
    WHERE table_schema = db_name
      AND table_name = tbl_name
      AND COLUMN_NAME NOT IN ('create_time', 'update_time');

    SET @sql = CONCAT('SELECT ', col_list, ' FROM ', db_name, '.', tbl_name);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END$$

DELIMITER ;

调用方式

CALL SelectWithoutFields('your_database', 'your_table');

第一种:动态 SQL(结合预处理语句)

SET @table_name = 'my_table'; -- 表名
SET @exclude_column = 'id,create_time,update_time'; -- 排除字段

SET @result_column = (SELECT group_concat(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table_name
  AND FIND_IN_SET(COLUMN_NAME, @exclude_column) = 0); -- 获取结果字段

SET @sql = CONCAT('SELECT ', @result_column, ' FROM ', @table_name); -- 拼接sql

PREPARE stmt FROM @sql; --  预编译
EXECUTE stmt; -- 执行
DEALLOCATE PREPARE stmt; -- 释放预编译

第二种:表名是动态的,其实字段也可以是动态的,查询通过程序判断。
比如将mysql中的INFORMATION_SCHEMA.TABLES(表和视图信息) 和 INFORMATION_SCHEMA.COLUMNS(字段信息) 存到redis缓存中,执行查询时判断表和字段是否存在。
https://blog.csdn.net/yilovexing/article/details/107068569

第三种:使用 select * 返回全部字段,结果通过程序过滤。

使用 INFORMATION_SCHEMA 动态生成查询

SET @sql = NULL;
SELECT 
  GROUP_CONCAT(COLUMN_NAME) INTO @sql
FROM 
  INFORMATION_SCHEMA.COLUMNS 
WHERE 
  TABLE_NAME = 'your_table' 
  AND TABLE_SCHEMA = 'your_database'
  AND COLUMN_NAME NOT IN ('field_to_exclude1', 'field_to_exclude2');

SET @sql = CONCAT('SELECT ', @sql, ' FROM your_table');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题