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 ステートメントは、複数行コメントが終わった地点から始められます。
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 を扱う上でトランザクションは頻繁に行う必要ありません。
SQLステートメント ::= { COMMIT | END } [TRANSACTION [トランザクション名]]
COMMIT コマンドは、開始 (BEGIN) されたトランザクションをコミットします。
現在のトランザクション ブロック内で行われた全ての処理を 恒久的なものとして確定し、 処理結果が全てデータベースに実際に反映され、トランザクションを終了します。
トランザクションをアボートするには ROLLBACK を使用してください。 トランザクションが開始されていない状態で COMMIT を発行しても特に問題はありませんが、エラーが発生します。
COMMIT を END という別名で扱うこともできます。
Posql のトランザクションについて詳しい解説は BEGIN セクションで述べています。
SQLコマンド ::= CREATE DATABASE [IF NOT EXISTS] データベース名 データベース名 ::= 物理的なファイルパス
CREATE DATABASE コマンドは、新しいデータベースを作成します。 データベースは 1 つのファイルとして物理的に生成されます。 対象のディレクトリに対し 書き込み権限 (パーミッション) がない場合は、接続タイムアウト、またはエラーになる可能性があります。 データベースとしてファイルが生成されると、 そのパーミッションは 666 (rw-rw-rw-) に設定されます。 データベースにはヘッダー情報とメタ情報が書き込まれます。
IF NOT EXISTS をデータベース名の前に置くと、 作成しようとするデータベースが存在した場合でも エラーが発生しません。 この場合、単に戻り値が 偽 (FALSE) となって返るだけです。
データベースの作成時、Posql はデータベースの拡張子を .php に修正しようと試みます。 これはデータベースに対し、 ダイレクトにアクセスされた場合のセキュリティ上の対処です。 データベースは、サーバーのドキュメントルート外に置くことを推奨しますが、 環境によってはそれが不可能かもしれません。 その場合は拡張子を .php にすることが好ましいです。
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) を生成しようとする場合、 その名前空間は Posql 側に常に上書きされます。 この 3 つの特別なカラムは、テーブル作成時にカラムの最後に追加されます。
CREATE TABLE foo ( id INTEGER PRIMARY KEY, name VARCHAR(255) DEFAULT '', addr INT(11) DEFAULT 0, title TEXT );
上のSQLを実行すると、foo の持つカラムは
このような順序で生成されます。
最初のカラム id に PRIMARY KEY を指定していることで、
id は rowid の参照として働きます。
DESCRIBE コマンドを使用することで、 テーブルの定義を参照することができます。
あるテーブルにおいて、カラム数や制約数が勝手に制限されることはありません。 単一の行に格納できるデータのサイズは、デフォルトで 約 2 GB です。 この数値は、行に限らず最大の列数にも影響します。 この値は setMax(), getMax() により設定できます。
テーブルを削除するには DROP TABLE コマンドを使います。
SQLステートメント ::= DELETE FROM テーブル名 [WHERE 評価式]
DELETE コマンドはテーブルからレコードを削除します。 書式としては、"DELETE FROM" コマンドに続けて、 削除したいレコードを持つテーブル名を指定します。
WHERE 句を省略すると、そのテーブルのすべての行が削除されます。 WHERE 句が指定されると、その評価式が 真 (TRUE) となる行だけが削除されます。
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)
が含まれます。
SQLコマンド ::= DROP DATABASE [IF EXISTS] データベース名 データベース名 ::= 物理的なファイルパス
DROP DATABASE コマンドは CREATE DATABASE コマンドで作成されたデータベースを物理削除します。 物理削除とは、データベース (ファイル) そのものを削除するということです。 DROP DATABASE 実行後、Posql によりそれを復旧することはできません。
IF EXISTS を指定すると、データベースが存在しなかった場合でも エラーの発生を防ぐことができます。
SQLコマンド ::= DROP TABLE [IF EXISTS] テーブル名
DROP TABLE コマンドは CREATE TABLE コマンドで作成されたテーブルを削除します。 DROP TALBE を実行するとデータベースのメタ情報と、 テーブルデータ全てが物理的に完全に削除されます。
IF EXISTS を指定することで、対象のテーブルが存在しなかった場合でも、 エラーの発生を抑制できます。
型 ::= NULL | BOOLEAN | NUMBER | TEXT | BLOB
ここで解説する型は、Posql が評価式や関数内で扱う 擬似的な型です。 CREATE TABLE コマンドで、上の型を指定しても 意味はありません。 Posql には 型がありませんが、一部の評価式で必要になる場合があります。 後に解説する typeof 関数や、cast 関数で使用されています。
これらの型は、非常にあいまいなものです。 ある特定の値において、型としての情報が必要になった場合には有用かもしれません。
ここでは単独のコマンドについて解説するのではなく、 ほかのほとんどのコマンドの一部となる 評価式 について解説します。 ここでいう評価式には、あらゆる演算子が含まれます。 冒頭でも述べていますが、ここでの評価式は 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
Version 2.17 現在では、CASE 式のネスト (CASE 式の中で CASE 式を置くこと) は サポートされていません。
LIKE 演算子はワイルドカードによる比較を行います。
右辺のオペランドにはそのパターンを指定します。
LIKE では、以下の 2 つのワイルドカード文字を
パターンで使用することができます。
ワイルドカード文字のリテラルにマッチさせるには、 エスケープ文字で優先させます。 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 をモデルにした関数です。
以下は SQL99 で定義されている関数です。
SELECT CONVERT('あいう' USING 'SJIS');上の例は、文字列 'あいう' を Shift_JIS に変換します。
SELECT SUBSTRING('ABCDEFG', 3, 4); -> 'CDEF'
SELECT SUBSTRING('ABCDEFG', -5, 4); -> 'CDEF'上の 2 つの例は、通常のカンマ (,) で区切った指定方法です。
SELECT SUBSTRING('ABCあいうABC' FROM 5 FOR 2); -> 'いう'上の例は、SQL99 文法を使用した例です。
SELECT TRANSLATE('ABCあいうABC', 'ABC', 'ABC'); -> 'ABCあいうABC'上の例での 'ABC' は全角文字であることに注意してください。 1 文字単位で各文字が変換されています。
SELECT TRANSLATE('ABCあいうABC', 'ABCあ' USING 'ABCa'); -> 'ABCaいうABC'上の例も同様です。SQL99 文法のように USING を記述したものです。
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' を削除します。
その他の関数
集約関数
Posql では以下の集約関数が使用可能です。
SQLステートメント ::= INSERT [OR 衝突時アルゴリズム] INTO テーブル名 [(カラム[, カラム ...])] VALUES (値 [, 値 ...]) | INSERT [OR 衝突時アルゴリズム] INTO テーブル名 [(カラム[, カラム ...])] SELECT文 衝突時アルゴリズム ::= REPLACE
INSERT コマンドは、指定されたテーブルに単一の新しい列を挿入します。 カラムの並びが省略された場合、CREATE TABLE 時の カラムの並び順通りに補完されます。 カラムの並びが指定された場合、値の数が指定されたカラム数と一致する必要があります。 テーブルのカラムがカラム並びに現れない場合はデフォルト値がセットされます。 デフォルト値が指定されていない場合には NULL がセットされます。
INSERT の後に OR に続けて、制約衝突を解決するために使われるアルゴリズムを指定できます。 アルゴリズムは Version 2.17 現在、REPLACE のみサポートされています。
以下に 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;
SQLステートメント ::= ROLLBACK [TRANSACTION [トランザクション名]]
ROLLBACK コマンドは、 データベースを現在のトランザクションが開始される前の状態に戻します。
ROLLBACK は BEGIN によって開始された トランザクションをロールバックし、 そのトランザクション ブロック内で行われた全ての更新を廃棄し、 トランザクションを終了します。
トランザクションを正常に終了させるには COMMIT を使用してください。 トランザクションが開始されていない状態で ROLLBACK を発行しても問題はありませんが、エラーが発生します。
Posql のトランザクションについて詳しい解説は BEGIN セクションで述べています。
SQLステートメント ::= REPLACE INTO テーブル名 [(カラム[, カラム ...])] VALUES (値 [, 値 ...]) | REPLACE INTO テーブル名 [(カラム[, カラム ...])] SELECT文
REPLACE コマンドは、 INSERT コマンドと同種である "INSERT OR REPLACE" の別名です。 これは MySQL との互換性のために提供されています。 詳細は INSERT コマンドの説明を参照してください。
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 が合わさった場合、それらは左側から右側の順にグループ化されます。
SQLステートメント ::= UPDATE テーブル名 SET 代入式 [, 代入式]* [WHERE 評価式] 代入式 ::= カラム名 = 評価式
UPDATE コマンドはテーブル中の選択された行について、その値を変更します。 UPDATE におけるそれぞれの代入式は等号 (=) の左辺にカラム名、 右辺に任意の評価式を指定します。 WHERE 句を指定すると、UPDATE 対象の行を制限することができます。
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_*
主なドキュメント、およびマニュアルは以下のリンクに含まれています。