Apache Tajo - Truy vấn SQL

Chương này giải thích về các Truy vấn quan trọng sau đây.

  • Predicates
  • Explain
  • Join

Hãy để chúng tôi tiến hành và thực hiện các truy vấn.

Dự đoán

Vị từ là một biểu thức được sử dụng để đánh giá các giá trị true / false và UNKNOWN. Các vị từ được sử dụng trong điều kiện tìm kiếm của mệnh đề WHERE và mệnh đề HAVING và các cấu trúc khác mà giá trị Boolean được yêu cầu.

Vị ngữ IN

Xác định xem giá trị của biểu thức cần kiểm tra có khớp với bất kỳ giá trị nào trong truy vấn con hoặc danh sách hay không. Truy vấn con là một câu lệnh SELECT thông thường có tập kết quả gồm một cột và một hoặc nhiều hàng. Cột này hoặc tất cả các biểu thức trong danh sách phải có cùng kiểu dữ liệu với biểu thức để kiểm tra.

Syntax

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

Query

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

Result

Truy vấn trên sẽ tạo ra kết quả sau.

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

Truy vấn trả về các bản ghi từ mytable cho id học sinh 2,3 và 4.

Query

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

Result

Truy vấn trên sẽ tạo ra kết quả sau.

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

Truy vấn trên trả về các bản ghi từ mytable nơi học sinh không thuộc khối 2,3 và 4.

Giống như Vị ngữ

Vị từ LIKE so sánh chuỗi được chỉ định trong biểu thức đầu tiên để tính toán giá trị chuỗi, được coi là giá trị để kiểm tra, với mẫu được xác định trong biểu thức thứ hai để tính giá trị chuỗi.

Mẫu có thể chứa bất kỳ sự kết hợp nào của các ký tự đại diện như -

  • Ký hiệu gạch dưới (_), có thể được sử dụng thay cho bất kỳ ký tự đơn nào trong giá trị để kiểm tra.

  • Dấu phần trăm (%), thay thế bất kỳ chuỗi nào không hoặc nhiều ký tự trong giá trị cần kiểm tra.

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

Truy vấn trên sẽ tạo ra kết quả sau.

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

Truy vấn trả về các bản ghi từ bảng của tôi về những sinh viên có tên bắt đầu bằng 'A'.

Query

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

Result

Truy vấn trên sẽ tạo ra kết quả sau.

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

Truy vấn trả về các bản ghi từ mytable của những sinh viên có tên bắt đầu bằng 'a' là ký tự thứ hai.

Sử dụng Giá trị NULL trong Điều kiện Tìm kiếm

Bây giờ chúng ta hãy hiểu cách sử dụng Giá trị NULL trong các điều kiện tìm kiếm.

Syntax

Predicate  
IS [NOT] NULL

Query

select name from mytable where name is not null;

Result

Truy vấn trên sẽ tạo ra kết quả sau.

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

Ở đây, kết quả là true nên nó trả về tất cả các tên từ bảng.

Query

Bây giờ chúng ta hãy kiểm tra truy vấn với điều kiện NULL.

default> select name from mytable where name is null;

Result

Truy vấn trên sẽ tạo ra kết quả sau.

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

Giải thích

Explainđược sử dụng để có được một kế hoạch thực thi truy vấn. Nó cho thấy một kế hoạch hợp lý và toàn cầu thực hiện một câu lệnh.

Truy vấn kế hoạch logic

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

Truy vấn trên sẽ tạo ra kết quả sau.

Kết quả truy vấn hiển thị một định dạng kế hoạch hợp lý cho bảng đã cho. Phương án lôgic trả về ba kết quả sau:

  • Danh sách mục tiêu
  • Ra ngoài lược đồ
  • Trong lược đồ

Truy vấn kế hoạch toàn cầu

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

Truy vấn trên sẽ tạo ra kết quả sau.

Ở đây, kế hoạch toàn cầu hiển thị ID khối thực thi, thứ tự thực hiện và thông tin của nó.

Tham gia

Các phép nối SQL được sử dụng để kết hợp các hàng từ hai bảng trở lên. Sau đây là các loại SQL Joins khác nhau:

  • Tham gia bên trong
  • {TRÁI | ĐÚNG | FULL} THAM GIA NGOÀI TRỜI
  • Tham gia chéo
  • Tự tham gia
  • Tham gia tự nhiên

Hãy xem xét hai bảng sau để thực hiện các thao tác nối.

Bảng 1 - Khách hàng

Tôi Tên Địa chỉ Tuổi tác
1 Khách hàng 1 23 Phố Cổ 21
2 Khách hàng 2 12 Phố Mới 23
3 Khách hàng 3 10 Đại lộ Express 22
4 Khách hàng 4 15 Đại lộ Express 22
5 Khách hàng 5 20 Garden Street 33
6 Khách hàng 6 21 North Street 25

Table2 - customer_order

Tôi Mã đơn hàng Id trống
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

Bây giờ chúng ta hãy tiếp tục và thực hiện các phép toán nối SQL trên hai bảng trên.

Tham gia bên trong

Phép nối bên trong chọn tất cả các hàng từ cả hai bảng khi có sự khớp giữa các cột trong cả hai bảng.

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

Truy vấn trên sẽ tạo ra kết quả sau.

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

Truy vấn khớp với năm hàng từ cả hai bảng. Do đó, nó trả về tuổi của các hàng phù hợp từ bảng đầu tiên.

Tham gia bên ngoài bên trái

Một phép nối ngoài cùng bên trái giữ lại tất cả các hàng của bảng “bên trái”, bất kể có hàng nào khớp trên bảng “bên phải” hay không.

Query

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

Result

Truy vấn trên sẽ tạo ra kết quả sau.

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

Tại đây, phép nối ngoài cùng bên trái trả về các hàng cột tên từ bảng khách hàng (bên trái) và cột trống các hàng khớp với bảng khách hàng (bên phải).

Tham gia bên ngoài bên phải

Một phép nối ngoài cùng bên phải giữ lại tất cả các hàng của bảng “bên phải”, bất kể có hàng nào khớp trên bảng “bên trái” hay không.

Query

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

Result

Truy vấn trên sẽ tạo ra kết quả sau.

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

Ở đây, phép kết hợp bên ngoài bên phải trả về các hàng trống từ bảng customer_order (bên phải) và cột tên khớp với các hàng từ bảng khách hàng.

Tham gia đầy đủ bên ngoài

Tham gia bên ngoài đầy đủ giữ lại tất cả các hàng từ cả bảng bên trái và bên phải.

Query

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

Result

Truy vấn trên sẽ tạo ra kết quả sau.

Truy vấn trả về tất cả các hàng phù hợp và không khớp từ cả bảng khách hàng và bảng customer_order.

Tham gia chéo

Điều này trả về tích Descartes của các tập hợp các bản ghi từ hai hoặc nhiều bảng được nối.

Syntax

SELECT *  FROM table1  CROSS JOIN table2;

Query

select orderid,name,address from customers,customer_order;

Result

Truy vấn trên sẽ tạo ra kết quả sau.

Truy vấn trên trả về tích Descartes của bảng.

Tham gia tự nhiên

Một phép nối tự nhiên không sử dụng bất kỳ toán tử so sánh nào. Nó không nối theo cách một tích Descartes làm. Chúng ta chỉ có thể thực hiện phép nối tự nhiên nếu có ít nhất một thuộc tính chung tồn tại giữa hai mối quan hệ.

Syntax

SELECT * FROM table1 NATURAL JOIN table2;

Query

select * from customers natural join customer_order;

Result

Truy vấn trên sẽ tạo ra kết quả sau.

Ở đây, có một id cột chung tồn tại giữa hai bảng. Sử dụng cột chung đó,Natural Join tham gia cả hai bảng.

Tự tham gia

SQL SELF JOIN được sử dụng để nối một bảng với chính nó như thể bảng là hai bảng, tạm thời đổi tên ít nhất một bảng trong câu lệnh 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

Truy vấn trên sẽ tạo ra kết quả sau.

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

Truy vấn kết hợp một bảng khách hàng với chính nó.