クエリ(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 句では集約関数を使用できます。