Отримати всі назви таблиць певної бази даних за запитом SQL?


304

Я працюю над додатком, який може працювати з декількома серверами баз даних, такими як "MySQL" та "MS SQL Server".

Я хочу отримати назви таблиць певної бази даних, використовуючи загальний запит, який повинен відповідати всім типам бази даних. Я спробував наступне:

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

Але це дає назви таблиць усіх баз даних певного сервера, але я хочу отримати імена таблиць лише для вибраних баз даних. Як я можу обмежити цей запит, щоб отримати таблиці певної бази даних?


1
Для Mysql можна зробити просто. ПОКАЗНИТЬ ТАБЛИЦІ;
Ашиш Гупта

Відповіді:


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
Я вважаю за краще це рішення , коли у мене є різний таблиця схем в межах однієї бази даних (SQL Server): SELECT CONCAT (TABLE_SCHEMA ,, TABLE_NAME '') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'базової таблиці' AND TABLE_CATALOG = 'MyDB'
Верена Haunschmid

3
Для отримання інформації потрібно використовувати саме цей БД . USE dbName GOдля SQL-сервера. Якщо ви не використовуєте БД , результат не відображатиметься, навіть якщо в цій БД є таблиці.
barnes

2
Для Mysql можна зробити просто. ПОКАЗНИТЬ ТАБЛИЦІ;
Ашиш Гупта

Запис на SQL Server для мене працює без USE dbName GOпрефікса на сервері 2014.
Ммм

1) Ви запропонували те саме, що і для SQL Server та MySQL 2) INFORMATION_SCHEMA.TABLES існує лише в MySQL 3) Мені дуже цікаво, як ви отримаєте стільки грошей за це ...
Апостолос

82

Вкрадено звідси :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
Найімовірніше, ВИБІРТЕ ім’я від sys.Tables де is_ms_shipped = 0
om471987

1
це конкретний постачальник баз даних, а не сумісний з ANSI SQL.
cjb110

1
В якості альтернативи, ВИБІРТИ * ВІД 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 це працювало для мене, але прийнята відповідь не відповіла. Дякую.
Йона

14

Просто поставте DATABASE NAMEперед INFORMATION_SCHEMA.TABLES:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'

10

У mysql використовуйте:

SHOW TABLES;

Після вибору БД за допомогою:

USE db_name

Osm ,,, swt n short
Deepa MG

Це MySQL, питання позначено дотепністю MSSQL-сервера
Мелле

@Melle Подивіться опис питання
Лоренцо Лерате

Це не найкраща відповідь, дивіться мій коментар під прийнятою (і правильною) відповіддю.
Chiwda



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

Будь-який шанс ви могли б трохи розібратися, що ви маєте на увазі під цим? Може, поясніть?
Алекс К


1
USE dbName;

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

Якщо ви працюєте з декількома схемами на сервері MS SQL, то SELECT-ing TABLE_NAME без одночасного вибору TABLE_SCHEMA може мати обмежену користь, тому я припустив, що нас цікавлять таблиці, що належать до відомої схеми при використанні MS SQL Server.

Я перевіряв вищезазначений запит у студії управління SQL Server за допомогою моєї бази даних SQL Server та з MySQL Workbench з використанням бази даних MySQL, і в обох випадках він дає назви таблиць.

Запит визначає два різних запити Майкла Бейлона на один, який може запускатися на будь-якому типі бази даних. Перша частина пункту WHERE працює на базах даних MySQL, а друга частина (після АБО) працює на базах даних MS SQL Server. Це некрасиво і логічно трохи некоректно, оскільки передбачає, що не існує небажаної схеми з такою ж назвою, що і база даних. Це може допомогти тому, хто шукає один єдиний запит, який може працювати на будь-якому сервері баз даних.


1

ОНОВЛЕННЯ ДЛЯ НАЙКРАЩОЇ ВЕРСІЇ сервера MSSQL (17.7)

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

Або SELECT *для отримання всіх стовпців.


Я щойно зрозумів, що цей запит дає неправильний результат для неанглійських символів у назві таблиці, тоді як Майкл Бейлон дає правильні результати. (персонаж був у турецькій мові з нижнього регістру "ı")
onur demir

1

Щоб вибрати запит до бази даних нижче:

use DatabaseName

Тепер

SELECT * FROM INFORMATION_SCHEMA.TABLES

Тепер ви можете побачити створені таблиці нижче в консолі.

PFA.

Запит


0

Так, оракул є:

select * from user_tables

Тобто, якщо ви хочете використовувати лише об'єкти, які належать увійшли до системи, user/schemaінакше ви можете використовувати all_tablesабо dba_tablesякі включають системні таблиці.


вони шукають крос-запити постачальника, не конкретні для постачальника.
cjb110

Немає послідовного способу зробити це з sql, оскільки всі db-механізми реалізують словник даних по-різному. Можливо, можна абстрагувати це за допомогою jdbc / odbc та мовою 3GL, такою як C / Java / C #, якщо це програмна вимога, безумовно, можливо, якщо у вас є інша реалізація для кожної бази даних. Оп повинен уточнити свої вимоги ...
kayakpim

0

На основі відповіді Майкла Бейлона, мені знадобився список, який також містив інформацію про схему, і ось я змінив його запит.

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

Просто отримайте всю невідповідну інформацію за допомогою цього нижче 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.