如何列出表格中的所有列?


231

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


4
应该有一个徽章来写一个已关闭但却收到100多个投票的问题:) OTOH,没有疑问的答案是毫无疑问的,因为它询问了多个数据库,因此我不会不同意关闭的决定。很高兴在这里问答。
ToolmakerSteve

Answers:


255

对于MySQL,请使用:

DESCRIBE name_of_table;

只要您使用的是SQL * Plus或Oracle的SQL Developer,这对Oracle也适用。


16
此解决方案是针对MYSQL而非MSSQL的
Hammad Khan

2
@dmvianna我认为这不一定适用于所有Oracle,但适用于SQL * Plus。
Tripp Kinetics 2014年

它应该是DESCRIBE name_of_table``;
beahacker

对于sqlite-使用:pragma table_info(table_name)即sqlite> pragma table_info(column1);
陀螺仪

由于DESCRIBE不是Oracle PLSQL指令,而是SQL * Plus命令,因此进行编辑,因此在大多数SQL IDE中均不起作用。
沃伦

117

对于Oracle(PL / SQL)

SELECT column_name
FROM user_tab_cols
WHERE table_name = 'myTableName'

对于MySQL

SHOW COLUMNS FROM table_name

4
您可能想按column_id订购Oracle查询
David Aldridge

6
对于Oracle也有效DESCRIBE name_of_table
Pigueiras

使用<database_name>; 在<table_name>中显示列,例如'<column_prefix>%'; 将只列出以指定前缀开头的列。当然省略尖括号。
rstackhouse 2014年

是什么user_tab_cols在你的查询?
Jogi

@Jogi-Google“ oracle user_tab_cols”-它内置于Oracle数据库。
ToolmakerSteve

103

对于MS SQL Server:

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

9
这里感兴趣的列将是COLUMN_NAME。
Buggieboy

4
这应该适用于许多DBMS。information_schema.columns系统视图是 ANSI SQL标准(link)的一部分。
Bogdan Sahlean

4
好的答案,但要避免重复,我会使用:select COLUMN_NAME from information_schema.columns where table_name = 'tableName' and table_schema = 'databaseName'
billynoah 2015年

这是SQL-92 ANSI兼容的,应该在所有数据库引擎中都可以使用。
Gareth Davidson

39

(5年后,为了获得PostgreSQL的荣誉,王国最先进的DDBB)

在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 2015年

36

我知道已经晚了,但是我将以下命令用于Oracle:

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


我在Oracle中尝试了此方法,但没有成功。column_name已打印,但仅此而已。我不得不使用SELECT CAST(COLUMN_NAME AS CHAR(40))|| ''|| DATA_TYPE以获取一种不错的格式并获取具有串联的多个列。
Eamonn Kenny

27

SQL服务器

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的数据库上工作。


这些都不是针对MS SQL Server编写的(或者至少是隐含的,如我所读)。在这两种情况下,表名称列存储的名字没有任何[ ]周围,所以查询必须不使用它们,只有简单的表名。如果那不是OP的意图,至少要意识到这一点。
JonBrave

1
@JonBrave-没错,方括号在那里暗示“在此处插入您的表名” :)
Russ Cam

作为方括号,我将其读为“ 在此处将您的表名插入方括号内(由于可能有保留字),然后没有匹配项:)也许BNF <Table Name>可以避免歧义。无论如何,我意识到您在写评论时可能已经打算---以防万一,警告其他人也无害。
JonBrave

1
仅当没有'[]'并且表名周围需要加引号''时,才适用于MSSQL。
XValidated


12

Microsoft SQL Server管理Studio 2008 R2:

在查询编辑器中,如果突出显示表名的文本(例如dbo.MyTable)并按ALT+ F1,则将获得列名,类型,长度等的列表。

ALT+ F1当您突出显示时dbo.MyTable,相当于按照此网站运行EXEC sp_help 'dbo.MyTable'

我无法获得有关查询INFORMATION_SCHEMA.COLUMNS的各种信息,因此我改用它。


1
在SSMS 2012中不起作用。顺便说一句,您是指SQL Server Management Studio 2008吗?
Hammad Khan 2013年

1
是的,更确切地说,我指的是Microsoft SQL Server Management Studio 2008 R2。我会编辑。
Leslie Sage 2013年

4

SQL服务器

要列出数据库的所有用户定义表:

use [databasename]
select name from sysobjects where type = 'u'

列出表的所有列:

use [databasename]
select name from syscolumns where id=object_id('tablename')

?这是错误的...您只能对数据库使用USE ...并且查询返回数据库中所有用户定义的表,这不是OP想要的。
马克西米利安·梅耶


3

只需对SQL Server中的其他文件进行一些更正(模式前缀变得越来越重要!):

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

3

例:

select Table_name as [Table] , column_name as [Column] , Table_catalog as [Database], table_schema as [Schema]  from information_schema.columns
where table_schema = 'dbo'
order by Table_name,COLUMN_NAME

只是我的代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.