Получить все имена таблиц конкретной базы данных по запросу SQL?


304

Я работаю над приложением, которое может работать с несколькими серверами баз данных, такими как «MySQL» и «MS SQL Server».

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

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

Но он дает имена таблиц всех баз данных конкретного сервера, но я хочу получить имена таблиц только выбранной базы данных. Как я могу ограничить этот запрос, чтобы получить таблицы конкретной базы данных?


1
Для Mysql вы можете сделать просто. ПОКАЗАТЬ СТОЛЫ;
Ашиш Гупта

Ответы:


500

Вероятно, из-за того, как разные базы данных sql работают со схемами.

Попробуйте следующее

Для 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-сервера. Если вы не используете БД , результат не будет отображаться, даже если в этой БД есть таблицы.
Барнс

2
Для Mysql вы можете сделать просто. ПОКАЗАТЬ СТОЛЫ;
Ашиш Гупта

Запись SQL Server прекрасно работает без USE dbName GOпрефикса на Server 2014.
Ммм,

1) Вы предложили то же самое для SQL Server и MySQL 2) INFORMATION_SCHEMA.TABLES существует только в MySQL 3) Мне действительно интересно, почему у вас так много голосов за это ...
Apostolos

82

Украдено отсюда :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
Скорее всего, SELECT Name FROM sys.Tables, где is_ms_shipped = 0
om471987

1
это зависит от поставщика базы данных и не совместимо с ANSI SQL.
cjb110

1
В качестве альтернативы, SELECT * FROM yourdbname.sys.Tables; если вы предпочитаете быть более кратким. Работает в SQL Server, по крайней мере.
Бакминст

29

Следующий запрос выберет все Tablesв базе данных с именем DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

НЕТ, это только часть сепаратора. Вы можете изменить на другое. Это не синтаксис T-SQL.
anishMarokey

1
ИСПОЛЬЗОВАТЬ DatabaseSample SELECT * FROM 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
Дипа М.Г.

Это MySQL, вопрос помечен MSSQL-сервером
Melle

@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, то ВЫБОР TABLE_NAME без одновременного выбора TABLE_SCHEMA может иметь ограниченную выгоду, поэтому я предположил, что при использовании MS SQL Server нас интересуют таблицы, принадлежащие известной схеме.

Я проверил приведенный выше запрос с SQL Server Management Studio, используя мою базу данных SQL Server, и с MySQL Workbench, используя базу данных MySQL, и в обоих случаях он дает имена таблиц.

Запрос объединяет два разных запроса Майкла Бэйлона в один, который затем может выполняться для любого типа базы данных. Первая часть предложения WHERE работает с базами данных MySQL, а вторая часть (после OR) - с базами данных 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, поскольку все движки БД по-разному реализуют словарь данных. Это можно абстрагировать, используя jdbc / odbc и язык 3GL, такой как C / Java / C #, если это является программным требованием, что, безусловно, возможно, если у вас разные реализации для каждой базы данных. Оператор должен уточнить свои требования ...
каякпим

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 (PL / SQL) ниже приведен код, работающий для получения списка всех существующих таблиц в нашей БД.

select * from tab;

и

select table_name from tabs;

оба работают. давайте попробуем найти ваше.


0

Просто получите всю информацию о imptanat с этим ниже 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.