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

แบบสอบถามรวมตารางลูกค้าเข้ากับตัวเอง