Làm thế nào để tôi liệt kê tất cả các cột trong một bảng?


231

Đối với các hệ thống cơ sở dữ liệu phổ biến khác nhau, làm thế nào để bạn liệt kê tất cả các cột trong một bảng?


4
Cần có một huy hiệu để viết một câu hỏi đã bị đóng, nhưng nhận được hơn 100 lượt upvote :) OTOH, không có gì đáng ngạc nhiên khi không có câu trả lời được chấp nhận, vì nó hỏi về nhiều cơ sở dữ liệu, vì vậy tôi không đồng ý với quyết định đóng . Chỉ vui vì Q & A ở đây.
ToolmakerSteve

Câu trả lời:


254

Đối với MySQL, sử dụng:

DESCRIBE name_of_table;

Điều này cũng hoạt động với Oracle miễn là bạn đang sử dụng SQL * Plus hoặc Nhà phát triển SQL của Oracle.


16
Giải pháp này dành cho MYSQL chứ không phải MSSQL
Hammad Khan

2
@dmvianna Tôi không nghĩ rằng điều đó nhất thiết phải áp dụng cho tất cả Oracle, nhưng với SQL * Plus.
Động học Tripp

Nó phải là DESCRIBE name_of_table``;
beahacker

đối với sqlite - sử dụng: pragma table_info (tên_bảng) tức là sqlite> pragma table_info (cột1);
GyRo

Chỉnh sửa, vì DESCRIBEkhông phải là lệnh Oracle PLQuery mà là lệnh SQL * Plus và do đó, nó không hoạt động trong hầu hết các IDE SQL.
walen

117

Dành cho Oracle (PL / SQL)

SELECT column_name
FROM user_tab_cols
WHERE table_name = 'myTableName'

Dành cho MySQL

SHOW COLUMNS FROM table_name

4
Bạn có thể muốn đặt hàng truy vấn Oracle theo cột_id
David Aldridge

6
Đối với Oracle cũng hợp lệ DESCRIBE name_of_table.
Pigueiras

sử dụng <cơ sở dữ liệu>; hiển thị các cột trong <tên_bảng> như '<cột_prefix>%'; Sẽ chỉ cho phép bạn liệt kê các cột bắt đầu bằng tiền tố được chỉ định. Bỏ qua các dấu ngoặc góc của khóa học.
rstackhouse

những gì là user_tab_colstrong truy vấn của bạn?
Jogi

@Jogi - Google "oracle user_tab_cols" - được tích hợp sẵn trong Oracle db.
ToolmakerSteve

103

Đối với máy chủ MS SQL:

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

8
Cột quan tâm ở đây sẽ là COLUMN_NAME.
Buggieboy

4
Điều này sẽ làm việc trên nhiều DBMS. information_schema.columnsxem hệ thống là một phần của ANSI SQLtiêu chuẩn ( liên kết ).
Bogdan Sahlean

3
câu trả lời hay nhưng để tránh trùng lặp tôi sẽ sử dụng:select COLUMN_NAME from information_schema.columns where table_name = 'tableName' and table_schema = 'databaseName'
billynoah

Đây là SQL-92 ANSI tuân thủ và phải hoạt động trong tất cả các công cụ cơ sở dữ liệu.
Gareth Davidson

39

(5 năm trễ, vì Danh dự của PostgreSQL, DDBB tiên tiến nhất của Vương quốc)

Trong PostgreSQL:

\d table_name

Hoặc, sử dụng SQL:

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

4
nên là \ d tên_bảng. \ dt tên_bảng liệt kê các mối quan hệ.
l85m

36

Tôi biết là muộn nhưng tôi sử dụng lệnh này cho Oracle:

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


Tôi đã thử điều này trong Oracle và nó không hoạt động. Cột_name đã được in nhưng không có gì khác. Tôi đã phải sử dụng CHỌN CAST (COLUMN_NAME AS CHAR (40)) || '' || DATA_TYPE để có được một định dạng đẹp và thu được nhiều cột với cách ghép.
Eamonn Kenny

27

Máy chủ 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'

hoặc là

SELECT 
    COLUMN_NAME 
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_NAME  = 'Table_Name'

Cách thứ hai là một tiêu chuẩn ANSI và do đó sẽ hoạt động trên tất cả các cơ sở dữ liệu tuân thủ ANSI.


Cả hai đều không hoạt động như được viết (hoặc ít nhất là ngụ ý, khi tôi đọc nó) cho MS SQL Server. Trong cả hai trường hợp, cột tên bảng lưu trữ tên mà không có bất kỳ [ ]xung quanh nó, vì vậy truy vấn không được sử dụng chúng, chỉ có tên bảng đơn giản. Nếu đó không phải là ý định của OP, ít nhất hãy nhận thức được điều này.
JonBrave

1
@JonBrave - không chính xác, dấu ngoặc vuông có ở đó để ngụ ý "chèn tên bảng của bạn vào đây" :)
Russ Cam

Là dấu ngoặc vuông, tôi đọc nó là " chèn tên bảng của bạn vào dấu ngoặc vuông (vì từ có khả năng dành riêng) ở đây ", và sau đó không có kết quả trùng khớp :) Có lẽ BNF <Table Name>sẽ tránh được sự mơ hồ. Dù sao, tôi nhận ra bạn có thể có ý định rằng khi tôi viết bình luận --- không có hại gì để cảnh báo người khác chỉ trong trường hợp.
JonBrave

1
Chỉ hoạt động cho MSSQL nếu không có '[]' và dấu ngoặc kép '' là cần thiết xung quanh tên bảng.
XValidated


12

Studio quản lý máy chủ Microsoft SQL 2008 R2:

Trong trình chỉnh sửa truy vấn, nếu bạn tô sáng văn bản của tên bảng (ex dbo.MyTable) và nhấn ALT+F1 , bạn sẽ nhận được danh sách tên cột, loại, độ dài, v.v.

ALT+ F1trong khi bạn nhấn mạnh dbo.MyTablelà tương đương với việc chạyEXEC sp_help 'dbo.MyTable' theo trang web này

Tôi không thể có được các biến thể khi truy vấn Information_SCHema.COLUMNS để hoạt động, vì vậy tôi sử dụng thay thế này.


1
Không hoạt động trong SSMS 2012. Btw có nghĩa là SQL Server Management Studio 2008?
Hammad Khan

1
Đúng, chính xác hơn tôi có nghĩa là Microsoft SQL Server Management Studio 2008 R2. Tôi sẽ chỉnh sửa.
Leslie Sage

4

Máy chủ SQL

Để liệt kê tất cả các bảng do người dùng xác định của cơ sở dữ liệu:

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

Để liệt kê tất cả các cột của bảng:

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

Hả? Điều này là sai ... bạn chỉ có thể sử dụng USE cho cơ sở dữ liệu ... Và truy vấn trả về tất cả các bảng do người dùng xác định trong cơ sở dữ liệu, đây không phải là điều OP muốn.
Maximilian Mayerl

4

Đối với máy chủ SQL

sp_help tablename

3

Chỉ cần sửa một chút cho những người khác trong SQL Server (tiền tố lược đồ đang trở nên quan trọng hơn!):

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

3

Thí dụ:

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

Chỉ là mã của tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.