如何获取JOIN操作后所有列的完整列表?
多JOIN查询结果列名的获取方法
当你用SELECT *执行多表JOIN后,想以表别名.列名的格式列出所有结果列,可以试试以下几种方法:
方法一:用EXPLAIN展开完整查询(MySQL适用)
执行带EXTENDED参数的EXPLAIN命令,再查看警告信息就能得到展开后的完整SELECT列表,包含表别名和列名:
EXPLAIN EXTENDED SELECT * FROM db1 db1 JOIN db2 db2 ON db1.id=db2.id JOIN db3 db3 ON db1.id=db3.id;
接着执行:
SHOW WARNINGS;
在返回结果的Message字段里,会看到被展开成db1.col1, db1.col2, db2.col1, ...格式的完整列列表,这就是SELECT *实际查询的所有列。
方法二:通过INFORMATION_SCHEMA拼接列名(通用方法)
直接从系统元数据表中读取各表的列名,拼接成表别名.列名的格式,适合提前知道表结构的场景:
SELECT CONCAT('db1.', COLUMN_NAME) AS full_column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名称' AND TABLE_NAME = 'db1' UNION ALL SELECT CONCAT('db2.', COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名称' AND TABLE_NAME = 'db2' UNION ALL SELECT CONCAT('db3.', COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名称' AND TABLE_NAME = 'db3';
注意替换语句中的你的数据库名称为实际库名,UNION ALL会保留所有列(包括重复列名),和SELECT *的结果列顺序、数量一致。
方法三:临时表+DESCRIBE(快速查看列名,无原表关联)
如果只需要列名(不需要原表别名对应),可以把查询结果存入临时表,再用DESCRIBE查看:
-- 创建临时表,LIMIT 0避免插入数据,只保留表结构 CREATE TEMPORARY TABLE temp_join_result AS SELECT * FROM db1 db1 JOIN db2 db2 ON db1.id=db2.id JOIN db3 db3 ON db1.id=db3.id LIMIT 0; -- 查看临时表结构 DESCRIBE temp_join_result;
这种方法的缺点是,当不同表有重复列名时,临时表会自动给列名加后缀(比如id变成id_1),无法直接对应到原表,适合快速确认列数量和类型的场景。
内容的提问来源于stack exchange,提问作者WoJ
相关产品推荐
相关产品推荐

