รับชื่อตารางทั้งหมดของฐานข้อมูลเฉพาะโดยแบบสอบถาม SQL?


304

ฉันกำลังทำงานกับแอพพลิเคชั่นซึ่งสามารถจัดการกับเซิร์ฟเวอร์ฐานข้อมูลหลายตัวเช่น "MySQL" และ "MS SQL Server"

ฉันต้องการรับชื่อตารางของฐานข้อมูลเฉพาะโดยใช้แบบสอบถามทั่วไปซึ่งควรเหมาะกับฐานข้อมูลทุกประเภท ฉันได้ลองทำดังนี้

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

แต่จะให้ชื่อตารางของฐานข้อมูลทั้งหมดของเซิร์ฟเวอร์เฉพาะ แต่ฉันต้องการรับชื่อตารางของฐานข้อมูลที่เลือกเท่านั้น ฉันจะ จำกัด คิวรีนี้เพื่อรับตารางของฐานข้อมูลเฉพาะได้อย่างไร


1
สำหรับ Mysql คุณสามารถทำได้ง่ายๆ ตารางแสดง;
Ashish Gupta

คำตอบ:


500

อาจเป็นเพราะวิธีการที่แตกต่างกัน sql dbms จัดการกับสกีมา

ลองทำสิ่งต่อไปนี้

สำหรับ SQL Server:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='dbName'

สำหรับ MySQL:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' 

สำหรับ Oracle DBA_TABLESผมคิดว่าเทียบเท่าจะใช้


3
ฉันชอบวิธีนี้เมื่อฉันมี schemata ตารางที่แตกต่างกันภายในหนึ่งฐานข้อมูล (SQL Server): เลือก CONCAT (TABLE_SCHEMA, TABLE_NAME ' ') จาก INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'ตารางฐาน' และ TABLE_CATALOG =' MyDB'
Verena Haunschmid

3
เราจะต้องใช้ฐานข้อมูลนั้นเพื่อรับข้อมูล USE dbName GOสำหรับ SQL-Server หากคุณไม่ได้ใช้DBผลลัพธ์จะไม่ปรากฏแม้ว่าจะมีตารางอยู่ในฐานข้อมูลนั้นก็ตาม
barnes

2
สำหรับ Mysql คุณสามารถทำได้ง่ายๆ ตารางแสดง;
Ashish Gupta

รายการ SQL Server ทำงานได้ดีสำหรับฉันโดยไม่มีUSE dbName GOคำนำหน้าบน Server 2014
Mmm

1) คุณได้แนะนำสิ่งเดียวกันสำหรับ SQL Server และ MySQL 2) Information_SCHEMA.TABLES นั้นมีเฉพาะใน MySQL 3) ฉันสงสัยจริงๆว่าทำไมคุณถึงมี upvotes มากมายสำหรับเรื่องนี้ ...
Apostolos

82

ถูกขโมยจากที่นี่ :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
ชื่อ SELECT ที่น่าจะเป็นไปได้มากที่สุดจาก sys.Tables โดยที่ is_ms_shipped = 0
om471987

1
นี่เป็นเฉพาะผู้ให้บริการฐานข้อมูลและไม่รองรับ ANSI SQL
cjb110

1
อีกวิธีหนึ่งคือ SELECT * จาก yourdbname.sys.Tables หากคุณต้องการที่จะกระชับมากขึ้น ทำงานได้ใน SQL Server เป็นอย่างน้อย
buckminst

29

แบบสอบถามต่อไปนี้จะเลือกทั้งหมดTablesในฐานข้อมูลชื่อDBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

ไม่มันเป็นส่วนแยกเท่านั้น คุณสามารถเปลี่ยนเป็นอื่นได้ไม่ใช่ไวยากรณ์ T-SQL
anishMarokey

1
ใช้ฐานข้อมูลตัวอย่างเลือก * จาก sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

เราสามารถจัดการได้โดยไม่ต้องอยู่ในสถานที่ของคุณสามารถใช้อัฒภาคGO;


3
สำหรับ SQL Server บน Azure สิ่งนี้ใช้ได้สำหรับฉัน แต่คำตอบที่ยอมรับไม่ได้ ขอบคุณ
โยนาห์


10

ใน mysql ให้ใช้:

SHOW TABLES;

หลังจากเลือก DB ด้วย:

USE db_name

Osm ,,, swt n short
Deepa MG

นี่คือ MySQL, คำถามที่ถูกแท็กปัญญาเซิร์ฟเวอร์ MSSQL
เมลลี่

@Melle ดูคำอธิบายของคำถาม
Lorenzo Lerate

นี่ไม่ใช่คำตอบที่ดีที่สุดดูความคิดเห็นของฉันภายใต้คำตอบที่ยอมรับ (และถูกต้อง)
Chiwda



2
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go

โอกาสใดที่คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่คุณหมายถึง อาจอธิบายได้ไหม
Alex K

1
Exec sp_MSforeachtable 'Select ''?'''

สวัสดี Amirreza ฉันเชื่อว่าคุณกำลังพูดถึงsp_MSforeachtable?
bummi

@bummi: ใช่ดีขอบคุณสำหรับความสนใจและขอโทษที่พิมพ์ผิด แก้ไขแล้ว
Amir Keshavarz

1
USE dbName;

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_SCHEMA = 'dbName' OR TABLE_SCHEMA = 'schemaName')
ORDER BY TABLE_NAME

หากคุณกำลังทำงานกับหลาย schemata บนเซิร์ฟเวอร์ MS SQL ดังนั้น SELECT-ing TABLE_NAME โดยไม่ต้องเลือก TABLE_SCHEMA อาจมีประโยชน์ จำกัด พร้อมกันดังนั้นฉันคิดว่าเราสนใจตารางที่อยู่ใน schema ที่รู้จักเมื่อใช้ MS SQL Server

ฉันได้ทดสอบแบบสอบถามข้างต้นกับ Studio จัดการเซิร์ฟเวอร์ SQL โดยใช้ฐานข้อมูล SQL Server ของฉันและกับ MySQL Workbench โดยใช้ฐานข้อมูล MySQL และในทั้งสองกรณีจะให้ชื่อตาราง

คิวรีสืบค้นข้อความค้นหาที่แตกต่างกันสองรายการของไมเคิลเบย์ลอนเป็นหนึ่งคำถามที่สามารถเรียกใช้กับฐานข้อมูลทั้งสองประเภทได้ ส่วนแรกของส่วนคำสั่ง WHERE ทำงานบนฐานข้อมูล MySQL และส่วนที่สอง (หลังจาก OR) ทำงานบนฐานข้อมูล MS SQL Server มันน่าเกลียดและมีเหตุผลเล็กน้อยที่ไม่ถูกต้องเนื่องจากมันสมมติว่าไม่มีสกีมาที่ไม่พึงประสงค์ที่มีชื่อเดียวกันกับฐานข้อมูล สิ่งนี้อาจช่วยให้ใครบางคนที่กำลังมองหาหนึ่งแบบสอบถามเดียวที่สามารถทำงานบนเซิร์ฟเวอร์ฐานข้อมูลอย่างใดอย่างหนึ่ง


1

อัพเดตสำหรับเวอร์ชั่นล่าสุดของ MSSQL SERVER (17.7)

SELECT name FROM sys.Tables WHERE type_desc = 'USER_TABLE'

หรือSELECT *รับคอลัมน์ทั้งหมด


ฉันเพิ่งรู้ว่าแบบสอบถามนี้ให้ผลที่ไม่ถูกต้องสำหรับตัวละครที่ไม่ใช่ภาษาอังกฤษในชื่อตารางในขณะที่ Michael Baylon ให้ผลลัพธ์ที่ถูกต้อง (ตัวละครเป็นตัวพิมพ์เล็กภาษาตุรกี "ı")
onur demir

1

วิธีเลือกแบบสอบถามฐานข้อมูลด้านล่าง:

use DatabaseName

ตอนนี้

SELECT * FROM INFORMATION_SCHEMA.TABLES

ตอนนี้คุณสามารถดูตารางที่สร้างด้านล่างในคอนโซล

PFA

สอบถาม


0

ใช่ oracle คือ:

select * from user_tables

นั่นคือถ้าคุณต้องการเพียงวัตถุที่เป็นเจ้าของโดยเข้าสู่ระบบuser/schemaมิฉะนั้นคุณสามารถใช้all_tablesหรือdba_tablesซึ่งรวมถึงตารางระบบ


พวกเขากำลังมองหาข้อความค้นหาข้ามผู้ให้บริการไม่ใช่ผู้ให้บริการเฉพาะ
cjb110

ไม่มีวิธีที่สอดคล้องกันในการทำเช่นนี้จาก sql เนื่องจากเอ็นจิน db ทั้งหมดใช้พจนานุกรมข้อมูลต่างกัน อาจเป็นไปได้ที่จะสรุปสิ่งนี้โดยใช้ jdbc / odbc และภาษา 3GL เช่น C / Java / C # หากนี่เป็นข้อกำหนดของโปรแกรมซึ่งอาจเป็นไปได้หากคุณมีการใช้งานที่แตกต่างกันสำหรับแต่ละฐานข้อมูล สหกรณ์ควรชี้แจงความต้องการของพวกเขา ...
kayakpim

0

จากคำตอบของ Michael Baylon ฉันต้องการรายการซึ่งรวมถึงข้อมูล schema ด้วยและนี่คือวิธีที่ฉันแก้ไขแบบสอบถามของเขา

SELECT TABLE_SCHEMA + '.' + TABLE_NAME as 'Schema.Table'
  FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'dbName'
  ORDER BY TABLE_SCHEMA, TABLE_NAME

0

ใน Oracle DB ของเรา (PL / SQL) ด้านล่างโค้ดทำงานเพื่อรับรายการของตารางที่มีอยู่ทั้งหมดในฐานข้อมูลของเรา

select * from tab;

และ

select table_name from tabs;

ทั้งสองกำลังทำงานอยู่ ลองและค้นหาของคุณ


0

รับข้อมูล improtanat ทั้งหมดด้วย SQL ด้านล่างใน Mysql

    SELECT t.TABLE_NAME , t.ENGINE , t.TABLE_ROWS ,t.AVG_ROW_LENGTH, 
t.INDEX_LENGTH FROM 
INFORMATION_SCHEMA.TABLES as t where t.TABLE_SCHEMA = 'YOURTABLENAMEHERE' 
order by t.TABLE_NAME ASC limit 10000;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.