如何列出表中的所有列?

315

对于各种常见的数据库系统,如何列出表中的所有列?


这是响应 https://dev59.com/Lmoy5IYBdhLWcg3wKq0S#8739400 - KaderLAB
13个回答

354

对于MySQL,请使用:

DESCRIBE name_of_table;

只要你使用 SQL*Plus 或者 Oracle 的 SQL Developer,这个方法同样适用于 Oracle。


27
此解决方案适用于MYSQL而非MSSQL。 - TheTechGuy
2
@dmvianna 我认为这并不适用于所有的Oracle,而是只适用于SQL*Plus。 - Tripp Kinetics
应该是 DESCRIBE name_of_table``; - beahacker
2
使用sqlite时,可以使用以下命令:pragma table_info(table_name),例如:sqlite> pragma table_info(column1); - GyRo
编辑,因为DESCRIBE不是Oracle PLSQL指令,而是SQL*Plus命令,因此在大多数SQL IDE中无法使用。 - walen

159

对于 MS SQL Server:

select COLUMN_NAME from information_schema.columns where table_name = 'tableName'

9
这里感兴趣的列是COLUMN_NAME。 - Buggieboy
4
这应该适用于许多数据库管理系统。information_schema.columns 系统视图是 ANSI SQL 标准的一部分(链接)。 - Bogdan Sahlean
7
为了避免重复,我建议使用以下查询语句:select COLUMN_NAME from information_schema.columns where table_name = 'tableName' and table_schema = 'databaseName'。该语句可用于检索指定数据表在指定数据库中的所有列名。 - But those new buttons though..
这是符合SQL-92 ANSI标准的,应该在所有数据库引擎中都能正常工作。 - Gareth Davidson

154

对于Oracle (PL/SQL)

SELECT column_name
FROM user_tab_cols
WHERE table_name = 'myTableName'

对于MySQL

SHOW COLUMNS FROM table_name

5
您可能希望按column_id对Oracle查询进行排序。 - David Aldridge
8
Oracle中DESCRIBE name_of_table也是有效的。 - Pigueiras
使用<database_name>;命令可以选择数据库。 使用show columns in <table_name> like '<column_prefix>%'; 命令可以列出以指定前缀开头的列。当然,不需要输入尖括号。 - rstackhouse
1
你的查询中的 user_tab_cols 是什么意思? - Jogi
@Jogi - 在谷歌上搜索“oracle user_tab_cols”- 它是Oracle数据库内置的。 - ToolmakerSteve
请注意,在查询结果中您可能会看到像 SYS_NC00064$这样的列。当您在表上创建索引时,数据库会自动向表中添加系统生成的列以支持索引和搜索。这些列以 SYS_NC 开头,后跟一个数字值。您可以通过在查询中添加 AND column_name not like 'SYS%' 来过滤掉这些列。 - Jacob van Lingen

63

五年后,为了荣誉PostgreSQL——王国最先进的数据库

在PostgreSQL中:

\d table_name

或者,使用 SQL:

select column_name, data_type, character_maximum_length
    from INFORMATION_SCHEMA.COLUMNS 
    where table_name = 'table_name';

4
应该使用\d table_name命令来查看表格。而\dt table_name命令则用于列出相关的关系。 - l85m
第二个查询也适用于MS SQL。我使用它是因为它添加了两个我想要的重要变量,这些变量不在ms sql的答案中。 - Trevor Vance

42

我知道现在已经很晚了,但是我使用这个命令来操作Oracle:

select column_name,data_type,data_length from all_tab_columns where TABLE_NAME = 'xxxx' AND OWNER ='xxxxxxxxxx'

https://dev59.com/Lmoy5IYBdhLWcg3wKq0S#8739400 - zloctb
我在Oracle中尝试了这个,但它没有起作用。列名被打印出来了,但没有其他内容。我必须使用SELECT CAST(COLUMN_NAME AS CHAR(40)) || ' ' || DATA_TYPE才能获得漂亮的格式并获得多列连接。 - Eamonn Kenny
如果查询返回为空,请尝试使用大写字母,例如在此处:https://dev59.com/5HPYa4cB1Zd3GeqPoNxY#17364929 - Yogev Levy

32

SQL Server

SELECT 
    c.name 
FROM
    sys.objects o
INNER JOIN
    sys.columns c
ON
    c.object_id = o.object_id
AND o.name = 'Table_Name'
或者
SELECT 
    COLUMN_NAME 
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_NAME  = 'Table_Name'
第二种方法符合ANSI标准,因此应该适用于所有符合ANSI标准的数据库。

1
这两个代码片段都不能直接在 MS SQL Server 上运行(或者至少我是这样理解的)。在这两种情况下,表名列存储的名称是不带 [] 的,因此查询语句不能使用它们,只能使用纯表名。如果这不是 OP 的意图,请至少注意这一点。 - JonBrave
1
@JonBrave - 没错,方括号的作用是暗示“在这里插入你的表名” :) - Russ Cam
作为方括号,我将其解读为“在此处插入您的表名(由于可能是保留字)”,然后没有找到匹配项 :) 也许BNF <表名>可以避免歧义。无论如何,当我写下这条评论时,我意识到您可能已经打算这样做---提醒其他人以防万一并不会有任何损失。 - JonBrave
1
只有在表名没有 '[ ]' 的情况下才适用于 MSSQL,需要在表名周围加上引号 ' '。 - XValidated

21

MS SQL Server 中调用以下代码:

sp_columns [tablename]

13
Microsoft SQL Server Management Studio 2008 R2:
在查询编辑器中,如果您突出显示表名的文本(例如dbo.MyTable),然后按下ALT+F1,您将获得列名、类型、长度等列表。
在突出显示dbo.MyTable时按下ALT+F1相当于运行EXEC sp_help 'dbo.MyTable' 根据此网站
我无法使有关查询INFORMATION_SCHEMA.COLUMNS的变化起作用,所以我使用这个代替。

1
在SSMS 2012中无法工作。顺便问一下,你是不是指的SQL Server Management Studio 2008? - TheTechGuy
1
是的,更准确地说,我指的是 Microsoft SQL Server Management Studio 2008 R2。我会进行编辑。 - Leslie Sage

7

针对 SQL Server

sp_help tablename

5

在SQL Server中,其他人的一点纠正(架构前缀变得更加重要!):

SELECT name
  FROM sys.columns 
  WHERE [object_id] = OBJECT_ID(N'dbo.tablename');

Aaron, 感谢您将此选项添加到列表中。 以前我使用的是这段代码。 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table_Name'然而,它并不总是有效。 特别是在非常大的表格上,例如5000万行或更多。 不知道为什么。 您的选项在我尝试过的所有表格上都非常好用。 谢谢,并致敬。 - Aubrey Love

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接