Apache Tajo - SQL 查询



本章解释以下重要的查询。

  • 谓词
  • 解释
  • 连接

让我们继续执行查询。

谓词

谓词是一个用于评估真/假值和 UNKNOWN 的表达式。谓词用于 WHERE 子句和 HAVING 子句的搜索条件以及其他需要布尔值的结构。

IN 谓词

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

语法

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

查询

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** 中学生 ID 不为 2、3 和 4 的记录。

Like 谓词

LIKE 谓词将第一个表达式中指定的字符串与第二个表达式中定义的模式进行比较,以计算字符串值,该字符串值被称为要测试的值。

模式可以包含任何通配符组合,例如:

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

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

语法

LIKE::= 
<expression for calculating the string value> 
[NOT] LIKE 
<expression for calculating the string value> 
[ESCAPE <symbol>] 

查询

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) 

此处,结果为真,因此它返回表中的所有名称。

查询

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

default> select name from mytable where name is null; 

结果

以上查询将生成以下结果。

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

结果

以上查询将生成以下结果。

Explain

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

  • 目标列表
  • 输出模式
  • 输入模式

全局计划查询

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) 

结果

以上查询将生成以下结果。

Global Plan

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

连接

SQL 连接用于组合来自两个或多个表的行。以下是不同类型的 SQL 连接:

  • 内部连接
  • { 左 | 右 | 全 } 外连接
  • 交叉连接
  • 自连接
  • 自然连接

考虑以下两个表以执行连接操作。

表 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 - 客户订单

ID 订单 ID 员工 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,

在这里,左外连接返回来自客户(左)表的姓名列行,以及来自客户订单(右)表中匹配的员工 ID 列行。

右外连接

右外连接保留“右”表的所有行,无论“左”表中是否存在匹配的行。

查询

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

在这里,右外连接返回来自客户订单(右)表的员工 ID 行,以及来自客户表的匹配的姓名列行。

全外连接

全外连接保留来自左表和右表的所有行。

查询

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

结果

以上查询将生成以下结果。

Full Outer Join

该查询返回客户表和客户订单表中所有匹配和不匹配的行。

交叉连接

这将返回来自两个或多个连接表的记录集的笛卡尔积。

语法

SELECT *  FROM table1  CROSS JOIN table2;

查询

select orderid,name,address from customers,customer_order;

结果

以上查询将生成以下结果。

Cross Join

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

自然连接

自然连接不使用任何比较运算符。它不像笛卡尔积那样连接。只有当两个关系之间存在至少一个公共属性时,我们才能执行自然连接。

语法

SELECT * FROM table1 NATURAL JOIN table2;

查询

select * from customers natural join customer_order; 

结果

以上查询将生成以下结果。

Natural Join

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

自连接

SQL 自连接用于将表连接到自身,就好像表是两个表一样,在 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 

该查询将客户表连接到自身。

广告