トップページ -> コンピュータ実習 -> Virtuoso のインストールと使い方 -> isql コマンドライン・インタフェースから Virtuoso を使ってみる
[サイトマップへ]  

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

サイト構成 連絡先,業績など コンピュータ実習 データの扱い コンピュータ設定 教材(公開) サポートページ

この Web ページでは,isql のコマンドライン・インタフェース を使って下記の操作を行う手順を,図解で説明する. (コマンドの簡単な説明と,コマンドを実行させるための操作手順の両方を説明する).

Virtuosoのインストール別の Web ページ で説明している.

Virtuoso の使用法は http://docs.openlinksw.com/virtuoso/index.html


準備

必要となるソフトウエア


この Web ページで行うこと


isqlで既存のデータベースを開く (Open an existing database)

Virtuoso サーバと isql の起動

Ubuntu の端末で,次の操作を行う.(Use a terminal, and do the following).

  1. (初回実行時のみ) データベースディレクトリのオーナの設定
    cd /usr/local/virtuoso-opensource/var/lib/virtuoso/db
    sudo chown -R $USER .
    

  2. Virtuoso サーバの起動
    cd /usr/local/virtuoso-opensource/var/lib/virtuoso/db
    /usr/local/virtuoso-opensource/bin/virtuoso-t -fd
    

  3. isql の起動

    isql を起動する

    /usr/local/virtuoso-opensource/bin/isql
    

ヘルプの表示

help;」で,ヘルプが表示されます.

文字のエンコーディングの確認

現在使用中のデータベースについての,文字のエンコーディングの確認 (encoding)

isql の起動時に,エンコーディングが表示されます.

isql の終了

exit;」で終了.


SQL を用いたテーブル定義と一貫性制約の記述 (Table defintion and integrity constrant specification using SQL)

SQL を用いて,order_records テーブルを定義し,一貫性制約を記述する. (Define 'order_records' table and specify integrity constrants of the table using SQL)

リレーショナル・スキーマ (relational schema): order_records(id, year, month, day, customer_name, product_name,  unit_price, qty)
  1. 次の SQL を入力 (Write the following 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 ) );
    


SQL を用いたテーブルへの行の挿入 (Insert rows into a table using SQL)

次のような order_records テーブルを作る. (Construct table 'order_records')

以下の手順で,SQL を用いてorder records テーブルへの行の挿入を行う (Insert rows into table 'order_records' using SQL)

  1. SQL の実行

    「INSERT INTO ...」は行の挿入.

    INSERT INTO order_records VALUES( 1, 2009, 10, 26,  'kaneko',   'orange A', 1.2, 10, now(), NULL );
    INSERT INTO order_records VALUES( 2, 2009, 10, 26,  'miyamoto', 'Apple M',  2.5, 2,  now(), NULL );
    INSERT INTO order_records VALUES( 3, 2009, 10, 27,  'kaneko',   'orange B', 1.2, 8,  now(), NULL );
    INSERT INTO order_records VALUES( 4, 2009, 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つの方法がある.(Two styles of "INSERT INTO")

■ 属性の値を,テーブル定義の順に全て並べる (List all attribute values. The order is the same as its table definition)

INSERT INTO order_records VALUES( 1, 2009, 10, 26,  'kaneko', 'orange A', 1.2, 10, now(), NULL );

■ 属性の値の並び方を,属性名を使って明示的に指定する (Specify the order of attribute values using attribute name list)

このとき,属性値を省略すると,テーブル定義のときに指定されたデフォルト値が使われる (defaults values are used)

INSERT INTO order_records (id, year, month, day, customer_name, product_name, unit_price, qty, created_at) VALUES( 2, 2009, 10, 26,  'miyamoto', 'Apple M',  2.5, 2, now() );

一貫性制約に違反する更新ができないことの確認 (Integrity constraint violation is not permitted when database update)

ここでは,一貫性制約に違反するような更新を試みる.データベース管理システムソフトウエアが一貫性を維持するので, 一貫性制約に違反するような更新はできない.

主キー制約 (PRIMARY KEY)

INSERT INTO order_records VALUES( 3, 2009, 10, 30, 'kaneko', 'banana', 10, 3, now(), NULL );

※ すでに属性 id には 3 という値がある. 主キー制約「PRIMARY KEY」に違反.

非空制約 (NOT NULL)

INSERT INTO order_records VALUES( 3, 2009, 10, 30,  NULL, 'melon', 10, 3, now(), NULL );

※ 非空制約「NOT NULL」. 属性 customer_name には 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, 2009, 10, 31,  'kaneko', 'strawberry', 4.6, 100000, now(), NULL );

※ 制約「CHECK ( ( unit_price * qty ) < 200000 ) )」に違反


SQL 問い合わせの発行と評価結果の確認 (Issue SQL queries and inspect the results)

ここでは,SQL を用いた問い合わせの実行例を示す. SQL 問い合わせの詳細については,別の Web ページで説明する.ここでは,テーブルの中身を確認して欲しい.

テーブルの全ての行の表示 (List all rows of a table)

SELECT * FROM order_records;

条件を満足する行のみの表示 (List the rows which satisfy a given condition)

SELECT * FROM order_records WHERE product_name = 'orange A';

SELECT * FROM order_records WHERE product_name LIKE 'orange%';

LIKE は文字列のパターンマッチ

SELECT * FROM order_records WHERE unit_price > 2;

SELECT * FROM order_records WHERE qty > 9 AND customer_name = 'kaneko';


SQL を用いた更新 (Update using SQL)

SQL を用いたデータの更新 (update)の実行例を示す. 「UPDATE <table-name> SET <attribute-name>=<expression> WHERE <expression>」の形をした SQL は,データの更新である.

  1. SQL の実行 (Execute SQL)

    「UPDATE ... SET ...」は更新.

    UPDATE order_records SET qty=12, updated_at=now()
    WHERE id = 1;
    

  2. order_records テーブルの中身を確認 (Inspect the table 'order_table')


SQL を用いた行の削除 (Delete row(s) using SQL)

SQL を用いた行の削除 (delete row(s))の実行例を示す.

DELETE FROM <table-name> WHERE <expression>;」の形をした SQL は行の削除である.

  1. SQL の実行 (Execute SQL)

    DELETE FROM order_records
    WHERE id = 2;
    

  2. order_records テーブルの中身を確認 (Inspect the table 'order_table')


テーブルのエクスポート (Export table data)

端末で、次のように実行する

echo "SELECT * FROM order_records;" | /usr/local/virtuoso-opensource/bin/isql > /tmp/hoge


explain による SQL 実行計画の表示 (Get SQL query plan using 'explain')

SQL 文の前に「set explain on;」を実行すると,SQL は評価されずに,実行計画が表示されます. 「set explain off;」により元に戻ります.

set explain on; 
select * from order_records;
set explain off;


ファイルに入った SQL の実行

ファイルに入った SQL を実行するには「load」を使う.

echo "select * from order_records;" > /tmp/hoge.query
load '/tmp/hoge.query';
exit; 


データベーススキーマの表示 (Get database schema)

テーブル名の一覧

tables; 

テーブル情報、属性情報の表示

select * from tables;
select * from columns;