このドキュメントでは、EBX® の構造化照会言語 (SQL) のクエリと式について説明します。EBX® は、1 つ以上のテーブルから選択された行を取得するための標準 SQL クエリをサポートしています。一部の EBX® SQL 言語機能は、標準の拡張機能です。サポートされている EBX® SQL 構文には、テーブル式 (SELECT、FROM、WHERE、GROUP BY、および HAVING 句)、DISTINCT、ORDER BY、LIMIT、および OFFSET、クエリの組み合わせ (UNION [ALL])、および WITH (RECURSIVE修飾子を除く) が含まれます。
この API の目的は、よく知られた標準を使用して EBX® からデータを取得する機能を開発者に提供することです。
EBX® SQL は Java API を介して、特に
クラスからアクセスできます。クエリはパラメーターもサポートしています。Query
を参照してください。Query.setParameter
クエリには、単一のデータセットまたは複数のデータセットを含めることができます。クエリの作成方法の詳細については、
を参照してください。QueryBuilder
次のセクションでは、EBX® の概念の SQL へのマッピングについて詳しく説明します。
EBX® テーブルは、SQL テーブルに自然にマッピングされます。データモデルには、同じ名前の EBX® テーブルが複数存在する場合があります。このあいまいさは、テーブルがグループにある場合に発生する可能性があります。あいまいさを取り除くには、二重引用符で囲まれたテーブルのフルパスを使用します (たとえば、"my_group/my_table"
は "other_group/my_table"
と競合しなくなります)。データモデル内で一意のテーブルのエンティティ名を使用することもできます。テーブル名は、エンティティ名または別のテーブル名と競合しない場合にのみ使用できます。
SQL 標準では、テーブルの構造は 1 つ以上の列で構成されます。親が EBX® テーブルであるすべてのエレメント (フィールドを含む) は、列にマップされます。
SQL 標準では、テーブルの構造は 1 つ以上の列で構成されます。親が EBX® テーブルであるすべてのエレメントは、列にマップされます。これには、SQL 構造タイプとして SQL 列にマッピングされるグループが含まれます。
SQL 標準では、複数のテーブル間でのデータのクエリは、外部キーと主キーに基づいています。EBX® のこれらの概念は、SQL の概念と似ています。したがって、SQL のテーブル間の結合は、EBX® 外部キーと主キーを使用して実行することもできます。
SQL を介したデータの処理は、そのデータ型に大きく依存します。たとえば、述語では、列が同じ SQL データ型を持っている場合にのみ列を比較できます。SQL データ型は、データモデルの型に応じた型です。
サポートされている標準 SQL データ型
この表は、EBX® でサポートされている XML スキーマで定義されているすべての単純型と、それに対応する標準 SQL 型を示しています。
XML スキーマタイプ | SQL タイプ | Java タイプ | 注意 |
---|---|---|---|
|
| ||
|
| 値:TRUE、FALSE、UNKNOWN | |
|
| ||
|
| ||
|
| 返される Date の日付部分は常に「1970/01/01」に設定されます。 | |
|
| 返される Date の時間部分は、常に 1 日の始まり (つまり、「00:00:00」) に設定されます。 | |
|
| ||
|
| ||
|
|
EBX® は、事前定義された単純データ型を提供します。これらのタイプは、内部スキーマ common-1.0.xsd
によって定義されます。それらの定義については、EBX® で定義された拡張単純型のセクションで詳しく説明しています。
XML スキーマタイプ | SQL タイプ | Java クラス |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| VARCHAR | 内部クラス |
|
|
|
|
|
|
|
|
|
リストは SQL 配列として処理されます。対応する Java クラスは java.util.List
です。
注意:複数値フィールドでフィルタリングするには、まず UNNEST
SQL 演算子を使用して「正規化」する必要があります (これはパフォーマンスの観点から推奨されず、大規模なテーブルでは非常に非効率になる可能性があることに注意してください)。
SELECT T.s FROM myTable T, UNNEST(T.list) as L(item) WHERE L.item = 'test'
SELECT p.name FROM Person p, UNNEST(p.addresses) AS ad(street, city) WHERE ad.city = 'Paris'
複合型は SQL 構造化型として扱われます。対応する Java クラスは Object[]
です。これは、外部キー (以下を参照) とグループに適用されます。これらは、複合型によって定義されているためです。ドット演算子を使用して、SQL 構造型内のフィールドにアクセスします。たとえば、複合型の場合は、address.street
を使用してフィールド address
のフィールド street
にアクセスします。クエリで複合型のサブフィールドを参照する場合は、常にテーブル名またはエイリアスを使用する必要があります。
SELECT customer.address.street FROM customer
SELECT c.address.street FROM customer c
EBX® では、テーブルに複数のフィールドで構成される主キーを含めることができます。外部キーは、osd:tableRef
宣言のある単一のフィールドによって定義されます。標準の SQL 構文が拡張され、対象の主キーフィールドの値が抽出されるようになりました。外部キーの抽出の例では、次の SQL 式が有効です。
tableA.fkb.id = 123
YEAR(tableA.fkb.date) > 2018
主キーが 1 つのフィールドのみで構成されている場合でも、値にアクセスするにはフィールドの名前を指定する必要があります。たとえば、主キーが単一の id
で構成されている場合、tableA.fkb.id = 123
のように、値にアクセスするには fkb.id
を使用する必要があります。
tableRef の使用法の典型的な例は、SQL 結合です。
SELECT * FROM employee JOIN department ON employee.fkDept.id = department.id
または、参照されるテーブルに複合主キーがある場合
SELECT * FROM tableA JOIN tableB ON tableA.fkB.id1 = tableB.id1 AND tableA.fkB.id2 = tableB.id2
同様に、FK_AS_STRING
ビルトイン関数と $pk
システム列を使用して、キーの文字列表現を介して同じ JOIN を実行できます。
SELECT * FROM tableA JOIN tableB ON FK_AS_STRING(tableA.fkB) = tableB."$pk"
EBX® SQL は、一部のメタデータ情報へのアクセスも提供します。これらのフィールドは、明示的に参照されない限り、SQL ステートメントによって返されません。たとえば、「SELECT * FROM ...
」はメタデータフィールドを返しませんが、「SELECT metadataField FROM ...
」は返します。
名前 | 説明 | SQL タイプ | Java クラス | 例 |
---|---|---|---|---|
| レコードの |
|
|
|
| レコードの |
|
|
|
| レコードを変更した |
|
|
|
| レコードの |
|
|
|
テーブルに存在するフィールドとは別に、EBX® SQL はいくつかの追加のシステム列を提供します。これらの列は、明示的に参照されていない限り、SQL ステートメントによって返されません。たとえば、「SELECT * FROM ...
」はシステム列を返しませんが、「SELECT systemColumnName FROM ...
」は返します。
名前 | 説明 | SQL タイプ | Java クラス | 例 |
---|---|---|---|---|
| テーブルレコードを表す | 内部型 |
|
|
| レコードの主キーの文字列表現。 以下も参照してください。 |
|
|
|
演算子は、比較や算術演算などの演算を実行するために、主に SQL ステートメントの WHERE 句で使用される予約語または文字です。これらの演算子は、SQL ステートメントで条件を指定し、ステートメントで複数の条件の接続詞として機能するために使用されます。EBX® は、ほとんどの SQL 標準演算子と関数をサポートしています。一部の関数と演算子は、オプションのパラメーターを持つことができます。ドキュメントでは、それらは角括弧で囲まれています。一般に、演算子と関数には 5 つのタイプがあります。
次の表は、すべての演算子の結合性と優先順位を、高い順に示しています。
演算子 | 結合性 |
---|---|
. | 左 |
[] (配列エレメント) | 左 |
+- (単項プラス、マイナス) | 右 |
* / % | 左 |
+ - | 左 |
BETWEEN、IN、LIKE、CONTAINS など | - |
< > = <= >= <> != | 左 |
IS NULL、IS FALSE、IS NO TTRUE など | - |
NOT | 右 |
AND | 左 |
OR | 左 |
次の場合、識別子は二重引用符を使用してエスケープする必要があります。
絶対パスを使用してテーブルを識別する場合 (たとえば、「/root/myTable」)。
識別するフィールドが予約語の場合 (「user」、「order」など)。
テーブルエイリアス (たとえば、t."$adaptation", t."$pk" でシステム列を参照する場合)。
メタデータフィールドを参照する場合 (たとえば、t."ebx-metadata"."system"."creation_time")。
次の例は、すべてのケースを例示するためのクエリを示しています。
SELECT t."user", t."$pk" FROM "/root/myTable" t WHERE t."order" = 1
EBX® SQL は EXPLAIN PLAN FOR ...
構文をサポートして、クエリのプラン情報を取得します。
結果は
に似ています。Query.explain
例:EXPLAIN PLAN FOR SELECT id FROM myTable
内部結合の最適化では、RIGHT 結合と FULL 結合がサポートされていないため、可能であればこれらの結合タイプは避けてください。
数値または 10 進値の最大精度とスケールは 1000 です。
GROUP BY
や集約関数 (MIN
、MAX
など) を使用したクエリは最適化されませんが、COUNT
は状況に応じて最適化されます。
現在、MIN
および MAX
演算子は内部インデックスを利用していません。代わりに、次の同等のクエリを使用してください。多くの場合、これらはより効率的です。
SELECT val FROM myTable ORDER BY val DESC NULLS LAST LIMIT 1
instead of SELECT MAX(val) FROM myTable
SELECT val FROM myTable ORDER BY val LIMIT 1
instead of SELECT MIN(val) FROM myTable