TOP

データベースsqlite3 その4

データベース操作言語sqlについて

Basic_SQL

sqlite を操作するには、sql と呼ばれるデータベース操作言語を使用します。

リレーショナルデータベースシステム(RDBS) に使用されており、ISOやANSI、JISによって標準化されています。但し、データベースによって、独自の拡張・縮小を加えているので、使用するに当たって、それぞれの仕様を確認する必要があります。

SQLのコマンドは、機能によって「データ定義言語 (DDL:Data Definition Language)」「データ操作言語(DML:Data Manipuration Language)」「データ制御言語(DCL:Data Control Language)」の3つに分類することができます。

以下は、sqlite3における基本となる sql 言語定義となります。

データ定義言語 (DDL)

データベース作成

$ sqlite3 database_name;
ターミナルウィンドウを立ち上げ、sqlite3 コマンドの引数にデータベース名をつけることで作成されます。
database_name が sqlite3データベースのファイル名となり、カレントディレクトリに作成されます。
引数なしでもテーブル作成、操作は出来ますが、saveコマンドで保存しない限り、sqlite3ドットコマンドを終了すると、データは消滅してしまいます。

テーブル作成 [CREATE TABLE]

CREATE TABLE table-name (column_name1[datatype][table-constraint ],
                         column_name2[datatype][table-constraint ], 
                               ,
                               ,
                        ) [table-options];
 table-constraint テーブル制約 ( primary key, unique, foreign key, check など)
 table-options テーブルオプション ( without rowid, struct など )

同じ名前のテーブル、インデックス、またはビューが既に含まれているデータベースに CREATE TABLE ステートメントを発行しようとすると、通常はエラーになります。この場合は、CREATE TABLE IF NOT EXISTS …. とすれば、回避できます。

テーブルの定義を変更する [ALTER]

ALTER TABLE table-name ADD column_name [datatype];  列を追加する
  追加したカラムはテーブルの最後に追加されます。
  カラムを追加する場合は次の条件を満たしていなければなりません。
  1. PRIMARY KEY や UNIQUE 制約は設定できない
  2. DEFAULT 制約を設定する時は、CURRENT_TIME/CURRENT_DATE/CURRENT_TIMESTAMP は指定できない
  3. NOT NULL 制約を設定する時は、NULL以外のデフォルト値の設定が必要
ALTER TABLE DROP column_name;  列を削除する
 カラムを追加する場合は次の条件を満たしていなければなりません。
  1. PRIMARY KEY ではない
  2. 
ALTER TABLE table_name RENAME TO new_table_name;   テーブル名を変更する

テーブルを削除する [DROP]

DROP TABLE table_name; テーブルを削除する

データ操作言語 (DML)

データを挿入・追加する [INSERT]

INSERT INTO table-name ( column1, column2,...columnN)
               VALUES ( value1, value2,....valueN);
レコードをついか・挿入する

書き込みステートメントであるINSERT を発行すると、暗黙にトランザクションモードとなります。デフォルトでは、占有ロックがかかり、他のプロセス受け入れが遮断されます。SELECT などの読み込みステートメントと比べ、実行コストがかかります。よって、単独で INSERT ステートメントを発行するよりも、複数の INSERT ステートメントを BEGIN COMMIT で囲むと、すべての挿入が 1 つのトランザクションにグループ化され、実行速度の短縮が期待されます。

まとめてデータ挿入処理[INSERT INTO,… VALUES(…),(…),(…)]

データを参照する [SELECT]

データの析出条件をつける [WHERE]

SELECT column1, column2....columnN
FROM table_name
WHERE  [condition | exoression];
condition: 条件式
expression: 析出計算式

JOIN、INNER JOIN、または CROSS JOIN の場合、WHERE 句の制約式と ON 句の制約式の間に違いは概ねありません。

データ数をカウントして表示する [COUNT]

SELECT COUNT(column_name)
FROM table_name;
table_nameテーブルにあるcolumn_name列のデータ数をカウントして表示する。

重複レコードを排除し、一意のレコードのみを参照する [DISTINCT]

SELECT DISTINCT column1, column2,.....columnN 
FROM table_name;
table_nameテーブルにあるcolumn1, column2,.....columnN列群と同じ列群を含めず参照する。

サブクエリーで析出した条件がtrueになるカラムを返す [EXISTS]

SELECT column1, column2....columnN
FROM table_name
WHERE column_name EXISTS (SELECT * FROM   table_name2 );
table_nameテーブルに対して、table_name2テーブルのcolumn_nameが真になるレコードを析出し、column1, column2,,,columnNを表示する。、

文字パターンによる照合 [GLOB]

SELECT column1, column2....columnN
FROM table_name
WHERE column_name GLOB { PATTERN };

GLOBパターンに一致するレコードを析出する
使用可能ワイルドカード * (0個以上の数字または文字)、? (1個の数字または文字)

カラム名によるクループ化でグループごとに集計 [GROUP BY]

SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name;
条件式によって析出したレコードに対して、column_name列に共通するレコードごとにグループ化し、そのグループ化されたレコード数を表示する。

最終結果に表示されるグループの結果をフィルタリングする条件を指定[HAVING]

1を返すサブクエリ [IN]

SELECT column1, column2....columnN
FROM table_name
WHERE column_name IN (val-1, val-2,...val-N);
[val-1, val-2, ...val-Nが存在するcolumn_nameがある]とするレコード析出条件で表示する

ワイルドカードを使用してテキスト値をパターンと照合 [LIKE]

SELECT column1, column2....columnN
FROM table_name
WHERE column_name LIKE { PATTERN };
使用可能ワイルドカード:% (0個以上の数字または文字)、_ (1個以上の数字または文字)
'%' にマッチさせたい場合 --> '^%' escape '^'
'_' にマッチさせたい場合 --> '^_' escape '^'
エスケープ文字である '^' は '%' '_' 以外の任意の一文字であればよい。 

0を返すサブクエリ [NOT IN]

ELECT column1, column2....columnN
FROM table_name
WHERE column_name NOT IN (val-1, val-2,...val-N);
[val-1, val-2, ...val-Nが存在しないcolumn_nameがある]とするレコード析出条件で表示する。

データを昇順または降順で並べ替える [ORDER BY]

SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION
ORDER BY column_name {ASC|DESC};
昇順(ASC)、降順(DESC) でデータを並び替えて表示する。デフォルトではASC 

データ量を制限する [LIMIT]

SELECT column1, column2, columnN 
FROM table_name
LIMIT [limit number];

SELECT column1, column2, columnN 
FROM table_name
LIMIT [limit number] OFFSET [start number ];  -- start number = row counted from 0 start. 
numberまでのデータを表示する。OFSETがあれば、OFSETからnumberまでのデータを表示する。

データを更新する [UPDATE]

データを削除する [DELETE]

DELETE FROM table_name WHERE {condition};
table_nameテーブルにおいて、条件式に従ってレコードを削除する。

使用例

副問い合わせ (subquery)

副問い合わせ処理は、select 文の結果を利用してsql文を発行し、結果を得ることです。前者をサブクエリー、後者をメインクエリーと呼ばれております。最初にサブクエリーが実行さ れ、その結果をもって、メインクエリーが実行されます。サブクエリーを発行できる条件は以下のようです。

  • サブクエリは括弧で囲む必要があります。
  • サブクエリは、選択された列を比較するために、通常メイン クエリに含まれている一つの列との間でSELECT 句を発行することになります。
  • メイン クエリでは ORDER BY を使用できますが、サブクエリでは ORDER BY を使用できません。GROUP BY は、サブクエリで ORDER BY
  • 複数の行を返すサブクエリは、IN 演算子などの複数値演算子でのみ使用できます。
  • BETWEEN 演算子はサブクエリでは使用できません。
  • select文、insert文、update文、delete文で使用で決ます
  • where 条件文、from析出列条件、select列、having条件式として使われます。

データ定義言語 (DDL) + データ操作言語 (DML)

SELECT ステートメントの結果に基づいてデータベース テーブルを作成[AS SELECT]

CREATE TABLE new_table_name AS SELECT column1, column2,...FROM table_name [WHERE condition];

table_nameテーブルの列定義、レコードを析出して、その結果をnew_table_nameテーブルとして作成する。
PRIMARY KEY も制約もありません。
各列のデフォルト値は NULL です。
 

データベース制御言語 (DCL)

トランザクション処理に使われる、「commit rollup」、データベースのアクセス権を操作する「grant revoke」があります。sqlite3 では、アクセス権の操作は出来ないので、grant revoke は使うことが出来ません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください