查询语言系列—JOIN 语句

JOIN标准语句, 与ARRAY JOIN 关系不大.

[GLOBAL] ANY|ALL INNER|LEFT [OUTER] JOIN (subquery)|table USING columns_list

在子查询中执行JOIN查询. 在查询处理开始时, 子查询在 JOIN 以后指定, 他的结果保存在内存中. 然后从指定在FROM语句中的"左关联" 表中读取, 在读取过程中, 对于从"左关联" 表中读取的每行记录, 和从子查询结果("右关联")表中查询的数据满足USING中的匹配条件.

表名能够被指定来替代子查询. 这等于SELECT * FROM table subquery, 在特定情况下,当表有Join 引擎时 – 一个数组准备 join.

在JOIN中所有的列如果不需要,则从子查询中删除.

有如下几种类型的JOIN:

INNER 或 LEFT 类型: 如果 INNER 被指定,结果仅包含这些行,在右表中匹配的行. 如果 LEFT 被指定,任何在左表中的行没有匹配右表中的行都将被分配默认值 - zeros or empty rows. LEFT OUTER 可以被写来替代LEFT; OUTER 不影响任何事情。

ANY 或 ALL 字符串: 如果ANY 被指定和右表有一些匹配的行,只有第一行发现被Join,. 如果 ALL 被指定,右表有一些匹配的行,数据将按照行数相乘.

使用 ALL 对应的 JOIN 语义. 使用ANY 是最优的. 如果右表仅有一个匹配行, ANY 和 ALL 的结果是相同的. 你必须指定 ANY 或 ALL (默认情况下,2个都不选择).

GLOBAL 分布:

当使用 JOIN语句, 查询将被发送至远程服务器. 子查询将被运行在每个节点上,为了让右表和JOIN查询运行在此表上. 换句话说, 右表单独运行在每个服务器上.

当使用 GLOBAL ... JOIN, 首先 请求服务器运行子查询来计算右表. 此临时表被传递到每个远程服务器, 查询运行在临时表上.

当使用 GLOBAL JOINs时需要小心. 更多信息, 请查看章节 "分布式子查询".

任意的JOINs都是有可能的. 例如, GLOBAL ANY LEFT OUTER JOIN.

当运行一个 JOIN时, 执行顺序没有优化,和其他的查询阶段相比. Join在WHERE过滤之前和聚合之前被执行. 为了设置处理顺序, 我们推荐在一个子查询里运行一个JOIN子查询.


SELECT   

CounterID, hits, visits

FROM ( SELECT CounterID, count() AS hits FROM test.hits GROUP BY CounterID) ANY LEFT JOIN ( SELECT CounterID,  sum(Sign) AS visits  FROM test.visits GROUP BY CounterID) USING CounterID ORDER BY hits DESC LIMIT 10

┌─CounterID─┬───hits─┬─visits─┐

│  1143050 │ 523264 │  13665 │

│    731962 │ 475698 │ 102716 │

│    722545 │ 337212 │ 108187 │

│    722889 │ 252197 │  10547 │

│  2237260 │ 196036 │  9522 │

│  23057320 │ 147211 │  7689 │

│    722818 │  90109 │  17847 │

│    48221 │  85379 │  4652 │

│  19762435 │  77807 │  7026 │

│    722884 │  77492 │  11056 │

└───────────┴────────┴────────┘

子查询不允许你设置名称或使用他们,对于从一个特定的查询中引用一个列. 指定在 USING 中的列必须在两个子查询中都有相同的名字, 其他的列必须单独命名. 在子查询中你可以使用别名来更改列的名称,和在子查询中的列 (例如别名使用 'hits' 和 'visits').

USING 语句指定一个或多个列进行Join, 建立这些列的等值列. 列的列表被设置不需要brackets. 因此不支持复杂JOIN条件.

右表 (子查询结果) 驻留在内存中. If 如果没有足够的内存,也不能运行 JOIN.

仅有一个JOIN 能够被指定在一个查询中. 为了运行多个 JOINs, 你能够放它们在子查询中.

每次一个查询运行相同的 JOIN, 子查询再次运行 – 结果不被缓存. 为了避免这个, 使用特定的'Join' 表引擎, 它是一个预处理数组,在内存中进行join操作. 对于更多信息, 请查看章节 "表引擎, Join".

如果你想要一个JOIN 来关联维度表 (这些是一些小表,包含维度属性, 如营销活动的名称), 一个 JOIN 可能并不是特别合适,由于 bulky 的语句,右表对于每个查询重新访问. 在这些场景下, 有一个 "外部字典" 特性,你应该使用它来替换 JOIN. 更多信息, 请查看章节 "外部字典".

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容