INFORMATION_SCHEMAはほとんどのRDBMSで実装されて
いてDBの情報を格納しているテーブルなどの集合である。
Oracle、MS SQLでもかなり運用中にお世話になりました。
MYSQLも同様にINFORMATION_SCHEMAが実装されてますので、
運用に大活躍する事でしょう。

information_schema

mysql> select table_name from information_schema.tables where table_schema=’TEST
‘;
+————+
| table_name |
+————+
| MEM |
| MEM2 |
| MEM3 |
| T1 |
| T2 |
+————+
5 rows in set (0.00 sec)

mysql>

mysql> show tables from TEST;
+—————-+
| Tables_in_TEST |
+—————-+
| MEM |
| MEM2 |
| MEM3 |
| T1 |
| T2 |
+—————-+
5 rows in set (0.00 sec)

mysql>

Information_Schemaはテーブルの集まりなので、用意されている
Viewのみを利用するよりも効率的にDBを運用する事が出来る。
MS SQLでいうsysobjectsテーブル,sysindexesテーブルのような
テーブルがあるのでJOINなどの処理で運用に必要なデータを
結合して利用してみると運用効率UPです。

(例)
━━━━━━DB━━━━━━
SELECT
t.table_schema
,t.table_name
,COUNT( IF(c.column_key = ‘PRI’,1,NULL) ) AS primary_key
,COUNT( IF(c.column_key != ‘PRI’,1,NULL) ) AS other_key
FROM information_schema.tables t
LEFT JOIN information_schema.columns c
ON t.table_schema = c.table_schema
AND t.table_name = c.table_name
AND c.column_key != ”
WHERE t.table_type != ‘VIEW’
AND t.table_schema = database()
GROUP BY t.table_name
ORDER BY table_schema, table_name;

━━━━━━特定DB━━━━━━
SELECT
t.table_schema
,t.table_name
,COUNT( IF(c.column_key = ‘PRI’,1,NULL) ) AS primary_key
,COUNT( IF(c.column_key != ‘PRI’,1,NULL) ) AS other_key
FROM information_schema.tables t
LEFT JOIN information_schema.columns c
ON t.table_schema = c.table_schema
AND t.table_name = c.table_name
AND c.column_key != ”
WHERE t.table_type != ‘VIEW’
AND t.table_schema = ‘TEST’
GROUP BY t.table_name
ORDER BY table_schema, table_name;

information_schema2

(例)
━━━━━━DB━━━━━━
(SELECT
table_schema AS object_schema
,table_name AS object_name
,table_type AS object_type
FROM information_schema.tables )
UNION ALL
(SELECT
routine_schema
,routine_name
,routine_type
FROM information_schema.routines )
UNION ALL
( SELECT
trigger_schema
,trigger_name
,’TRIGGER’
FROM information_schema.triggers )
ORDER BY object_schema, object_type, object_name;

━━━━━━特定DB━━━━━━
(SELECT
table_schema AS object_schema
,table_name AS object_name
,table_type AS object_type
FROM information_schema.tables
where table_schema = ‘TEST’
)
UNION ALL
(SELECT
routine_schema
,routine_name
,routine_type
FROM information_schema.routines
where routine_schema = ‘TEST’ )
UNION ALL
( SELECT
trigger_schema
,trigger_name
,’TRIGGER’
FROM information_schema.triggers
where trigger_schema = ‘TEST’
)
ORDER BY object_schema, object_type, object_name;

information_schema3


━━━━━━INFORMATION_SCHEMA DIAGRAM━━━━━━

5.0

5.1

————————————————————————————-
テーブル名 説明 他の参照方法
————————————————————————————-
CHARACTER_SETS 使用可能な文字コード SHOW CHARACTER SET
COLLATIONS 使用可能な照合順序 SHOW COLLATION
COLLATION_CHARACTER_SET_APPLICABILITY 使用可能な照合順序 SHOW COLLATIONの最初の2カラム
COLUMNS 各テーブルのカラム SHOW COLUMNS
COLUMN_PRIVILEGES カラムの権限情報 mysql.columns_priv
KEY_COLUMN_USAGE カラムの制約の情報
ROUTINES SP情報等 mysql.proc
SCHEMATA データベースの情報 SHOW DATABASES
SCHEMA_PRIVILEGES データベースの権限情報 mysql.db
STATISTICS インデックスの情報 SHOW INDEX
TABLES テーブルの情報 SHOW TABLES
TABLE_CONSTRAINTS テーブルの制約の情報
TABLE_PRIVILEGES テーブルの権限情報 mysql.tables_priv
TRIGGERS トリガの情報 SHOW TRIGGERS
USER_PRIVILEGES ユーザの権限情報 mysql.user
VIEWS ビューの情報 SHOW CREATE VIEW

information_schemaは、データベースやテーブルの名前やユーザ権限情報などのメタデータへ
のアクセスを提供する仕組みで,ほかのRDBMSでは、データディクショナリやシステムカタログと呼ばれているものになります。
information_schemaはMySQL独自のものではなく、SQLの標準規格であるSQL:2003(ISO/IEC 9075:2003)に定められているようです。

その他のDBで直接テーブルを参照する例)
——————————————————————
RDBMS コマンド
——————————————————————
MySQL SHOW TABLES;
PostgreSQL SELECT * FROM pg_tables;
Oracle SELECT * FROM tab;
MS SQL SELECT table_name FROM information_schema.tables

show-open-tables

※ソースファイルの中を調査するとHiddenテーブルがあるかもしれません。

mysql> SELECT
-> t.table_schema
-> ,t.table_name
-> ,COUNT( IF(c.COLUMN_KEY = ‘PRI’,1,NULL) ) AS primary_key
-> ,COUNT( IF(c.COLUMN_KEY != ‘PRI’,1,NULL) ) AS other_key
-> FROM information_schema.tables t
-> LEFT JOIN information_schema.columns c
-> ON t.table_schema = c.table_schema
-> AND t.table_name = c.table_name
-> AND c.column_key != ”
-> WHERE t.table_type != ‘VIEW’
-> and t.table_schema = ‘WP_SCHEMA’
-> GROUP BY t.table_name
-> ORDER BY table_schema,table_name;
+————–+—————————+————-+———–+
| table_schema | table_name | primary_key | other_key |
+————–+—————————+————-+———–+
| WP_SCHEMA | wp_category | 1 | 0 |
| WP_SCHEMA | wp_comments | 1 | 3 |
| WP_SCHEMA | wp_item | 1 | 0 |
| WP_SCHEMA | wp_links | 1 | 2 |
| WP_SCHEMA | wp_maker | 1 | 0 |
| WP_SCHEMA | wp_options | 3 | 0 |
| WP_SCHEMA | wp_postmeta | 1 | 2 |
| WP_SCHEMA | wp_posts | 1 | 2 |
| WP_SCHEMA | wp_price | 1 | 0 |
| WP_SCHEMA | wp_product08 | 1 | 0 |
| WP_SCHEMA | wp_terms | 1 | 2 |
| WP_SCHEMA | wp_term_relationships | 2 | 0 |
| WP_SCHEMA | wp_term_taxonomy | 1 | 1 |
| WP_SCHEMA | wp_usermeta | 1 | 2 |
| WP_SCHEMA | wp_users | 1 | 2 |
+————–+—————————+————-+———–+
15 rows in set (0.31 sec)

mysql>