Posql - Supported SQL Syntax - SQL リファレンス

Posql 概要

Posql (ポスキューエル) は、 ピュア PHP (標準バンドル以外に必要なモジュールなし) で作られた、
1 つのファイルを 1 つのデータベースとして扱う データベースエンジン のクラス (ライブラリ系 DBMS) です。
PHP のバージョンに関係なく動作し、 SQLite より気軽に扱えることを目標とされています。
基本的な SQL 文法をサポートし SQL-92 に準拠した設計で作られています。 パッケージには GUI でデータベースを操作できる PosqlAdmin (データベースマネージャ) が付属されています。
また、PEAR::DB, PEAR::MDB2 抽象化レイヤーを使用して Posql を操作できるドライバや、PHP フレームワーク CakePHP から Posql をデータベースとして扱える DBO ドライバもパッケージに同梱されています。
SQL ステートメントは、 PDO と互換性のある プリペアドステートメントや、 バインドメカニズムを使用することができます。
Posql データベースは、多数の同時アクセスに耐えられる 排他機構 (ロック) を実装しています。 複数のプロセスからの同時アクセスにより競合が発生するような場合でも、 アトミック操作に加え テスト・アンド・セット方式によって、 常にデータベースの安定性を保持します。

Posql は、 評価式 (WHERE 句など) で PHP 構文を使用することができます。
SQL92 - 99 標準の関数、文法を使用し SQL 構文で評価することも可能です。
評価エンジン切り替え機能によって、 その式の評価のされかたを PHP モード、SQL モードと、 その時に応じて切り替えることができます。

Posql は他のライブラリやフレームワークと衝突しないよう、 グローバル空間を汚さず設計されています。
定義されるものはクラス数個のみで、 Posql* (Posql_Config, Posql_Utils, etc.) 等のクラスが定義されます。

Posql バージョン 2.11 から、 SELECT サブクエリ (副問い合わせ) が実装され 扱える SQL が大幅に広がりました。 サブクエリは SELECT, INSERT, UPDATE または DELETE の各ステートメントの中の評価式など、 式が使えるところであればどこにでも使用できます。 それにあわせて EXISTS, ANY, SOME, ALL 演算子が実装されています。 バージョン 2.15 から、 UNION, INTERSECT, EXCEPT 演算子が実装されています。 また、今まではエイリアス名を指定する演算子が AS のみだったのを改善し、 ホワイトスペース区切りでも適応可能となりました。 バージョン 2.16 では、 GROUP BY 句において、 今までは 1 つのカラム名のみ指定可能だったのを改善し、 任意の評価式を複数 指定できるようになりました。 また、日時を扱う strftime や extract 関数が実装されました。 最新バージョン 2.17 では、 SELECT の速度が 約 80% 向上したという劇的な改善がされています。 また、JavaScript の関数 escape/unescape, encodeURI/decodeURI, encodeURIComponent/decodeURIComponent が互換実装され、PHP と JavaScript 間の連携をとる際に便利になりました。 JavaScript 関数の互換実装については API マニュアル を参照ください。 クエリーキャッシュ機能も実装されています。 setUseQueryCache(true/false) をコールすることによって、 クエリをキャッシュし 高速に結果セットが得られる仕組みになっています。 その他、いくつかのバグや不具合に対して より 標準 SQL に準じた修正がされ、 広く普及している MySQL, PostgreSQL, SQLite などの DBMS, RDBMS との互換性が 高くなっています。

このドキュメントは SQL モード について扱います。

Posql は基本的な SQL 言語なら理解します。 しかし、一部の機能については読み飛ばされ、またはエラーとして扱われます。 このドキュメントでは Posql が SQL 言語のどの部分についてサポートしているのか、 もしくはしていないのかを解説します。

このドキュメントは Posql で実装されている SQL 文法の全てではありません。 ドキュメントに収まらない詳細は、 ソースコード "posql.php" 内のクラス "Posql_Parser" を参照してください。

Posql では以下のコマンド/文法を実装しています。


コメント

  コメント ::= SQLコメント | PHPコメント

  SQLコメント ::= -- 単一の行

  PHPコメント ::= // 単一の行 | # 単一の行 | /* 複数の行 */

コメントは SQL コマンドではありませんが、 SQL クエリの中に自由に記述できます。 これらはパースされる際に、単純に無視されます。 コメントはホワイトスペースが置ける文中ならどこからでも記述できます。

SQL のコメントは行末まで有効です。

複数行コメントは何行に渡っても構いません。 新しい SQL ステートメントは、複数行コメントが終わった地点から始められます。


BEGIN TRANSACTION

  SQLステートメント ::= { BEGIN | START } [TRANSACTION [トランザクション名]]

Posql は Version 2.09 から、ロールバックやアトミックなコミットを伴う トランザクションをサポートしました。

トランザクションは、そのブロック間のデータベースの処理が 『全て実行される』か、『全て実行されない』かのどちらかになります。

BEGIN コマンドはトランザクションを初期化し、そのブロックを開始します。 BEGIN が実行された以降の文は全て、 明示的な COMMIT もしくは ROLLBACK が実行されるまで、 単一のトランザクションブロックの中で実行されます。

MySQL との互換性のため BEGIN を START という別名で扱うこともできます。

オプションのトランザクション名は無視されます。 Posql は現時点 (Version 2.17) では ネストしたトランザクションをサポートしていません。 トランザクションの中で別のトランザクションを開始しようとするとエラーになります。

トランザクション中の CREATE DATABASE, DROP DATABASE コマンドは例外であり、トランザクションのサポート対象にはなりません。

トランザクションのブロック内で複数の文を実行することは、 確実にデータの一貫性を保つために役立ちますが、 トランザクション開始時および終了時には 一時的に処理速度や、ディスク使用量に影響がでます。

Posql は現時点 (Version 2.17) で 一時ファイルを生成することはありません。 それはトランザクション時も同じで、 すべて 1 つのデータベース (ファイル) 内で 一時的なバックアップ領域や更新、削除領域を作り、処理しています。 そのため、とくにトランザクションでは処理速度の低下などに影響がでてしまいます。

データベースの操作時に、適切なロック処理 (排他処理) は自動的に行われます。 一貫性を保つための必要性がない限り、 Posql を扱う上でトランザクションは頻繁に行う必要ありません。


COMMIT TRANSACTION

  SQLステートメント ::= { COMMIT | END } [TRANSACTION [トランザクション名]]

COMMIT コマンドは、開始 (BEGIN) されたトランザクションをコミットします。

現在のトランザクション ブロック内で行われた全ての処理を 恒久的なものとして確定し、 処理結果が全てデータベースに実際に反映され、トランザクションを終了します。

トランザクションをアボートするには ROLLBACK を使用してください。 トランザクションが開始されていない状態で COMMIT を発行しても特に問題はありませんが、エラーが発生します。

COMMIT を END という別名で扱うこともできます。

Posql のトランザクションについて詳しい解説は BEGIN セクションで述べています。


CREATE DATABASE

  SQLコマンド ::= CREATE DATABASE [IF NOT EXISTS] データベース名

  データベース名 ::= 物理的なファイルパス

CREATE DATABASE コマンドは、新しいデータベースを作成します。 データベースは 1 つのファイルとして物理的に生成されます。 対象のディレクトリに対し 書き込み権限 (パーミッション) がない場合は、接続タイムアウト、またはエラーになる可能性があります。 データベースとしてファイルが生成されると、 そのパーミッションは 666 (rw-rw-rw-) に設定されます。 データベースにはヘッダー情報とメタ情報が書き込まれます。

IF NOT EXISTS をデータベース名の前に置くと、 作成しようとするデータベースが存在した場合でも エラーが発生しません。 この場合、単に戻り値が 偽 (FALSE) となって返るだけです。

データベースの作成時、Posql はデータベースの拡張子を .php に修正しようと試みます。 これはデータベースに対し、 ダイレクトにアクセスされた場合のセキュリティ上の対処です。 データベースは、サーバーのドキュメントルート外に置くことを推奨しますが、 環境によってはそれが不可能かもしれません。 その場合は拡張子を .php にすることが好ましいです。


CREATE TABLE

  SQLコマンド ::= CREATE TABLE [IF NOT EXISTS] テーブル名 (カラム定義 [, カラム定義]*)

  カラム定義 ::= カラム名 [データ型] [カラム制約条件]*

  データ型 ::= 型名 | 型名 ( 数字 ) | 型名 ( 数字 , 数字 )

  カラム制約条件 ::= PRIMARY KEY | DEFAULT 値

CREATE TABLE コマンドは、新しいテーブルを作成します。 基本的にはキーワード "CREATE TABLE" の後に新しいテーブルの名前、 そしてカラム定義と制約条件を 括弧() で括ったものが続きます。

IF NOT EXISTS を指定することで、テーブルがすでに存在する場合でも、 エラーの発生を防ぐことができます。

個々のカラム定義は、カラム名の後にそのカラムのデータ型があり、 オプションで制約条件が続きます。 ですが、Posql にはデータ型がありません。 型とするならば、それは 実行中の PHP に依存される型になります。 擬似的な型については 型のセクション を参考にしてください。 このため、カラムのデータ型によって そのカラムに格納されるデータが制限されるといったことはありません。 値の最大値という概念もありません。 すべてのカラムは可変長になります。

DEFAULT 制約はデータを挿入する際のデフォルト値を指定します。 デフォルト値は、INSERT コマンドの実行時などで そのカラムの値が省略された場合に適応されます。

PRIMARY KEY (主キー) は、最初のカラムの制約として指定することができます。 内部的には 下で解説される rowid の参照として値を保持します。 PRIMARY KEY は、意図的に変更しない限り 数値型であり auto increment, UNIQUE 制約として扱われます。

単独での INDEX, UNIQUE, CHECK 等は実装されていません。 そのかわり Posql には、以下の 3 つの特別なカラムがあります。

rowid
ユニークな列の ID を保持します。 SQLite の ROWID と似ています。 rowid は常に auto increment および primary key として扱われます。
ctime
生成 (created) された時間 (time) を UNIX 時刻 (PHP での time()) として保持します。
utime
更新 (updated) された時間 (time) を UNIX 時刻 (PHP での time()) として保持します。 列が変更されると、utime は常にその時の UNIX 時刻で値を更新します。

これらの特別なカラムはレコードが変化するとき、常に更新/追加されます。 また、同じ名前のカラム (例えば rowid) を生成しようとする場合、 その名前空間は Posql 側に常に上書きされます。 この 3 つの特別なカラムは、テーブル作成時にカラムの最後に追加されます。

 CREATE TABLE foo (
  id    INTEGER      PRIMARY KEY,
  name  VARCHAR(255) DEFAULT '',
  addr  INT(11)      DEFAULT 0,
  title TEXT
);

上のSQLを実行すると、foo の持つカラムは

  1. id
  2. name
  3. addr
  4. title
  5. rowid
  6. ctime
  7. utime

このような順序で生成されます。
最初のカラム id に PRIMARY KEY を指定していることで、 id は rowid の参照として働きます。

DESCRIBE コマンドを使用することで、 テーブルの定義を参照することができます。

あるテーブルにおいて、カラム数や制約数が勝手に制限されることはありません。 単一の行に格納できるデータのサイズは、デフォルトで 約 2 GB です。 この数値は、行に限らず最大の列数にも影響します。 この値は setMax(), getMax() により設定できます。

テーブルを削除するには DROP TABLE コマンドを使います。


DELETE

  SQLステートメント ::= DELETE FROM テーブル名 [WHERE 評価式]

DELETE コマンドはテーブルからレコードを削除します。 書式としては、"DELETE FROM" コマンドに続けて、 削除したいレコードを持つテーブル名を指定します。

WHERE 句を省略すると、そのテーブルのすべての行が削除されます。 WHERE 句が指定されると、その評価式が 真 (TRUE) となる行だけが削除されます。


DESCRIBE

  SQLステートメント ::= { DESCRIBE | DESC } [テーブル名 | DATABASE]

DESCRIBE コマンドは、現在対象になっているデータベースにおいて、 テーブルの様々な情報を取得します。 テーブル名が省略されると、すべてのテーブルの情報を取得します。 明示的な意味で、テーブル名の省略の代わりに DESCRIBE の後に DATABASE と置くこともできます。

テーブル名が指定されると、 結果セットには そのテーブルが持つ
カラム名 (name)、型 (type)、キー (key)、 デフォルト値 (default)、その他の情報 (extra) が含まれます。

テーブル名を省略または DATABASE を指定すると、 結果セットには
テーブル名またはデータベース名 (name)、 次のシーケンス ID (next_id)、 UNIX 時刻として テーブルまたはデータベースの最終更新時刻 (last_modified)、 現在のテーブルロックを保持しているプロセスの ID (lock_id)、 現在のロックモード (lock_mode)、 CREATE TABLE 時の SQL (sql) が含まれます。


DROP DATABASE

  SQLコマンド ::= DROP DATABASE [IF EXISTS] データベース名

  データベース名 ::= 物理的なファイルパス

DROP DATABASE コマンドは CREATE DATABASE コマンドで作成されたデータベースを物理削除します。 物理削除とは、データベース (ファイル) そのものを削除するということです。 DROP DATABASE 実行後、Posql によりそれを復旧することはできません。

IF EXISTS を指定すると、データベースが存在しなかった場合でも エラーの発生を防ぐことができます。


DROP TABLE

  SQLコマンド ::= DROP TABLE [IF EXISTS] テーブル名

DROP TABLE コマンドは CREATE TABLE コマンドで作成されたテーブルを削除します。 DROP TALBE を実行するとデータベースのメタ情報と、 テーブルデータ全てが物理的に完全に削除されます。

IF EXISTS を指定することで、対象のテーブルが存在しなかった場合でも、 エラーの発生を抑制できます。


  型 ::= NULL | BOOLEAN | NUMBER | TEXT | BLOB

ここで解説する型は、Posql が評価式や関数内で扱う 擬似的な型です。 CREATE TABLE コマンドで、上の型を指定しても 意味はありません。 Posql には 型がありませんが、一部の評価式で必要になる場合があります。 後に解説する typeof 関数や、cast 関数で使用されています。

null
値は NULL です。
boolean
値は TRUE もしくは FALSE です。
number
値は numeric (数えられる) 値です。
text
値は textable もしくは readable (読むことができる) 値です。
blob
値は バイナリ です。

これらの型は、非常にあいまいなものです。 ある特定の値において、型としての情報が必要になった場合には有用かもしれません。


評価式

ここでは単独のコマンドについて解説するのではなく、 ほかのほとんどのコマンドの一部となる 評価式 について解説します。 ここでいう評価式には、あらゆる演算子が含まれます。 冒頭でも述べていますが、ここでの評価式は Posql の実行エンジンが SQL モード での扱われ方になります。

Posql の実行エンジンが PHP モード の場合については、 すべて 動作中の PHP に依存します。 評価式、演算子および全ての関数が含まれます。 PHP が認識する演算子、その優先順位についての詳細は PHP マニュアル を参照してください。

  評価式 ::= 評価式  二項演算子  評価式 |
             評価式  LIKE演算子  評価式 [ESCAPE エスケープ文字] |
             単項演算子  評価式 |
             ( 評価式 ) |
             カラム名 |
             テーブル名 . カラム名 |
             関数名 ( 評価式の並び | * ) |
             評価式 ISNULL |
             評価式 NOTNULL |
             評価式 [NOT] BETWEEN 評価式 AND 評価式 |
             評価式 [NOT] IN ( 値の並び ) |
             評価式 [NOT] IN ( SELECT文 ) |
             ( SELECT文 ) |
             CASE [評価式] { WHEN 評価式 THEN 評価式 }+ [ELSE 評価式] END

  LIKE演算子 ::= LIKE | NOT LIKE

カラム名には CREATE TABLE ステートメントで定義された名前のいずれかを指定します。

Posql は以下の演算子を理解します。 優先順位は上にあるものほど高くなっています。

  ()   ~
  !    NOT
  CASE, WHEN, THEN, ELSE, END
  LIKE  IN  BETWEEN
  *    /    %
  MOD  DIV
  +    -    ||
  <<   >>
  <    <=   >=   <>
  =    ==   !=   <=>  IS
  &    ^    |
  AND  OR  XOR
  ,

Posql のどんな値でも評価式の一部にすることができます。 算術演算においては 『数えられる値』は 整数として扱われます。 等号と不等号にはそれぞれ 2 つの記述のしかたができます。
等号は = または == で表現します。
不等号は != または <> で表現します。
|| 演算子は『文字列の連結』です。 オペランドである 左右 2 つの文字列を結合します。
% 演算子は左辺を右辺で割った余りを求めます。

CASE 式は SQL-92 標準と同等に扱えます。 CASE 式は 一連の条件を評価して、考えられる結果式のうちの 1 つを返します。 CASE 式には 2 つの形式があります。
単純 CASE 式では、1 つの式を一連の単純式と比較して結果を決定します。
検索 CASE 式では、一連の論理式を評価して結果を判定します。
どちらの形式も、ELSE 引数 (省略可) を使用することができます。 CASE は、有効な式を使用できる任意のステートメントや句で使用できます。 たとえば、SELECT、UPDATE、DELETE、SET などのステートメントや、 select_list, WHERE、HAVING などの句で使用できます。

  SELECT   ProductNumber,
      CASE ProductLine
          WHEN 'R' THEN 'Road'
          WHEN 'M' THEN 'Mountain'
          WHEN 'T' THEN 'Touring'
          WHEN 'S' THEN 'School'
          ELSE 'Not for sale'
      END AS Category
  FROM Product 
上の例は CASE 式を使用して、 製品ラインのカテゴリの結果をわかりやすいものに変更します。

Version 2.17 現在では、CASE 式のネスト (CASE 式の中で CASE 式を置くこと) は サポートされていません。

LIKE 演算子はワイルドカードによる比較を行います。 右辺のオペランドにはそのパターンを指定します。
LIKE では、以下の 2 つのワイルドカード文字を パターンで使用することができます。

%
0 文字以上の文字にマッチする。
_
任意の 1 文字に明確にマッチする。

ワイルドカード文字のリテラルにマッチさせるには、 エスケープ文字で優先させます。 ESCAPE 文字を指定しない場合は、 ESCAPE 文字はバックスラッシュ (\) と仮定されます。

\%
パーセント文字 (%) にマッチする。
\_
アンダースコア (_) にマッチする。

異なるエスケープ文字を指定するには、ESCAPE 句を使用します。

 SELECT '100% OFF' LIKE '100|%_OF_' ESCAPE '|';

LIKE 演算子は大文字小文字を区別しません。

Posql->createFunction() API を使用することで、 LIKE の内部実装をオーバーライドすることができます。

評価式の中の IN 演算子、 または EXISTS, ANY, SOME, ALL 演算子の右辺オペランド、 もしくはスカラー値の並びに SELECT サブクエリ (副問い合わせ) を置くことができます。
サブクエリの結果セットのカラム数は 1 つのみが評価されます。
SELECT が IN 演算子の右辺オペランドの場合、 左辺の評価結果が SELECT の結果セット内に含まれると 真 (TRUE) が返されます。 IN 演算子の前に NOT が置かれると、その意味は反対になります。
SELECT サブクエリを他の評価式の中に置くと、 その SELECT の結果の最初の行が評価式で使われる値になります。 SELECT が複数の行を返した場合、先頭の行以外はすべて無視されます。 SELECT の結果が空の場合、その値は NULL になります。
評価式の中の SELECT サブクエリ は、 他のすべての処理が行われる前に一度だけ評価されます。
Posql は、入れ子になった (ネストした) サブクエリをサポートしています。 サブクエリのネストに対して制限はありません。


関数

前セクションでも述べていますが、ここでの関数は Posql の実行エンジンが SQL モード での扱われ方になります。

Posql の実行エンジンが PHP モード の場合については、 すべて 動作中の PHP に依存します。 評価式、演算子および全ての関数が含まれます。 PHP モードでは、ファイル IO、入出力、その他のプログラム制御関数の一部は デフォルトで使用不可になっています。 これは最低限の SQL ステートメントに対するバリデートです。 これらの関数についての詳細は同梱されている API マニュアル Posql API Reference #getDisableFunctions 内の Posql->getDisableFunctions, Posql->setDisableFunctions を参照してください。

Posql では 以下の関数はデフォルトで有効になっています。 また、実装されている関数は SQLite で実装されている関数を モデルにしたものが多く含まれています。 SQL99 で定義されている関数は ほぼすべてが実装されています。

Posql->createFunction() API を使用することで、 データベースエンジンに任意の関数を追加、またはオーバーライドすることができます。 API の詳細については、同梱されているマニュアル Posql API Reference を参照してください。

Posql は 全ての関数において Unicode をサポートしています。 文字列関数については、文字列は Unicode として扱われます。 文字列は バイト単位ではなく 1 文字単位で扱われます。

以下は SQLite をモデルにした関数です。

abs(X)
引数 X の絶対値を返します。
coalesce(X,Y,...)
引数のうち NULL でない最初の値を返します。 与えられたすべての引数が NULL の場合は NULL を返します。 2 つ以上の引数が必要です。
hex(X)
引数 X は BLOB として解釈されます。 X の バイト列を 16 進数で返します。
ifnull(X,Y)
前述の coalesce() のエイリアスとなっています。
last_insert_rowid()
Posql データベース に直近に挿入されたレコードの rowid の値を返します。 接続上において、まだ挿入されていない場合は NULL が返ります。 この関数が返す値は Posql->getLastInsertId() API メソッドから 返されるものと同じです。
length(X)
X の文字列長を文字数で返します。 X が BLOB の場合は、バイト数を返します。
like(X,Y,Z)
この関数は SQL の "Y LIKE X [ESCAPE Z]" という書式を実装します。
lower(X)
文字列 X をすべて小文字に変換して返します。 Unicode として扱われるため、マルチバイト文字にも適応されます。
ltrim(X,Y)
引数 X を対象とし、 文字列引数 Y のあらゆる文字が 前方から取り除かれた値を返します。 引数 Y が省略されると、ホワイトスペースが削除されます。
max(X,Y,...)
引数のうち最大の値を返します。 引数には数値だけでなく文字列も指定できます。 この関数は 集約関数の max() とは別のものです。
min(X,Y,...)
引数のうち最小の値を返します。 引数には数値だけでなく文字列も指定できます。 この関数は 集約関数の min() とは別のものです。
nullif(X,Y)
引数が異なる場合は最初の引数を返し、 そうでなければ NULL を返します。
posql_version()
動作中の Posql データベースクラスのバージョン文字列を返します。 例えば '2.17' のような値を返します。
random(X,Y)
引数 X を最小値、Y を最大値とし、その数値間の乱数を返します。 引数が省略されると -9999999999 から +9999999999 の間の乱数を返します。
replace(X,Y,Z)
すべての引数は文字列として扱われます。 引数 X の中に含まれる文字列 Y を すべて Z に変換し、その結果を返します。
round(X,Y)
数値 X を少数以下 Y 桁で四捨五入します。 引数 Y を省略すると 0 と見なされます。
rtrim(X,Y)
引数 X を対象とし、 文字列引数 Y のあらゆる文字が 後方から取り除かれた値を返します。 引数 Y が省略されると、ホワイトスペースが削除されます。
soundex(X)
文字列 X の soundex エンコーディング計算します。 引数が NULL の場合は文字列 '?000' が返されます。
strftime(format [, time])
日時を表す文字列 time を、 変換指定子を含む引数 format にフォーマットして返します。 time が省略されると現在の日時が使用されます。 使用できる変換指定子についての詳細は、 PHP マニュアル (strftime) を参照してください。
substr(X,Y,Z)
引数 X を入力文字列、Y をオフセット (文字数)、 Z を文字の長さとし、部分文字列を返します。 Y が負の数の場合、部分文字列の最初の文字は左側からではなく 右側から数えられます。 X の最初の文字のオフセットは 1 です ( 0 からではありません)。 X が BLOB の場合は、Y、Z はバイト数として扱われます。 文字列の場合は Unicode 文字単位で扱われます。
trim(X,Y)
引数 X を対象とし、 文字列引数 Y のあらゆる文字が 前方および後方から取り除かれた値を返します。 引数 Y が省略されると、ホワイトスペースが削除されます。
typeof(X)
引数 X の型を返します。 返される値は 型のセクション を参照してください。
upper(X)
文字列 X をすべて大文字に変換して返します。 Unicode として扱われるため、マルチバイト文字にも適応されます。

以下は SQL99 で定義されている関数です。

bit_length(value)
引数 value のビット数を返します。
char_length(value)
引数 value の文字数を返します。 文字単位で数えられます。value が BLOB の場合はバイト数になります。
extract(datepart FROM expr)
引数 expr から datepart に指定した時間単位だけを抽出します。 datepart には時間単位を指定します。 時間単位は YEAR, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR, TIMEZONE_MINUTE のいずれかを指定します。
octet_length(value)
引数 value のオクテット数を返します。
position(substring IN target_string)
position(substring, target_string)
文字列 target_string 内から部分文字列 substring で始まる位置を返します。 先頭の文字列の位置は 1 です ( 0 からではありません)。 文字単位で数えられます。引数が BLOB の場合はバイト数になります。
concatenate(string1 || string2)
指定した 2 つの文字列を結合します
convert(string USING charset [, source_charset])
convert(string, charset, source_charset)
文字列 string を対象とし、引数 charset の文字コードに変換します。 UTF-8 など、ハイフン (-) 等の記号が必要な場合は 引用符 (') で囲い文字列で表現します。 カンマ (,) で区切った指定もできます。 source_charset は元 (string) の文字コードを指定することができます。 省略すると自動で文字コードを検出します。
SELECT CONVERT('あいう' USING 'SJIS');
上の例は、文字列 'あいう' を Shift_JIS に変換します。
substring( string FROM position [FOR length] [COLLATE collation])
substring(string, position [, length [, collation]])
文字列の一部を抽出します。 文法の記述方法が変わりますが、結果的に前述の substr 関数と同じ動作をします。 collation は 現バージョン (Version 2.17) ではサポートされていません。 collation を指定しても無視されます。
SELECT SUBSTRING('ABCDEFG', 3, 4);
   -> 'CDEF'
SELECT SUBSTRING('ABCDEFG', -5, 4);
   -> 'CDEF'
上の 2 つの例は、通常のカンマ (,) で区切った指定方法です。
SELECT SUBSTRING('ABCあいうABC' FROM 5 FOR 2);
   -> 'いう'
上の例は、SQL99 文法を使用した例です。
translate(string, from_chars USING to_chars)
translate(string, from_chars, to_chars)
引数 string を対象とし、文字列 to_chars から 文字列 from_chars に変換します。
SELECT TRANSLATE('ABCあいうABC', 'ABC', 'ABC');
   -> 'ABCあいうABC'
上の例での 'ABC' は全角文字であることに注意してください。 1 文字単位で各文字が変換されています。
SELECT TRANSLATE('ABCあいうABC', 'ABCあ' USING 'ABCa');
   -> 'ABCaいうABC'
上の例も同様です。SQL99 文法のように USING を記述したものです。
trim( [ [ { LEADING | TRAILING | BOTH } ] { removal_string } FROM ] target_string [COLLATE collation] )
文字列の前後から指定した文字を削除します。 SQL99 文法を使用した記述と、カンマ (,) で区切った記述は 動作が異なります。 カンマ (,) で区切ると、前述の trim 関数と同じ動作をします。 SQL99 文法で指定した場合は、文字列そのものを探し削除します。 collation は 現バージョン (Version 2.17) ではサポートされていません。 collation を指定しても無視されます。 下に いくつか例を示します。
SELECT TRIM('  bar   ');
   -> 'bar'
上の例は、通常の trim 関数と同じ動作になり、 文字列の前後からホワイトスペースを取り除きます。
SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
   -> 'barxxx'
上の例は LEADING (前方) から 'x' を削除します。
SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
   -> 'bar'
上の例は BOTH (両方) から 'x' を削除します。
SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
   -> 'barx'
上の例は TRAILING (後方) から 'xyz' を削除します。

その他の関数

cast(expr AS type)
cast(expr, type)
引数 expr の型を type に変換した値を返します。 この関数での 有効な型については、 型のセクション を参照してください。
concat(...)
引数で与えられたものを、すべて文字列として連結して返します。 引数の中に NULL があった場合は NULL が返されます。
now( [time] )
現在の日時を 'YYYY-MM-DD HH:MM:SS' の形式で返します。 引数 time が数値で与えられた場合、 その数値を Unix タイムとみなし その日時を返します。
nvl(expr1, expr2)
expr1 が NULL なら expr2 の値を返します。 expr1 が NULL でない場合は expr1 を返します。 Oracle との互換性のための関数です。


集約関数

Posql では以下の集約関数が使用可能です。

avg(X)
グループの中ですべての X の値の平均を返します。
count(X)
グループの中において NULL でない X の数を返します。
count(*)
グループにおける行の総数を返します。
max(X)
グループにおけるすべての値のうち最大のものを返します。
min(X)
グループにおけるすべての値のうち最小のものを返します。
sum(X)
グループにおけるすべての値の合計を返します。

INSERT

  SQLステートメント ::= INSERT [OR 衝突時アルゴリズム] INTO テーブル名 [(カラム[, カラム ...])] VALUES (値 [, 値 ...]) |
                        INSERT [OR 衝突時アルゴリズム] INTO テーブル名 [(カラム[, カラム ...])] SELECT文

  衝突時アルゴリズム ::= REPLACE

INSERT コマンドは、指定されたテーブルに単一の新しい列を挿入します。 カラムの並びが省略された場合、CREATE TABLE 時の カラムの並び順通りに補完されます。 カラムの並びが指定された場合、値の数が指定されたカラム数と一致する必要があります。 テーブルのカラムがカラム並びに現れない場合はデフォルト値がセットされます。 デフォルト値が指定されていない場合には NULL がセットされます。

INSERT の後に OR に続けて、制約衝突を解決するために使われるアルゴリズムを指定できます。 アルゴリズムは Version 2.17 現在、REPLACE のみサポートされています。

REPLACE
UNIQUE 制約違反が起こった場合、 制約違反の原因となった既存の行は、 現在行の INSERT に先立って削除されます。 そのため、INSERT は常に行われコマンドは通常動作を続けます。 Posql の UNIQUE 制約違反は PRIMARY KEY の衝突です。 カラムが省略された場合は デフォルト値が使われます。 デフォルト値が存在しない場合は NULL になります。

以下に INSERT の例を示します。

 INSERT INTO my_table (id, name, message) VALUES (1, 'foo', 'Hello');

INSERT ステートメントの中で SELECT サブクエリを使用する書式は、 SELECT ステートメントからのデータを取り込み、 取得した列を対象のテーブルに挿入します。 SELECT サブクエリはシンプルなものでも複合的なものでも扱うことができます。

 INSERT INTO my_table SELECT sub_id, sub_name, NULL FROM sub_table;

ROLLBACK TRANSACTION

  SQLステートメント ::= ROLLBACK [TRANSACTION [トランザクション名]]

ROLLBACK コマンドは、 データベースを現在のトランザクションが開始される前の状態に戻します。

ROLLBACK は BEGIN によって開始された トランザクションをロールバックし、 そのトランザクション ブロック内で行われた全ての更新を廃棄し、 トランザクションを終了します。

トランザクションを正常に終了させるには COMMIT を使用してください。 トランザクションが開始されていない状態で ROLLBACK を発行しても問題はありませんが、エラーが発生します。

Posql のトランザクションについて詳しい解説は BEGIN セクションで述べています。


REPLACE

  SQLステートメント ::= REPLACE INTO テーブル名 [(カラム[, カラム ...])] VALUES (値 [, 値 ...]) |
                        REPLACE INTO テーブル名 [(カラム[, カラム ...])] SELECT文

REPLACE コマンドは、 INSERT コマンドと同種である "INSERT OR REPLACE" の別名です。 これは MySQL との互換性のために提供されています。 詳細は INSERT コマンドの説明を参照してください。


SELECT

  SQLステートメント ::= SELECT [ALL | DISTINCT] 結果セット [FROM テーブルの並び]
                        [WHERE 評価式]
                        [GROUP BY 評価式の並び]
                        [HAVING 評価式]
                        [合成演算子 SELECT文]*
                        [ORDER BY ソート評価式の並び]
                        [LIMIT [整数 | ALL] [ { OFFSET | , } 整数]]

  結果セット ::= 結果のカラム [, 結果のカラム]*

  結果のカラム ::= * | テーブル名 . * | 評価式 [[AS] エイリアス名]

  テーブルの並び ::= テーブル名 [結合演算子 テーブル名 結合時の引数]*

  テーブル名 ::= テーブル名 [[AS] エイリアス名] |
                 (SELECT文) [[AS] エイリアス名]

  結合演算子 ::= , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN

  結合時の引数 ::= [ON 評価式] | [USING (カラムの並び)]

  ソート評価式の並び ::= カラム名 [ソート順] [, カラム名 [ソート順]]*

  ソート順 ::= ASC | DESC

  合成演算子 ::= {UNION | INTERSECT | EXCEPT} [ALL]

SELECT コマンドはデータベースの問い合わせを行います。 SELECT の結果は 0 個以上の行からなり、 それぞれの行は一定の個数のカラムで構成されます。 結果セット中のカラム数は SELECT と FROM キーワードの間の評価式の並びにより指定されます。 結果セットの評価式に * を指定すると、 その 1 つの評価式は指定されたすべてのテーブルのすべてのカラムで置き換えられます。

DISTINCT を指定すると、 結果セットのそれぞれの行が (ユニークになり) 異なった値を持つようになります。 デフォルトではすべての行が返されますが、 明示的に ALL を置くこともできます。

クエリは FROM キーワードの後に指定された 1 つ以上のテーブルに対して行われます。 複数のテーブル名がカンマ(,) で区切って指定されていた場合、 クエリはそれぞれのテーブルの直積 (CROSS JOIN) に対して行われます。 結合の指定については、SQL92 における JOIN の書式に従うこともできます。 FROM 句の中には、句を括弧で括った SELECT サブクエリ (副問い合わせ) を置くこともできます。

FROM 句は省略することができます。 省略すると、SELECT リスト (結果セット) のみが評価されます。

WHERE 句を指定すると、その評価式が 真 (TRUE) となるレコードのみが抽出されます。

GROUP BY 句を指定すると、結果セットの中の1つ以上の行を結合し、 出力時に 1 行とすることができます。 これは結果セットの中に集約関数がある場合、特に有用です。

HAVING 句を指定することで、 GROUP BY 句によってグループ化された結果セットを 評価式が真となるレコードのみに更に絞り込むことができます。 GROUP BY 句を使用しないで HAVING を使用することもできます。

ORDER BY 句を指定すると、出力行はソートされます。 ORDER BY の引数はカラム名の並びであり、これがソート時のキーとして使われます。 ソート評価式の後にオプションで、ASC (昇順) または DESC (降順) を指定することにより ソート順を指定できます。

LIMIT 句は結果セットとして返される行数の上限を設定します。 限度数 LIMIT を指定すると、 指定した行数より多くの行が返されることはありません (問い合わせの結果によって、指定より少ないことはあります)。 LIMIT ALL は、LIMIT 句を省略した場合と同じです。 LIMIT 整数 の後にカンマ(,) を置き、その次に整数を指定すると、 その 2 つの数値引数のうち、最初の物は返される最初の行のオフセットを指定し、 2 つめの物は返される行の最高数を指定します。 冒頭の行のオフセットは 0 です。(1 ではありません) 結果セットの先頭からスキップする行数を OFFSET として指定できます。 OFFSET 0 は、OFFSET 句を省略した場合と同じです。 OFFSET および LIMIT の両者が指定された場合、 OFFSET 文の行をスキップしてから、返される LIMIT 行を数え始めます。 PostgreSQL との互換性として、 LIMIT 整数 OFFSET 整数 構文もサポートしています。

複合 SELECT は 2 つ以上の単純 SELECT が UNION, INTERSECT, EXCEPT のいずれかの演算子により結合された形式です。 複合 SELECT においては、後続のすべての SELECT で同じ数の結果カラムを指定しなければなりません。 複合 SELECT の最後にひとつの ORDER BY 句を置くことができます。 UNION 演算子は、複数の SELECT の結果を右側または左側に対して結合します。 INTERSECT 演算子は左側と右側の SELECT 結果の交差を返します。 EXCEPT は左側の SELECT 結果から右側の SELECT 結果の差を返します。 ALL を省略すると、すべての結果行はそれぞれユニークになります。 ALL を指定すると重複行も存在するようになります。 3 つ以上の SELECT が合わさった場合、それらは左側から右側の順にグループ化されます。


UPDATE

  SQLステートメント ::= UPDATE テーブル名 SET 代入式 [, 代入式]* [WHERE 評価式]

  代入式 ::= カラム名 = 評価式

UPDATE コマンドはテーブル中の選択された行について、その値を変更します。 UPDATE におけるそれぞれの代入式は等号 (=) の左辺にカラム名、 右辺に任意の評価式を指定します。 WHERE 句を指定すると、UPDATE 対象の行を制限することができます。


VACUUM

  SQLステートメント ::= VACUUM

VACUUM コマンドは SQLite における拡張機能であり、 それは PostgreSQL における同様のコマンドをモデルにした機能であり、 その機能をモデルにした Posql の拡張機能です。 VACUUM が実行されると、そのときに対象とされているデータベースを 物理的に最適化することとみなし、それを実行します。


キーワード

以下のキーワードは Posql により使われています。 ほとんどのものは SQL92 で予約語となっているか、 予約語となり得るものとしてリストアップされています。 Posql ではキーワードは予約されていませんが、識別子として衝突する可能性があります。 Posql ではキーワードの大文字小文字は区別されません。

ALL AND ANY AS ASC AUTO_INCREMENT BEGIN BETWEEN BY CASE CHECK COLLATE COMMIT CROSS DATABASE DEFAULT DELETE DESC DESCRIBE DISTINCT DROP ELSE END EXCEPT EXISTS FALSE FOR FOREIGN FROM FULL GROUP HAVING IN INDEX INNER INSERT INTERSECT INTO IS JOIN KEY LEFT LIKE LIMIT NATURAL NOT NULL OFFSET ON OR ORDER OUTER PRIMARY RIGHT ROLLBACK SELECT SET SOME START TABLE TRANSACTION TRUE UNION UNIQUE UPDATE USE USING VACUUM VALUES WHEN WHERE XOR

Special columns

rowid ctime utime

Special words

POSQL POSQL_*


その他のドキュメントとマニュアル

主なドキュメント、およびマニュアルは以下のリンクに含まれています。