ここでは、SQLiteのすべての添付データベースのテーブルの一覧を返す方法を2つ紹介します。
最初の方法は、すべての接続されたデータベースのすべてのテーブルとビューを返します。
2番目のメソッドでは、テーブルとビューの両方を返すか、テーブルだけを返すかのオプションがありますが、プライマリデータベースのものだけです。
The .tables Command
SQLite コマンド ライン シェルを使用しているときにテーブルのリストを返す最も簡単な方法は、.tables
コマンドを使用することです。
このコマンドは、引数付きでも引数なしでも使用できます。
例:
.tables
結果:
Album Employee InvoiceLine PlaylistTrackArtist Genre MediaType Track Customer Invoice Playlist
私の場合、1 つのデータベース (Chinook サンプル データベース) のみが接続されていて、このデータベースのすべてのテーブルが返されました。 このような引数は、コマンドによって返されるテーブルを制限するために使用することができます。 たとえば、特定のテーブルを指定したり、パターン・マッチングを使用して指定されたパターンに一致するテーブルのみを返したりすることができます。
例:
.tables a%
結果:
Album Artist
この場合、文字 “a” で始まるテーブルだけが返されます。
注意すべき点は、.tables
コマンドはテーブルとビューの両方を返すことです。 結果からビューを除外したい場合は、パターン マッチングを使用してビューを除外することができます。
結果からビューを除外するもう一つの方法は、sqlite_masterテーブルを直接問い合わせることです。 このテーブルはビューも含みますが、必要であれば、SQLを使用して結果からビューを除外することができます。
The sqlite_master Table
すべてのSQLiteデータベースは、データベースのスキーマを定義するsqlite_masterテーブルを持ちます。 このテーブルを使用して、データベース内のテーブルのリストを返すことができます。
.tables
コマンドを使うときは、次のようにするのと似ています:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
ただし、違いがあります。
その違いは、この方法はプライマリ データベースに対してのみ結果を返すことです (.tables
コマンドは、接続されているすべてのデータベースに対して結果を返します)。
上記のクエリを実行すると、次の結果が返ります。
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
そのクエリは、テーブルとビューを返します (.tables
コマンドがするのと同じです)。
私の場合、ビューはありませんが、結果にビューを除外したい場合は、次のように使用します。
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Result:
AlbumArtistCustomerEmployeeGenreInvoiceInvoiceLineMediaTypePlaylistPlaylistTrackTrack
Exclude Views
念のため、ビュー付きのデータベースを使用した例を簡単に説明します。 このデータベースには、1 つのテーブル (Products と呼ばれる) と 1 つのビュー (vProducts と呼ばれる) が含まれます。
SQLite/ja データベースに接続します。
sqlite3 Store.db
.tables
コマンドを実行します。
.tables
Result:
Products vProducts
テーブルとビューについてsqlite_masterテーブルに問い合わせます:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Result:
ProductsvProducts
ここでテーブルのみについてsqlite_masterに問い合わせます:
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'ORDER BY 1;
Result:
Products
Temporary Tables
The .Tables for the sqlite_master tableはテーブルを問い合わせますが、テーブルの問い合わせは行いません。tableコマンドは、パーマネントテーブルとテンポラリーテーブルの両方を返します。 sqlite_masterテーブルには永続テーブルのみが含まれます。 一時テーブルのみを返す必要がある場合、sqlite_temp_masterに問い合わせることができます。
永久テーブルと一時テーブルの両方を返すには、以下のような問い合わせを行うことができます。