クエリ(SQL)とは、データベースにおいてデータを取得するための方法であり、WHEREなどの条件制限句やORDER BYなどの並べ替え句などのステートメントを組み合わせてクエリ結果を取得します。この記事では、クエリの基本的な演算と構成について説明します。
クエリの基本的な演算
クエリの本質は関係の演算であり、データベースにおいて関係はテーブルとして格納されます。ここで、各行は集合内の一つのタプル(Tuple)、各列は集合内の一つの属性(Attribute)となります。
関係の基本的な演算には以下が含まれます:
選択(Selection):指定された条件を満たすいくつかのタプルを関係から選択します。データベースにおいて、選択とはテーブル内の特定の数行を選ぶ操作です。
obclient> SELECT * FROM t WHERE c1 <10;投影(Projection):指定された条件を満たすいくつかの属性を関係から選択します。データベースにおいて、投影とはテーブル内の特定の数列を選ぶ操作です。
obclient> SELECT c1,c2 FROM t;結合(Join):二つの関係のデカルト積(Cartesian Product)から、選択した属性間で一定の条件を満たすタプルを選択します。データベースにおいて、結合とは二つのテーブルのデカルト積から指定された条件を満たすものを選ぶ操作です。
obclient> SELECT t1.c2,t2.c4 FROM t1 JOIN t2 WHERE t1.c1 = t2.c3;
クエリの構成
クエリの基本構文は以下のとおりです。ここで、att_name はプロパティ名、rel_name はリレーション名を表します。
SELECT att_name FROM rel_name;
単一のタプルで構成されるリレーションを単一要素タプルと呼びます。つまり、単一の要素もリレーションとして扱うことができるため、最も基本的なクエリは単一の要素でも構成可能です。以下の例は有効なクエリです。
obclient> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set
クエリ結果において、上の 1 は要素のプロパティ名、下の 1 は要素の値を表します。
OceanBaseデータベースは FROM DUAL 構文をサポートしています。DUAL は仮想テーブルであり、SELECT の構文規則を形成するために使用されます。
obclient> SELECT 1 FROM DUAL;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set
FROM句
FROM 句は、クエリ対象のリレーション名を指定するために使用されます。クエリの結果もまたリレーションであるため、クエリの結果を FROM 句で参照するリレーションとして指定することができます。
obclient> SELECT * FROM (SELECT 1 FROM DUAL);
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set
WHERE句
WHERE 句は、クエリ対象のタプルの条件を指定するために使用されます。WHERE ステートメントは、タプルの特定のプロパティが条件を満たすかどうかを個別に比較し、比較結果が TRUE のタプルを返します。例えば、以下のクエリでは、WHERE 条件が FALSE または NULL の場合、常に空集合を返します。
obclient> SELECT * FROM (SELECT 1 FROM DUAL) WHERE TRUE;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set
obclient> SELECT * FROM (SELECT 1 FROM DUAL) WHERE FALSE;
Empty set
obclient> SELECT * FROM (SELECT 1 FROM DUAL) WHERE NULL;
Empty set
ORDER BY句
ORDER BY 句は、クエリ結果をソートするために使用されます。ソート用の列 c1,c2,... を複数指定することで、クエリ結果をソート列に従って順次ソートできます。
obclient> CREATE TABLE t (c1 INTEGER,c2 INTEGER);
obclient> SELECT * FROM t ORDER BY c1,c2;
OceanBaseデータベースは、数字 1,2,... をそれぞれリレーション t の1列目、2列目として表すことをサポートしています。したがって、上記のクエリは次のように書き換えることもできます:
obclient> SELECT * FROM t ORDER BY 1,2;
GROUP BY句
GROUP BY 句は、クエリ結果をグループ化するために使用されます。グループ化用の列 c1,c2,... を複数指定することで、クエリ結果をグループ化列に従って順次グループ化できます。
obclient> CREATE TABLE t (c1 INTEGER,c2 INTEGER);
obclient> SELECT * FROM t GROUP BY c1,c2;
OceanBaseデータベースは、数字 1,2,... をそれぞれリレーション t の1列目、2列目として表すことをサポートしています。したがって、上記のクエリは次のように書き換えることもできます:
obclient> SELECT * FROM t GROUP BY 1,2;
LIMIT句
LIMIT 句は、クエリ結果の行数を制限するために使用されます。LIMIT には2種類の構文があります:
LIMIT N:クエリ結果の最初のN行のみを返します。LIMIT N,M:クエリ結果のN+1行目からM行目までを返します。
HAVING句
HAVING 句は WHERE 句と同じですが、HAVING 句は集計関数にも使用できます。