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
クエリは顧客テーブルをそれ自体に結合します。