📜  Apache Tajo-SQL查询

📅  最后修改于: 2020-12-02 06:08:39             🧑  作者: Mango


本章说明以下重要查询。

  • 谓词
  • 说明
  • 加入

让我们继续执行查询。

谓词

谓词是用于评估真/假值和未知的表达式。在WHERE子句和HAVING子句以及其他需要布尔值的构造的搜索条件中使用谓词。

IN谓词

确定要测试的表达式的值是否与子查询或列表中的任何值匹配。子查询是一种普通的SELECT语句,其结果集为一列和一个或多个行。此列或列表中的所有表达式必须与要测试的表达式具有相同的数据类型。

句法

IN::= 
 [NOT] IN () 
| (,...)

询问

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

结果

上面的查询将产生以下结果。

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

该查询从mytable返回学生ID 2,3和4的记录。

询问

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

结果

上面的查询将产生以下结果。

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谓词在第一表达式用于计算字符串值,其被refered到作为值测试,与在第二个表达式定义用于计算字符串值的图案指定的字符串进行比较。

该模式可以包含通配符的任意组合,例如-

  • 带下划线的符号(_),可代替值中的任何单个字符进行测试。

  • 百分号(%),它将替换要测试的值中任何零个或多个字符的字符串。

句法

LIKE::= 
 
[NOT] LIKE 
 
[ESCAPE ] 

询问

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

结果

上面的查询将产生以下结果。

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

该查询从mytable返回名称以“ A”开头的那些学生的记录。

询问

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

结果

上面的查询将产生以下结果。

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值。

句法

Predicate  
IS [NOT] NULL 

询问

select name from mytable where name is not null; 

结果

上面的查询将产生以下结果。

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

在这里,结果为true,因此它返回表中的所有名称。

询问

现在让我们检查条件为NULL的查询。

default> select name from mytable where name is null; 

结果

上面的查询将产生以下结果。

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

说明

说明用于获取查询执行计划。它显示了语句的逻辑和全局计划执行。

逻辑计划查询

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

结果

上面的查询将产生以下结果。

说明

查询结果显示给定表的逻辑计划格式。逻辑计划返回以下三个结果-

  • 目标清单
  • 输出架构
  • 在架构中

全局计划查询

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) 

结果

上面的查询将产生以下结果。

全球计划

在这里,全局计划显示执行块ID,执行顺序及其信息。

加入

SQL连接用于合并两个或多个表中的行。以下是不同类型的SQL连接-

  • 内部联接
  • {左|右|完整}外连接
  • 交叉联接
  • 自我加入
  • 自然加入

请考虑以下两个表来执行联接操作。

表1-客户

Id Name Address Age
1 Customer 1 23 Old Street 21
2 Customer 2 12 New Street 23
3 Customer 3 10 Express Avenue 22
4 Customer 4 15 Express Avenue 22
5 Customer 5 20 Garden Street 33
6 Customer 6 21 North Street 25

表2-customer_order

Id Order Id Emp Id
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

现在,让我们继续对上述两个表执行SQL连接操作。

内部联接

当两个表中的列匹配时,内部联接将从两个表中选择所有行。

句法

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

询问

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

结果

上面的查询将产生以下结果。

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

该查询匹配两个表中的五行。因此,它从第一个表返回匹配的行年龄。

左外连接

左外部联接保留“左”表的所有行,而不管“右”表上是否有匹配的行。

询问

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

结果

上面的查询将产生以下结果。

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

在这里,左外部联接返回customers(left)表中的名称列行,并返回customer_order(right)表中的empid列匹配行。

右外连接

右外部联接将保留“右”表的所有行,而不管“左”表上是否有匹配的行。

询问

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

结果

上面的查询将产生以下结果。

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

在这里,“右外部联接”返回customer_order(right)表中的空行,而name列匹配客户表中的行。

完全外部加入

完全外部联接保留了左右表中的所有行。

询问

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

结果

上面的查询将产生以下结果。

完全外部加入

该查询返回来自customers和customer_order表的所有匹配和不匹配的行。

交叉连接

这将从两个或多个联接表中返回记录集的笛卡尔积。

句法

SELECT *  FROM table1  CROSS JOIN table2;

询问

select orderid,name,address from customers,customer_order;

结果

上面的查询将产生以下结果。

交叉连接

上面的查询返回表的笛卡尔积。

自然加入

自然连接不使用任何运算符。它没有连接笛卡尔积的方式。仅当两个关系之间至少存在一个公共属性时,我们才能执行自然联接。

句法

SELECT * FROM table1 NATURAL JOIN table2;

询问

select * from customers natural join customer_order; 

结果

上面的查询将产生以下结果。

自然加入

在这里,两个表之间存在一个公共列ID。使用该公共列,自然联接将两个表联接在一起。

自我加入

SQL SELF JOIN用于将表联接到自身,就像该表是两个表一样,从而在SQL语句中临时重命名至少一个表。

句法

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

询问

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

结果

上面的查询将产生以下结果。

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

该查询将一个客户表与其自身相连。