ApacheTajo-SQLクエリ

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

  • Predicates
  • Explain
  • Join

続行してクエリを実行しましょう。

述語

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

IN述語

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

Syntax

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

Query

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

Result

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

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

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

Query

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

Result

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

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

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

述語のように

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

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

  • アンダースコア記号(_)。テストする値の単一文字の代わりに使用できます。

  • パーセント記号(%)。テストする値の0文字以上の文字列を置き換えます。

Syntax

LIKE::= 
<expression for calculating the string value> 
[NOT] LIKE 
<expression for calculating the string value> 
[ESCAPE <symbol>]

Query

select * from mytable where name like ‘A%';

Result

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

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

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

Query

select * from mytable where name like ‘_a%';

Result

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

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

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

検索条件でのNULL値の使用

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

Syntax

Predicate  
IS [NOT] NULL

Query

select name from mytable where name is not null;

Result

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

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

ここでは、結果がtrueであるため、テーブルからすべての名前が返されます。

Query

NULL条件でクエリを確認してみましょう。

default> select name from mytable where name is null;

Result

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

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)
   }

Result

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

クエリ結果には、指定されたテーブルの論理プラン形式が表示されます。論理計画は次の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)

Result

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

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

参加する

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

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

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

表1-顧客

Id 名前 住所 年齢
1 顧客1 23オールドストリート 21
2 顧客2 12ニューストリート 23
3 顧客3 10エクスプレスアベニュー 22
4 顧客4 15エクスプレスアベニュー 22
5 顧客5 20ガーデンストリート 33
6 顧客6 21ノースストリート 25

表2-customer_order

Id 注文ID Emp ID
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

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

内部結合

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

Syntax

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

Query

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

Result

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

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

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

左外部結合

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

Query

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

Result

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

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

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

右外部結合

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

Query

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

Result

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

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

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

完全外部結合

完全外部結合は、左右両方のテーブルのすべての行を保持します。

Query

select * from customers c full outer join customer_order c1 on c.id = c1.id;

Result

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

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

クロス結合

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

Syntax

SELECT *  FROM table1  CROSS JOIN table2;

Query

select orderid,name,address from customers,customer_order;

Result

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

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

自然結合

自然結合は、比較演算子を使用しません。デカルト積のように連結することはありません。自然結合を実行できるのは、2つのリレーション間に少なくとも1つの共通属性が存在する場合のみです。

Syntax

SELECT * FROM table1 NATURAL JOIN table2;

Query

select * from customers natural join customer_order;

Result

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

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

自己結合

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

Syntax

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

Query

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

Result

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

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

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