Apache-tajo-sql-queries

提供:Dev Guides
移動先:案内検索

Apache Tajo-SQLクエリ

この章では、次の重要なクエリについて説明します。

  • 述語
  • 説明する
  • Join

先に進み、クエリを実行しましょう。

述語

述語は、true/false値とUNKNOWNを評価するために使用される式です。 述語は、WHERE句およびHAVING句の検索条件、およびブール値が必要なその他の構造で使用されます。

IN述語

テストする式の値がサブクエリまたはリストの値と一致するかどうかを判断します。 サブクエリは、1つの列と1つ以上の行の結果セットを持つ通常のSELECTステートメントです。 この列またはリスト内のすべての式は、テストする式と同じデータ型である必要があります。

構文

IN::=
<expression to test> [NOT] IN (<subquery>)
| (<expression1>,...)

問い合わせ

select id,name,address from mytable where id in(2,3,4);

結果

上記のクエリは、次の結果を生成します。

id,  name,   address
-------------------------------
2,  Amit,  12 old street
3,  Bob,   10 cross street
4,  David, 15 express avenue

クエリは、学生ID 2、3、4の mytable からレコードを返します。

問い合わせ

select id,name,address from mytable where id not in(2,3,4);

結果

上記のクエリは、次の結果を生成します。

id,  name,  address
-------------------------------
1,  Adam,   23 new street
5,  Esha,   20 garden street
6,  Ganga,  25 north street
7,  Jack,   2 park street
8,  Leena,  24 south street
9,  Mary,   5 west street
10, Peter,  16 park avenue

上記のクエリは、学生が2,3と4にない mytable からレコードを返します。

述語のように

LIKE述語は、文字列値を計算するための最初の式で指定された文字列(テストする値と呼ばれる)を、文字列値を計算するための2番目の式で定義されたパターンと比較します。

パターンには、次のようなワイルドカードの任意の組み合わせを含めることができます-

  • 下線記号(_)。テストする値の単一文字の代わりに使用できます。
  • パーセント記号(%)。テストする値内のゼロ文字以上の文字列を置き換えます。

構文

LIKE::=
<expression for calculating the string value>
[NOT] LIKE
<expression for calculating the string value>
[ESCAPE <symbol>]
  • 問い合わせ *
select* from mytable where name like ‘A%';

結果

上記のクエリは、次の結果を生成します。

id,  name,  address,     age,  mark
-------------------------------
1,  Adam,  23 new street,  12,  90
2,  Amit,  12 old street,  13,  95

クエリは、名前が「A」で始まる生徒のmytableからレコードを返します。

  • 問い合わせ *
select* from mytable where name like ‘_a%';

結果

上記のクエリは、次の結果を生成します。

id,  name,  address,    age,  mark
——————————————————————————————————————-
4,  David,  15 express avenue,  12,  85
6,  Ganga,  25 north street,    12,  55
7,  Jack,  2 park street,       12,  60
9,  Mary,  5 west street,       12,  75

クエリは、名前が2番目の文字が「a」で始まる生徒の mytable からレコードを返します。

検索条件でのNULL値の使用

ここで、検索条件でNULL値を使用する方法を理解しましょう。

構文

Predicate
IS [NOT] NULL

問い合わせ

select name from mytable where name is not null;

結果

上記のクエリは、次の結果を生成します。

name
-------------------------------
Adam
Amit
Bob
David
Esha
Ganga
Jack
Leena
Mary
Peter
(10 rows, 0.076 sec, 163 B selected)

ここでは、結果はtrueなので、テーブルからすべての名前を返します。

問い合わせ

ここで、NULL条件を使用してクエリを確認します。

default> select name from mytable where name is null;

結果

上記のクエリは、次の結果を生成します。

name
-------------------------------
(0 rows, 0.068 sec, 0 B selected)

説明する

*Explain* は、クエリ実行プランを取得するために使用されます。 文の論理的およびグローバルな計画実行を示します。

論理計画クエリ

explain select * from mytable;
explain
-------------------------------
   => target list: default.mytable.id (INT4), default.mytable.name (TEXT),
      default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4)

   => out schema: {
   (5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }

   => in schema: {
    (5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }

結果

上記のクエリは、次の結果を生成します。

説明

クエリ結果には、指定されたテーブルの論理プラン形式が表示されます。 論理計画は、次の3つの結果を返します-

  • 対象リスト
  • 出力スキーマ *スキーマ内

グローバルプランクエリ

explain global select* from mytable;
explain
-------------------------------
-------------------------------------------------------------------------------
Execution Block Graph (TERMINAL - eb_0000000000000_0000_000002)
-------------------------------------------------------------------------------
|-eb_0000000000000_0000_000002
   |-eb_0000000000000_0000_000001
-------------------------------------------------------------------------------
Order of Execution
-------------------------------------------------------------------------------
1: eb_0000000000000_0000_000001
2: eb_0000000000000_0000_000002
-------------------------------------------------------------------------------
=======================================================
Block Id: eb_0000000000000_0000_000001 [ROOT]
=======================================================
SCAN(0) on default.mytable

   => target list: default.mytable.id (INT4), default.mytable.name (TEXT),
      default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4)

   => out schema: {
    (5) default.mytable.id (INT4), default.mytable.name (TEXT),default.mytable.address (TEXT),
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }

   => in schema: {
    (5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }
=======================================================
Block Id: eb_0000000000000_0000_000002 [TERMINAL]
=======================================================
(24 rows, 0.065 sec, 0 B selected)

結果

上記のクエリは、次の結果を生成します。

グローバルプラン

ここで、グローバルプランには、実行ブロックID、実行順序、およびその情報が表示されます。

参加する

SQL結合は、2つ以上のテーブルの行を結合するために使用されます。 以下は、SQL結合のさまざまなタイプです-

  • 内部結合
  • \ {左|右| FULL}外部参加
  • クロス結合
  • 自己参加
  • 自然結合

結合操作を実行するには、次の2つのテーブルを検討してください。

表1-顧客

Id Name Address Age
1 Customer 1 23 Old Street 21
2 Customer 2 12 New Street 23
3 Customer 3 10 Express Avenue 22
4 Customer 4 15 Express Avenue 22
5 Customer 5 20 Garden Street 33
6 Customer 6 21 North Street 25

表2-customer_order

Id Order Id Emp Id
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

次に進み、上記の2つのテーブルでSQL結合操作を実行します。

内部結合

内部結合は、両方のテーブルの列が一致する場合、両方のテーブルからすべての行を選択します。

構文

SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

問い合わせ

default> select c.age,c1.empid from customers c inner join customer_order c1 on c.id = c1.id;

結果

上記のクエリは、次の結果を生成します。

age,  empid
-------------------------------
21,  101
23,  102
22,  103
22,  104
33,  105

クエリは、両方のテーブルの5つの行に一致します。 したがって、最初のテーブルから一致した行の経過時間を返します。

左外部結合

左外部結合は、「右」テーブルに一致する行があるかどうかに関係なく、「左」テーブルのすべての行を保持します。

問い合わせ

select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;

結果

上記のクエリは、次の結果を生成します。

name,       empid
-------------------------------
customer1,  101
customer2,  102
customer3,  103
customer4,  104
customer5,  105
customer6,

ここで、左外部結合は、customers(left)テーブルのname列の行と、customer_order(right)テーブルのempid列に一致する行を返します。

右外部結合

右外部結合は、「左」テーブルに一致する行があるかどうかに関係なく、「右」テーブルのすべての行を保持します。

問い合わせ

select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;

結果

上記のクエリは、次の結果を生成します。

name,      empid
-------------------------------
customer1,  101
customer2,  102
customer3,  103
customer4,  104
customer5,  105

ここで、Right Outer Joinはcustomer_order(right)テーブルからempid行を返し、name列はcustomersテーブルから一致した行を返します。

フル外部結合

完全外部結合では、左テーブルと右テーブルの両方のすべての行が保持されます。

  • 問い合わせ *
select* from customers c full outer join customer_order c1 on c.id = c1.id;

結果

上記のクエリは、次の結果を生成します。

完全外部結合

クエリは、customersテーブルとcustomer_orderテーブルの両方から一致する行と一致しない行をすべて返します。

クロスジョイン

これは、2つ以上の結合されたテーブルからのレコードのセットのデカルト積を返します。

  • 構文 *
SELECT* FROM table1  CROSS JOIN table2;

問い合わせ

select orderid,name,address from customers,customer_order;

結果

上記のクエリは、次の結果を生成します。

クロス結合

上記のクエリは、テーブルのデカルト積を返します。

自然結合

Natural Joinは、比較演算子を使用しません。 デカルト積のようには連結しません。 2つの関係の間に少なくとも1つの共通属性が存在する場合にのみ、Natural Joinを実行できます。

  • 構文 *
SELECT* FROM table1 NATURAL JOIN table2;
  • 問い合わせ *
select* from customers natural join customer_order;

結果

上記のクエリは、次の結果を生成します。

自然結合

ここでは、2つのテーブル間に存在する共通の列IDが1つあります。 その共通列を使用して、 Natural Join は両方のテーブルを結合します。

自己参加

SQL SELF JOINは、テーブルが2つのテーブルであるかのようにテーブルをそれ自体に結合するために使用され、SQLステートメントで少なくとも1つのテーブルの名前を一時的に変更します。

構文

SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_filed = b.common_field

問い合わせ

default> select c.id,c1.name from customers c, customers c1 where c.id = c1.id;

結果

上記のクエリは、次の結果を生成します。

id,   name
-------------------------------
1,   customer1
2,   customer2
3,   customer3
4,   customer4
5,   customer5
6,   customer6

クエリは、顧客テーブルをそれ自体に結合します。