MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでSHOW COLUMNSの結果をテーブルのデータソースとして利用するには?INFORMATION_SCHEMA.COLUMNSの活用術

SHOW COLUMNSをサブクエリのデータソースとして使う方法

MySQLでは、SHOW COLUMNS文の結果を直接サブクエリ(派生テーブル)のデータソースとして使用することはできません。しかし、同様の情報を取得できるINFORMATION_SCHEMA.COLUMNSビューを使えば、列情報を通常のテーブルと同じように扱うことが可能です。

以下の構文のように、INFORMATION_SCHEMA.COLUMNSから目的のテーブル名で絞り込んだ結果を、エイリアスを付けてSELECTすることで実現できます。

SELECT * FROM (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'yourTableName') anyAliasName;

サンプルテーブルを作成する

まずは動作確認用に、学生情報を管理するシンプルなテーブルを作成してみましょう。

mysql> create table DemoTable
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentFirstName varchar(20),
    StudentLastName varchar(20),
    StudentAge int
);
Query OK, 0 rows affected (1.51 sec)

このテーブルには、自動採番される主キー「StudentId」と、氏名・年齢の各カラムが定義されています。

カラム情報をデータソースとして取得するクエリ

次のクエリを実行すると、「DemoTable」のカラム詳細情報を、あたかもテーブルであるかのように参照できます。

mysql> SELECT * FROM (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'DemoTable') tbl;

実行結果

上記のクエリを実行すると、以下のような出力が得られます。

+---------------+--------------+------------+------------------+------------------+----------------+-------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+-----------------+-------------+------------+----------------+---------------------------------+----------------+-----------------------+--------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME      | ORDINAL_POSITION | COLUMN_DEFAULT | IS_NULLABLE | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | NUMERIC_PRECISION | NUMERIC_SCALE | DATETIME_PRECISION | CHARACTER_SET_NAME | COLLATION_NAME  | COLUMN_TYPE | COLUMN_KEY | EXTRA          | PRIVILEGES                      | COLUMN_COMMENT | GENERATION_EXPRESSION | SRS_ID |
+---------------+--------------+------------+------------------+------------------+----------------+-------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+-----------------+-------------+------------+----------------+---------------------------------+----------------+-----------------------+--------+
| def           | sample       | DemoTable  | StudentId        | 1                | NULL           | NO          | int       | NULL                     | NULL                   | 10                | 0             | NULL               | NULL               | NULL            | int(11)     | PRI        | auto_increment | select,insert,update,references |                |                       | NULL   |
| def           | sample       | DemoTable  | StudentFirstName | 2                | NULL           | YES         | varchar   | 20                       | 60                     | NULL              | NULL          | NULL               | utf8               | utf8_general_ci | varchar(20) |            |                | select,insert,update,references |                |                       | NULL   |
| def           | sample       | DemoTable  | StudentLastName  | 3                | NULL           | YES         | varchar   | 20                       | 60                     | NULL              | NULL          | NULL               | utf8               | utf8_general_ci | varchar(20) |            |                | select,insert,update,references |                |                       | NULL   |
| def           | sample       | DemoTable  | StudentAge       | 4                | NULL           | YES         | int       | NULL                     | NULL                   | 10                | 0             | NULL               | NULL               | NULL            | int(11)     |            |                | select,insert,update,references |                |                       | NULL   |
+---------------+--------------+------------+------------------+------------------+----------------+-------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+-----------------+-------------+------------+----------------+---------------------------------+----------------+-----------------------+--------+
4 rows in set (0.00 sec)

取得できる主な情報

この結果セットには、テーブルの各カラムに関する詳細なメタデータが含まれています。代表的なカラムは以下のとおりです。

  • COLUMN_NAME: カラム名
  • ORDINAL_POSITION: テーブル内でのカラムの順序(何番目か)
  • IS_NULLABLE: NULLを許容するかどうか(YES / NO)
  • DATA_TYPE / COLUMN_TYPE: データ型の情報
  • COLUMN_KEY: 主キー(PRI)などのキー情報
  • EXTRA: auto_increment などの追加属性

応用:必要な列だけを絞り込む

すべての列が必要ない場合は、必要なカラムだけを選択すると読みやすくなります。

mysql> SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_KEY
    -> FROM INFORMATION_SCHEMA.COLUMNS
    -> WHERE TABLE_SCHEMA = 'sample' AND TABLE_NAME = 'DemoTable';

また、TABLE_NAME = 'DemoTable'だけでなく、TABLE_SCHEMA(データベース名)も条件に指定すると、同名のテーブルが別スキーマに存在する場合の誤取得を防げるため、実務では推奨されます。

このようにINFORMATION_SCHEMA.COLUMNSを活用すれば、SHOW COLUMNS単体では実現できない柔軟な検索・集計・結合が可能になり、テーブル構造の調査やドキュメント生成などにも幅広く役立ちます。

  1. Grafana向けRedisデータソースプラグインの使い方を実例で解説

    今月初め、RedisはGrafana向けの新しい「Redis Data Source」プラグインをリリースしました。このプラグインにより、広く使われているオープンソースの監視ツールGrafanaとRedisを簡単に接続できるようになります。本記事では、その仕組みを理解するために、少しメタな実例として「このプラグイン自体がどれだけダウンロードされたかを時系列で追跡する」方法を紹介します。実は、Grafanaのプラグインリポジトリにはこうした統計情報が標準では提供されていないのです。 さらに詳しく知りたい方は、「Introducing the Redis Data Source Plug-in

  2. Excelのデータモデル活用術:3つのステップで複数テーブルを統合する方法

    Excelは膨大なデータを処理できる強力なツールですが、データモデル機能を活用していなければ、その真価を発揮できていないかもしれません。データモデルを使えば、共通の列を基準にテーブル間のリレーションシップ(関連付け)を作成し、複数のテーブルからデータを結合できます。この記事では、Excelのデータモデルの基本的な使い方を、わかりやすい手順とともに解説します。 理解を深めながら実際に練習したい方は、サンプルのExcelワークブックをダウンロードして、ご自身でも操作してみてください。 データモデルを使うメリット データモデルはバックグラウンドで動作し、ピボットテーブルなどのレポート機能を効率