Apache Tajo - แบบสอบถาม SQL
บทนี้จะอธิบายเกี่ยวกับแบบสอบถามที่สำคัญต่อไปนี้
- Predicates
- Explain
- Join
ให้เราดำเนินการและดำเนินการค้นหา
เปรต
เพรดิเคตคือนิพจน์ที่ใช้ในการประเมินค่าจริง / เท็จและ UNKNOWN เพรดิเคตถูกใช้ในเงื่อนไขการค้นหา WHERE clauses และ HAVING clauses และโครงสร้างอื่น ๆ ที่จำเป็นต้องมีค่าบูลีน
ในภาคแสดง
กำหนดว่าค่าของนิพจน์ที่จะทดสอบตรงกับค่าใดในเคียวรีย่อยหรือรายการ Subquery คือคำสั่ง 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 สำหรับนักเรียน id 2,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 เปรียบเทียบสตริงที่ระบุในนิพจน์แรกสำหรับการคำนวณค่าสตริงซึ่งอ้างถึงเป็นค่าที่จะทดสอบกับรูปแบบที่กำหนดไว้ในนิพจน์ที่สองสำหรับการคำนวณค่าสตริง
รูปแบบอาจมีสัญลักษณ์แทนเช่น -
สัญลักษณ์ขีดเส้นใต้ (_) ซึ่งสามารถใช้แทนอักขระเดี่ยวใดก็ได้ในค่าที่จะทดสอบ
เครื่องหมายเปอร์เซ็นต์ (%) ซึ่งจะแทนที่สตริงที่มีอักขระศูนย์หรือมากกว่าในค่าที่จะทดสอบ
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
แบบสอบถามส่งคืนระเบียนจาก mytable ของนักเรียนที่มีชื่อขึ้นต้นด้วย 'A'
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 ของนักเรียนที่มีชื่อขึ้นต้นด้วย '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)
ที่นี่ผลลัพธ์เป็นจริงดังนั้นจึงส่งคืนชื่อทั้งหมดจากตาราง
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
แบบสอบถามข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
ผลลัพธ์คิวรีแสดงรูปแบบแผนตรรกะสำหรับตารางที่กำหนด แผนลอจิกส่งคืนผลลัพธ์สามรายการต่อไปนี้ -
- รายการเป้าหมาย
- สคีมา
- ในสคีมา
แบบสอบถามแผนสากล
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
แบบสอบถามข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
ที่นี่แผนส่วนกลางจะแสดงรหัสบล็อกการดำเนินการลำดับการดำเนินการและข้อมูล
เข้าร่วม
การรวม SQL ใช้เพื่อรวมแถวจากสองตารางขึ้นไป ต่อไปนี้เป็นประเภทต่างๆของการเข้าร่วม SQL -
- การเข้าร่วมภายใน
- {ซ้าย | ขวา | เข้าร่วมเต็มรูปแบบจากภายนอก
- เข้าร่วมข้าม
- เข้าร่วมด้วยตนเอง
- เข้าร่วมตามธรรมชาติ
พิจารณาสองตารางต่อไปนี้เพื่อดำเนินการรวม
Table1 - ลูกค้า
Id | ชื่อ | ที่อยู่ | อายุ |
---|---|---|---|
1 | ลูกค้า 1 | 23 Old Street | 21 |
2 | ลูกค้า 2 | 12 ถนนใหม่ | 23 |
3 | ลูกค้า 3 | 10 Express Avenue | 22 |
4 | ลูกค้า 4 | 15 Express Avenue | 22 |
5 | ลูกค้า 5 | 20 Garden Street | 33 |
6 | ลูกค้า 6 | 21 North Street | 25 |
ตารางที่ 2 - customer_order
Id | รหัสคำสั่งซื้อ | รหัส Emp |
---|---|---|
1 | 1 | 101 |
2 | 2 | 102 |
3 | 3 | 103 |
4 | 4 | 104 |
5 | 5 | 105 |
ให้เราดำเนินการต่อและดำเนินการรวม 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
แบบสอบถามตรงกับห้าแถวจากทั้งสองตาราง ดังนั้นจะส่งคืนอายุของแถวที่ตรงกันจากตารางแรก
เข้าร่วมด้านนอกซ้าย
การรวมภายนอกด้านซ้ายจะรักษาแถวทั้งหมดของตาราง "ซ้าย" ไม่ว่าจะมีแถวที่ตรงกับตาราง "ขวา" หรือไม่ก็ตาม
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,
ที่นี่การรวมภายนอกด้านซ้ายจะส่งคืนแถวคอลัมน์ชื่อจากตารางลูกค้า (ซ้าย) และคอลัมน์ Empid ที่ตรงกับแถวจากตาราง customer_order (ขวา)
เข้าร่วมภายนอกขวา
การรวมภายนอกด้านขวาจะยังคงรักษาแถวทั้งหมดของตาราง "ขวา" ไม่ว่าจะมีแถวที่ตรงกับตาราง "ซ้าย" หรือไม่
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 ส่งคืนแถว empid จากตาราง customer_order (ขวา) และคอลัมน์ชื่อที่ตรงกับแถวจากตารางลูกค้า
เข้าร่วมภายนอกเต็มรูปแบบ
การเข้าร่วมแบบเต็มภายนอกจะเก็บแถวทั้งหมดจากทั้งตารางด้านซ้ายและด้านขวา
Query
select * from customers c full outer join customer_order c1 on c.id = c1.id;
Result
แบบสอบถามข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
แบบสอบถามส่งคืนแถวที่ตรงกันและไม่ตรงกันทั้งหมดจากทั้งลูกค้าและตาราง customer_order
เข้าร่วมข้าม
ส่งคืนผลคูณคาร์ทีเซียนของชุดระเบียนจากตารางที่รวมสองตารางขึ้นไป
Syntax
SELECT * FROM table1 CROSS JOIN table2;
Query
select orderid,name,address from customers,customer_order;
Result
แบบสอบถามข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
แบบสอบถามด้านบนส่งคืนผลคูณคาร์ทีเซียนของตาราง
เข้าร่วมตามธรรมชาติ
Natural Join ไม่ใช้ตัวดำเนินการเปรียบเทียบใด ๆ ไม่เชื่อมต่อกันแบบที่ผลิตภัณฑ์คาร์ทีเซียนทำ เราสามารถทำการเข้าร่วมแบบธรรมชาติได้ก็ต่อเมื่อมีแอตทริบิวต์ทั่วไปอย่างน้อยหนึ่งอย่างที่อยู่ระหว่างความสัมพันธ์ทั้งสอง
Syntax
SELECT * FROM table1 NATURAL JOIN table2;
Query
select * from customers natural join customer_order;
Result
แบบสอบถามข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
ที่นี่มีรหัสคอลัมน์ทั่วไปหนึ่งรายการที่มีอยู่ระหว่างสองตาราง การใช้คอลัมน์ทั่วไปนั้นไฟล์Natural Join เข้าร่วมทั้งสองตาราง
เข้าร่วมด้วยตนเอง
SQL SELF JOIN ใช้เพื่อรวมตารางเข้ากับตัวเองราวกับว่าตารางเป็นสองตารางโดยเปลี่ยนชื่อตารางอย่างน้อยหนึ่งตารางในคำสั่ง SQL เป็นการชั่วคราว
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
แบบสอบถามรวมตารางลูกค้าเข้ากับตัวเอง