isql コマンドライン・インタフェースから Virtuoso を使ってみる

OpenLink Virtuosoは,リレーショナル,グラフ,文書などの多様なデータモデルを統合的に管理できるデータベース管理システムである.マルチモデルデータベースとしての特徴を活かし,異種データソースの仮想的統合(データ仮想化)を実現する.HTTP/ODBC/JDBCなどの標準的な接続方式に対応し,SQLによるリレーショナルデータの操作とSPARQLによるWebデータの検索が可能である.

公式ページ: https://virtuoso.openlinksw.com/

このページでは,isql のコマンドライン・インターフェースを活用した基本的なデータベース操作について,具体的な手順と実行方法を詳しく解説します.各コマンドの機能と使用例を体系的に説明し,実践的なデータベース管理の知識を提供します.

  1. このWebページの学習目標と内容
  2. 環境設定と準備作業
  3. isqlの起動方法と基本操作
  4. SQLを用いたテーブル定義と一貫性制約の実装
  5. SQLによるテーブルへのデータ挿入手順
  6. 一貫性制約違反の検証と確認方法
  7. SQL問い合わせの実行と結果の確認手順
  8. SQLを用いたデータ更新の方法
  9. SQLによるデータ削除の手順
  10. テーブルのエクスポート方法
  11. 実行計画の表示と分析方法
  12. SQLファイルの実行手順
  13. データベーススキーマの確認方法
  14. リスト処理の実践例

1. このWebページの学習目標と内容

2. 環境設定と準備作業

Virtuosoのインストール手順(Ubuntu環境)

インストールを実行するには,ターミナルで,以下のコマンドを入力します.

sudo apt -y install virtuoso-opensource

Virtuosoの詳細な使用方法と機能については, 公式ドキュメントを参照してください.

3. isqlの起動と基本操作

isqlの起動手順

isqlの詳細な機能と使用方法については,公式ドキュメントをご確認ください.

iqsl-vt

ヘルプ機能の利用方法

help;」コマンドを実行すると,isqlで利用可能な全てのコマンドと機能の一覧が表示されます.

isqlの終了手順

exit;」コマンドを実行することで,isqlセッションを安全に終了することができます.

4. SQLを用いたテーブル定義と一貫性制約の実装

SQLを使用して,order_recordsテーブルの論理構造と必要な一貫性制約の定義を行います.

リレーショナル・スキーマ (relational schema): order_records(id, year, month, day, customer_name, product_name,  unit_price, qty)
  1. 以下のSQL文を実行し,テーブルを作成します
    create table order_records (
        id            INTEGER  PRIMARY KEY not null,
        year          INTEGER  not null CHECK ( year > 2008 ),
        month         INTEGER  not null CHECK ( month >= 1 AND month <= 12 ),
        day           INTEGER  not null CHECK ( day >= 1 AND day <= 31 ),
        customer_name VARCHAR  not null,
        product_name  VARCHAR  not null,
        unit_price    REAL     not null CHECK ( unit_price > 0 ),
        qty           INTEGER  not null DEFAULT 1 CHECK ( qty > 0 ),
        created_at    DATETIME not null,
        updated_at    DATETIME,
        CHECK ( ( unit_price * qty ) < 200000 ) );
    

5. テーブルへのデータ挿入手順

ここではorder_recordsテーブルに具体的なデータを登録します.

以下の手順に従って,SQLを用いてorder_recordsテーブルへの効率的なデータ挿入を実行します.

  1. SQLコマンドの実行

    「insert into ...」文を使用して,構造化されたデータを挿入します.

    insert into order_records values( 1, 2022, 10, 26,  'kaneko',   'orange A', 1.2, 10, now(), NULL );
    insert into order_records values( 2, 2022, 10, 26,  'miyamoto', 'Apple M',  2.5, 2,  now(), NULL );
    insert into order_records values( 3, 2022, 10, 27,  'kaneko',   'orange B', 1.2, 8,  now(), NULL );
    insert into order_records values( 4, 2022, 10, 28,  'miyamoto', 'Apple L',  3,   1,  now(), NULL );
    

    now()関数を使用することで,システムの現在日時がDATETIME型(YYYY-MM-DD HH:MM:SS形式)で自動的に設定されます.

    トランザクション制御には,以下の重要なコマンドを活用することができます.

    • set autocommit off;
    • commit work;
    • rollback work;
  2. データ挿入結果の確認
    SELECT * FROM order_records;
    

insert into文には次の2つの効果的な方式があります.

* 全ての属性値をテーブル定義順に指定する完全指定方式

insert into order_records values( 1, 2022, 10, 26,  'kaneko', 'orange A', 1.2, 10, now(), NULL );

* 挿入する属性を明示的に指定する選択的指定方式

この方式では,明示的に指定しなかった属性にはテーブル定義時に設定されたデフォルト値が自動的に適用されます.

insert into order_records (id, year, month, day, customer_name, product_name, unit_price, qty, created_at) values( 2, 2022, 10, 26,  'miyamoto', 'Apple M',  2.5, 2, now() );

6. 一貫性制約違反の検証

データベース管理システムは定義された一貫性制約を自動的に監視し,違反する操作を即座に検出して拒否します.以下で具体的な検証例を示します.

主キー制約の検証(PRIMARY KEY)

insert into order_records values( 3, 2022, 10, 30, 'kaneko', 'banana', 10, 3, now(), NULL );

* 属性idの値3は既にテーブル内に存在するため,主キー制約「PRIMARY KEY」に違反し,データ挿入操作は拒否されます.

非NULL制約の検証(not null)

insert into order_records values( 3, 2022, 10, 30,  NULL, 'melon', 10, 3, now(), NULL );

* 属性customer_nameには非NULL制約「not null」が定義されているため,NULL値の設定はデータの整合性を損なうため許可されません.

データ整合性制約の検証

制約違反の具体的な検証例

insert into order_records values( 6, 1009, 10, 30,  'kaneko', 'melon', 10, 3, now(), NULL );

* 年度に関する制約「CHECK ( year > 2008 )」に違反するため,このデータ挿入操作は自動的に拒否されます.

複合制約違反の具体的な検証

insert into order_records values( 7, 2022, 10, 31,  'kaneko', 'strawberry', 4.6, 100000, now(), NULL );

* 総額に関する制約「CHECK ( ( unit_price * qty ) < 200000 )」に違反するため,このデータ操作は実行できません.

7. SQL問い合わせの実行と結果確認

ここでは,実務で頻繁に使用されるSQL問い合わせの具体例を示します. より高度なSQL問い合わせについては,別ページで詳しく解説しています.ここではテーブルの内容を効率的に確認する方法に焦点を当てます.

全データの体系的な表示

SELECT * FROM order_records;