Apache Phoenix的子查询
Phoenix现在支持在WHERE 和FROM 中使用子查询。子查询可以被指定在很多地方,比如 IN/NOT IN, EXISTS/NOTEXISTS等。
Subqueries with INor NOT IN
与传统数据库一样,例如:
SELECT ItemName
FROM Items
WHERE ItemID IN
(SELECT ItemID
FROM Orders
WHERE Date >= to_date('2013-09-02'));
返回结果为:
+-------------------+
| ITEMNAME |
+-------------------+
| MU947 |
| MU3508 |
| XT2217 |
+-------------------+
注:我们在之前的博客http://blog.csdn.net/jiangshouzhuang/article/details/52423898中创建Orders表时,Date字段为Char类型,这里需要重新创建表并导入数据,如下:
drop table Orders;
create table IF NOT EXISTS Orders (
OrderID Integer,
CustomerID Char(4),
ItemID Char(4),
Quantity Integer,
Date Date
constraint pk Primary key(OrderID)
);
重新导入数据:
psql.py gpmaster:2181:/hbaseforkylin Orders.sql Orders.csv
Subqueries withEXISTS or NOT EXISTS
我们有可以使用exists实现上面的查询:
SELECT ItemName
FROM Items i
WHERE EXISTS
(SELECT *
FROM Orders
WHERE Date>= to_date('2013-09-02')
AND ItemID = i.ItemID);
结果为:
+-------------------+
| ITEMNAME |
+-------------------+
| MU947 |
| MU3508 |
| XT2217 |
+-------------------+
Semi-joins andAnti-joins
IN/Not IN或EXISTS/NOT EXISTS可以使用Semi-joins和Anti-joins实现。
Semi-join多在子查询exists中使用,对外部数据源的每个键值,查找到内部数据源匹配的第一个键值后就返回,如果找到就不用再查找内部数据源其他的键值了。IN或EXISTS可以转化为Semi-joins。
Anti-join多用于!= not in等查询;如果找到满足条件(!= not in)的不返回,不满足条件(!= not in)的返回,和join相反。NOT IN或NOT EXISTS可以转化为Anti-joins。
Subqueries withComparison Operators
子查询可以使用比较操作符(=, < >, >, > =, <, ! >, !<, or < =)。
比如下面的示例:
SELECT ID, Name
FROM Contest
WHERE Score >
(SELECT avg(Score)
FROM Contest)
ORDER BY Score DESC;
这里子查询只能返回单行,如果返回多行会出现SQL错误提示。
Subqueries withANY/SOME/ALL Comparison Operators
示例:
SELECT OrderID
FROM Orders
WHERE quantity >= ANY
(SELECT max(quantity)
FROM Orders
GROUP BY ItemID);
返回结果:
+----------------+
| ORDERID |
+----------------+
| 1630781 |
| 1630782 |
| 1630783 |
| 1630784 |
| 1630785 |
+----------------+
CorrelatedSubqueries
与传统数据一样,子查询包含的内容与外层查询相关。
SELECT PatentID, Title
FROM Patents p
WHERE FileDate <= ALL
(SELECT FileDate
FROM Patents
WHERE Region = p.Region);
Phoenix会优化上面的查询,通过重写为等式join查询,以便内部查询仅仅需要执行一次,上面的相关性子查询被Phoenix重写为:
SELECT PatentID, Title
FROM Patents p
JOIN
(SELECT Region col1, collect_distinct(FileDate) col2
FROM Patent
GROUP BY Region) t1
ON Region = t1.col1
WHERE FileDate <= ALL(t1.col2);
collect_distinct为Phoenix内部函数,收集一列或表达式所有不同的值到一个Array中。
AND/OR Branches andMultiple levels of Nesting
嵌套子查询,可以在Where,And或Or中使用子查询。
SELECT ItemID, ItemName
FROM Items i
WHERE NOT EXISTS
(SELECT *
FROM Orders
WHERE CustomerID IN
(SELECT CustomerID
FROM Customers
WHERE Country = 'Belgium')
AND Quantity< 1000
AND ItemID = i.ItemID)
OR ItemID != ALL
(SELECT ItemID
FROM Orders
WHERE CustomerID IN
(SELECT CustomerID
FROM Customers
WHERE Country = 'Germany')
AND Quantity < 2000);
Row subqueries
一个子查询可以返回一行的多个字段。
SELECT CUSTOMERID, COUNTRY
FROM Customers2
WHERE (CUSTOMERID, COUNTRY) IN
(SELECT CUSTOMERID, COUNTRY
FROM Customers
WHERE CUSTOMERNAME = 'Logica');
Derived Tables
在From中指定的子查询也被称为“derived table”。
SELECT m, count(*)
FROM
(SELECT max(QUANTITY) m
FROM Orders
GROUP BY ORDERID) AS t
GROUP BY m
ORDER BY count(*) DESC;
Derived table可以在join查询中作为join表指定在任何地方。
- 顶
Apache Phoenix的子查询的更多相关文章
- [saiku] 使用 Apache Phoenix and HBase 结合 saiku 做大数据查询分析
saiku不仅可以对传统的RDBMS里面的数据做OLAP分析,还可以对Nosql数据库如Hbase做统计分析. 本文简单介绍下一个使用saiku去查询分析hbase数据的例子. 1.phoenix和h ...
- Apache Phoenix的Join操作和优化
估计Phoenix中支持Joins,对很多使用Hbase的朋友来说,还是比较好的.下面我们就来演示一下. 首先看一下几张表的数据: Orders表: OrderID CustomerID ItemID ...
- 读书笔记--SQL必知必会11--使用子查询
11.1 子查询 查询(query),任何SQL语句都是查询.但此术语一般指SELECT语句. SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询. 作为子查询的SELECT语句只能 ...
- HIVE:用外连接替代子查询
由于hive也支持sql,很多人会把hql跟标准sql进行比较,甚至有的时候会直接套用.hive不支持事务也不支持索引,更不支持追加写,但是对于一般的sql都是能够支持的.但是对于一些子查询确实无法支 ...
- Apache Phoenix JDBC 驱动和Spring JDBCTemplate的集成
介绍:Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排运行以生成标准的JDBC结果集. 直接使用HBase API.协同处理器与自己定义过滤器.对于简单查询来说,其性能 ...
- Mapreduce atop Apache Phoenix (ScanPlan 初探)
利用Mapreduce/hive查询Phoenix数据时如何划分partition? PhoenixInputFormat的源码一看便知: public List<InputSplit> ...
- Apache Phoenix的Array类型
Apache Phoenix支持JDBC ARRAY类型,任何原生的数据类型就可以在ARRAY中使用.下面我介绍一下在创建的表中使用ARRAY类型. 先看一下创建表的SQL语句: CREATE TAB ...
- Apache Phoenix基本操作-2
1. 如何映射一个Phoenix的表到一个Hbase的表? 你可以通过Create table/create view DDL语句在一个已经存在的hbase表上创建一个Phoenix表或者视图.对于C ...
- Apache Phoenix系列 | 从入门到精通(转载)
原文地址:https://cloud.tencent.com/developer/article/1498057 来源: 云栖社区 作者: 瑾谦 By 大数据技术与架构 文章简介:Phoenix是一个 ...
随机推荐
- CodeIgniter框架——源码分析之CodeIgniter.php
CodeIgniter.php可以说是CI的核心,大部分MVC的流程都是在这个文件夹中处理的,其中加载了很多外部文件,完成CI的一次完整流程. 首先是定义了CI的版本(此处为CI 2.2.0),接下来 ...
- 【BZOJ3083/3306】遥远的国度/树 树链剖分+线段树
[BZOJ3083]遥远的国度 Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了 ...
- 《从零开始学Swift》学习笔记(Day 19)——函数参数传递
原创文章,欢迎转载.转载请注明:关东升的博客 函数的语法格式如下: func 函数名(参数列表) -> 返回值类型 { 语句组 return 返回值 } 关键字是func. 多个参数列表之间 ...
- Xamarin.Forms学习之Page Navigation(二)
在上一篇的文章中,对页面常规的导航做一些分享,然而在实际的编程中,页面数据的保持,传值等等都有很多,这篇文章就对这些相关内容做一个分享和记录,有问题,希望大家留言指正.这一篇从实现业务逻辑来讲并没有什 ...
- iOS KVO详解
一.KVO 是什么? KVO 是 Objective-C 对观察者设计模式的一种实现.[另外一种是:通知机制(notification),详情参考:iOS 趣谈设计模式——通知]: KVO 提供一种机 ...
- T-SQL怎样提高数据库性能
总结: 1.书写问题 2.表连接方式 3.索引的抉择 4.执行计划之参数嗅探 5.子查询与表连接的效率 6.临时表.CTE.表变量的选择 7.常用sp与select的缓存命中 8.锁(善用nolock ...
- 002-JVM运行时数据区【内存模型】
一.概述 JVM定义了不同运行时数据区,他们是用来执行应用程序的.某些区域随着JVM启动及销毁,另外一些区域的数据是线程性独立的,随着线程创建和销毁. 1.1.jvm自身物理结构 1.2.java内存 ...
- 4.6 基于STM32+MC20地图显示路径功能
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- 指定Python线程数目
可以通过threading.semaphore()来指定并行运行的Python线程的数目. #!/usr/bin/python2.7 #File: threadsNum.py #Author: lxw ...
- jquery 字符串转为json
使用ajax从服务器拿到的数据,jquery总是认为是字符串,无法直接使用,可以通过下面代码转换: $.get("服务器路径", function(data) { data = e ...