SQL 쿼리로 특정 데이터베이스의 모든 테이블 이름을 가져 옵니까?


304

"MySQL"및 "MS SQL Server"와 같은 여러 데이터베이스 서버를 처리 할 수있는 응용 프로그램을 작업 중입니다.

모든 데이터베이스 유형에 적합한 일반 쿼리를 사용하여 특정 데이터베이스의 테이블 이름을 가져 오려고합니다. 나는 다음을 시도했다.

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

그러나 특정 서버의 모든 데이터베이스의 테이블 이름을 제공하지만 선택한 데이터베이스의 테이블 이름 만 가져 오려고합니다. 특정 데이터베이스의 테이블을 가져 오려면이 쿼리를 어떻게 제한 할 수 있습니까?


1
MySQL의 경우 간단하게 할 수 있습니다. 쇼 테이블;
Ashish Gupta 0

답변:


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 서버)에서 다른 테이블 도식이있을 때이 솔루션을 선호 : INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = '기본 테이블'FROM SELECT CONCAT ( '.'TABLE_SCHEMA, TABLE_NAME) 및 TABLE_CATALOG = '보기 MyDB'
베레 Haunschmid

3
정보를 얻으려면 특정 DB 를 사용해야합니다 . USE dbName GOSQL- 서버용. DB를 사용하지 않으면 해당 DB 에 테이블이 있어도 결과가 표시되지 않습니다.
barnes

2
MySQL의 경우 간단하게 할 수 있습니다. 쇼 테이블;
Ashish Gupta 0

SQL Server 항목은 USE dbName GOServer 2014에 접두사가 없는 경우 제대로 작동합니다 .
Mmm

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에서 작동합니다.
buckminst

29

다음 쿼리는 Tables데이터베이스에서 모든 이름을 선택합니다 DBName.

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

아니오 부분 분리기입니다. T-SQL 구문이 아닙니다.
anishMarokey

1
데이터베이스 사용 SELECT * FROM sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

우리는 GO세미콜론을 사용할 수 있습니다 ;.


3
Azure의 SQL Server의 경우 이것이 효과가 있었지만 받아 들인 대답은 그렇지 않았습니다. 감사.
요나

14

그냥 DATABASE NAME앞에 넣어 INFORMATION_SCHEMA.TABLES:

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

10

mysql에서 다음을 사용하십시오.

SHOW TABLES;

다음을 사용하여 DB를 선택한 후 :

USE db_name

Osm ,,, swt n short
Deepa MG

이것은 MySQL입니다, 질문은 MSSQL 서버로 태그되었습니다
Melle

@Melle 질문에 대한 설명을보십시오
Lorenzo Lerate

이것은 최선의 답변이 아닙니다. 수락 된 (정확한) 답변 아래 내 의견을 참조하십시오.
Chiwda

6

나는이 대답을 보지 못했지만 이것이 내가하는 일이다.

SELECT name FROM databaseName.sys.Tables;


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

MS SQL 서버에서 여러 스키마를 사용하는 경우 동시에 TABLE_SCHEMA를 선택하지 않고 SELECT-ing TABLE_NAME을 사용하면 이점이 제한 될 수 있으므로 MS SQL Server를 사용할 때 알려진 스키마에 속하는 테이블에 관심이 있다고 가정했습니다.

필자의 SQL Server 데이터베이스를 사용하는 SQL Server Management Studio와 MySQL 데이터베이스를 사용하는 MySQL Workbench를 사용하여 위의 쿼리를 테스트했으며 두 경우 모두 테이블 이름을 제공합니다.

이 쿼리는 Michael Baylon의 두 가지 다른 쿼리를 하나의 데이터베이스 형식으로 실행할 수있는 쿼리로 구성합니다. WHERE 절의 첫 번째 부분은 MySQL 데이터베이스에서 작동하고 두 번째 부분 (OR 후)은 MS SQL Server 데이터베이스에서 작동합니다. 데이터베이스와 이름이 같은 원치 않는 스키마가 없다고 가정하기 때문에 추악하고 논리적으로 약간 잘못되었습니다. 이는 데이터베이스 서버에서 실행할 수있는 단일 쿼리를 찾는 사람에게 도움이 될 수 있습니다.


1

MSSQL 서버의 최신 버전 업데이트 (17.7)

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

또는 SELECT *모든 열을 가져옵니다.


방금이 쿼리가 테이블 이름에 영어가 아닌 문자에 대해 잘못된 결과를 제공하는 반면 Michael Baylon이 올바른 결과를 제공한다는 것을 깨달았습니다. (문자는 터키어 소문자 "ı"에 있었다)
ONUR 미르

1

아래에서 데이터베이스 쿼리를 선택하려면

use DatabaseName

지금

SELECT * FROM INFORMATION_SCHEMA.TABLES

이제 콘솔에서 생성 된 테이블을 볼 수 있습니다.

PFA.

질문


0

예 오라클은 :

select * from user_tables

즉, 로그인 user/schema한 사용자가 소유 한 객체 만 원하는 경우 시스템 테이블을 포함 all_tables하거나 사용할 수 있습니다 dba_tables.


그들은 공급자별로 다르지 않은 교차 ​​공급자 쿼리를 찾고 있습니다.
cjb110

모든 db 엔진이 데이터 딕셔너리를 다르게 구현하기 때문에 SQL에서이를 수행하는 일관된 방법은 없습니다. 프로그래밍 요구 사항 인 경우 jdbc / odbc 및 C / Java / C #와 같은 3GL 언어를 사용하여이를 추상화 할 수 있습니다. 각 데이터베이스마다 다른 구현이있는 경우 가능합니다. 작전은 자신의 요구 사항을 명확히해야합니다 ...
kayakpim

0

Michael Baylon의 답변을 바탕으로 스키마 정보가 포함 된 목록이 필요했으며 이것이 쿼리를 수정 한 방법입니다.

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)에서 아래 코드는 DB에 존재하는 모든 테이블의 목록을 가져옵니다.

select * from tab;

select table_name from tabs;

둘 다 작동합니다. 시도하고 찾아 봅시다.


0

Mysql에서 아래 SQL로 모든 improtanat 정보를 얻으십시오.

    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.