这是不可能的; 不在纯 SQL 中。这不是 MySQL 的属性——其他 RDBMS-es 也不以这种方式提供查询元数据。
在纯 SQL 中最接近解决此问题的方法是将查询转换为视图,然后获取该视图的信息:
CREATE OR REPLACE VIEW _query
AS
SELECT login
FROM TableName
;
SELECT *
FROM information_schema.COLUMNS
WHERE table_schema = SCHEMA()
AND table_name = '_query'
;
这种方法的问题是视图名称必须是唯一的,因此具有多个并发用户的应用程序面临为视图提供唯一名称的挑战。这可以使用动态 sql:
SET @name = CONCAT(_query, connection_id())
, @stmt = CONCAT(
' CREATE VIEW '
, @name
, ' AS SELECT login FROM Tablename'
)
;
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT *
FROM information_schema.columns
WHERE table_schema = schema()
AND table_name = @name
;
最后,您可能应该在之后清理您的视图:
SET @stmt = CONCAT('DROP VIEW ', @name);
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
问题是,为什么在 SQL 中需要这个?通常,结果集元数据在 SQL 客户端中可用 - 通常驱动程序或客户端库在您准备 SQL 语句时提供此元数据。例如在 JDBC http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getMetaData ()