十一、Hive JOIN 連接查詢

作者:IvanCodes
日期:2025年5月16日
專欄:Hive教程

數據分析江湖中,數據往往分散不同的“門派”(表)之中。要洞察數據間的深層聯系,就需要JOIN這把利器,將相關聯的數據串聯起來。Hive SQL 提供了多種 JOIN語法,如同六脈神劍,各有精妙之處。掌握它們,能讓你在數據整合游刃有余

思維導圖

在這里插入圖片描述
在這里插入圖片描述

準備工作:創建示例表

為了演示各種 JOIN,我們先創建兩張簡單的表:employees (員工表) 和 departments (部門表)。

-- 員工表
CREATE TABLE employees (
emp_id INT,
emp_name STRING,
dept_id INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;-- 部門表
CREATE TABLE departments (
dept_id INT,
dept_name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;-- 插入數據
INSERT INTO employees VALUES
(1, '張三', 101),
(2, '李四', 102),
(3, '王五', 101),
(4, '趙六', 103),
(5, '孫七', NULL);INSERT INTO departments VALUES
(101, '技術部'),
(102, '市場部'),
(104, '行政部');

Hive JOIN 六大語法詳解

1. INNER JOIN (內連接,或簡寫為 JOIN)

  • 核心思想:只返回兩張表中連接條件匹配的行。如果某行在一張表找不到另一張表中與之匹配的行,則該行不會出現在結果中。
  • 通用語法
SELECT table1.col1, table1.col2, table2.col_other
FROM table1
INNER JOIN table2
ON table1.join_column = table2.join_column;
  • 代碼示例:查詢所有有明確部門歸屬的員工及其部門名稱。
SELECT e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d
ON e.dept_id = d.dept_id;
  • 預期輸出
張三    技術部
李四    市場部
王五    技術部

2. LEFT OUTER JOIN (左外連接,或簡寫為 LEFT JOIN)

  • 核心思想返回左表中所有的行,以及右表中與左表連接條件匹配的行。如果右表沒有匹配的行,則右表列值顯示為 NULL
  • 通用語法
SELECT table1.col1, table1.col2, table2.col_other
FROM table1
LEFT OUTER JOIN table2
ON table1.join_column = table2.join_column;
  • 代碼示例:查詢所有員工,并顯示他們的部門名稱(如果存在)。
SELECT e.emp_name, e.dept_id AS emp_dept_id, d.dept_name
FROM employees e
LEFT JOIN departments d
ON e.dept_id = d.dept_id;
  • 預期輸出
張三    101     技術部
李四    102     市場部
王五    101     技術部
趙六    103     NULL
孫七    NULL    NULL

3. RIGHT OUTER JOIN (右外連接,或簡寫為 RIGHT JOIN)

  • 核心思想:與 LEFT JOIN 相反。返回右表所有的行,以及左表中與右表連接條件匹配的行。如果左表沒有匹配的行,則左表列值顯示為 NULL
  • 通用語法
SELECT table1.col1, table2.col_other1, table2.col_other2
FROM table1
RIGHT OUTER JOIN table2
ON table1.join_column = table2.join_column;
  • 代碼示例:查詢所有部門,并顯示部門下的員工姓名(如果存在)。
SELECT e.emp_name, d.dept_name, d.dept_id AS dep_dept_id
FROM employees e
RIGHT JOIN departments d
ON e.dept_id = d.dept_id;
  • 預期輸出
張三    技術部    101
李四    市場部    102
王五    技術部    101
NULL    行政部    104

4. FULL OUTER JOIN (全外連接,或簡寫為 FULL JOIN)

  • 核心思想返回左表和右表中所有的行。當某行在另一張表沒有匹配時,該表對應列值顯示為 NULL
  • 通用語法
SELECT table1.col1, table2.col_other
FROM table1
FULL OUTER JOIN table2
ON table1.join_column = table2.join_column;
  • 代碼示例:查詢所有員工和所有部門的完整信息。
SELECT e.emp_name, e.dept_id AS emp_dept_id, d.dept_name, d.dept_id AS dep_dept_id
FROM employees e
FULL JOIN departments d
ON e.dept_id = d.dept_id;
  • 預期輸出
張三    101     技術部    101
李四    102     市場部    102
王五    101     技術部    101
趙六    103     NULL    NULL
孫七    NULL    NULL    NULL
NULL    NULL    行政部    104

5. LEFT SEMI JOIN (左半連接)

  • 核心思想:這是 Hive 特有的一種 JOIN。它只返回左表中那些在右表存在匹配記錄的行。關鍵在于,結果集中不包含右表的任何列。它更像是一個存在性檢查 (類似于 SQL 中的 EXISTS 子查詢)。
  • 通用語法
SELECT table1.col1, table1.col2
FROM table1
LEFT SEMI JOIN table2
ON table1.join_column = table2.join_column;
  • 代碼示例:查詢所有在部門表中確實存在對應部門的員工信息。
SELECT e.emp_id, e.emp_name, e.dept_id
FROM employees e
LEFT SEMI JOIN departments d
ON e.dept_id = d.dept_id;
  • 預期輸出
1       張三    101
2       李四    102
3       王五    101

6. CROSS JOIN (交叉連接,笛卡爾積)

  • 核心思想返回左表中的每一行與右表中的每一行所有可能組合。結果集的行數是左表行數乘以右表行數。通常不使用 ON 子句(或者使用 ON 1=1 這種恒為真的條件)。
  • 通用語法
SELECT table1.col1, table2.col_other
FROM table1
CROSS JOIN table2;
  • 代碼示例:顯示員工和部門的所有可能組合(通常在實際業務中要謹慎使用)。
SELECT e.emp_name, d.dept_name
FROM employees e
CROSS JOIN departments d;
  • 預期輸出: (員工表5行 * 部門表3行 = 15行,部分示例)
張三    技術部
張三    市場部
張三    行政部
李四    技術部
李四    市場部
李四    行政部
...
  • 注意:CROSS JOIN 非常容易產生巨大的結果集,消耗大量資源,務必謹慎使用

練習題

假設我們有如上創建的 employeesdepartments 表。

  1. 找出所有在“技術部”工作的員工姓名。
  2. 列出所有部門的名稱,以及該部門的員工數量(如果某部門沒有員工,數量顯示為0)。
  3. 找出所有沒有分配到任何有效部門的員工姓名(即員工表中的dept_id在部門表中不存在,或者員工的dept_id為NULL)。
  4. 列出所有員工的姓名,以及他們所在部門的名稱。對于沒有部門的員工孫七,部門名稱應顯示為 “未分配”;對于部門ID存在但部門表中無對應名稱的趙六,部門名稱應顯示為 “未知部門”。
  5. 使用 LEFT SEMI JOIN,找出所有部門ID為101的員工信息。
  6. 解釋 INNER JOIN 和 LEFT OUTER JOIN 在處理不匹配數據時的主要區別。
  7. 如果 employees 表有100行,departments 表有5行,那么 CROSS JOIN 會產生多少行結果?
  8. 找出所有既有員工,其部門也在部門表中存在的員工姓名和部門名稱。(提示:思考多種JOIN方式)
  9. 使用 FULL OUTER JOIN,然后篩選出只存在于員工表(在部門表無匹配)或只存在于部門表(在員工表無匹配)的記錄。請描述如何篩選。
  10. 查詢所有部門ID (dept_id),以及這些部門的名稱。如果一個部門ID只存在于員工表中,也需要列出這個ID,但部門名稱顯示為NULL。

練習題答案

  1. 找出所有在“技術部”工作的員工姓名。
SELECT e.emp_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE d.dept_name = '技術部';
  1. 列出所有部門的名稱,以及該部門的員工數量(如果某部門沒有員工,數量顯示為0)。
SELECT d.dept_name, COUNT(e.emp_id) AS employee_count
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_id, d.dept_name;
  1. 找出所有沒有分配到任何有效部門的員工姓名(即員工表中的dept_id在部門表中不存在,或者員工的dept_id為NULL)。
SELECT e.emp_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id
WHERE d.dept_id IS NULL;
  1. 列出所有員工的姓名,以及他們所在部門的名稱。對于沒有部門的員工孫七,部門名稱應顯示為 “未分配”;對于部門ID存在但部門表中無對應名稱的趙六,部門名稱應顯示為 “未知部門”。
SELECT
e.emp_name,
CASE
WHEN e.dept_id IS NULL THEN '未分配'
WHEN d.dept_name IS NULL THEN '未知部門'
ELSE d.dept_name
END AS department_status
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
  1. 使用 LEFT SEMI JOIN,找出所有部門ID為101的員工信息。
SELECT e.emp_id, e.emp_name, e.dept_id
FROM employees e
LEFT SEMI JOIN departments d ON e.dept_id = d.dept_id AND e.dept_id = 101;
  1. 解釋 INNER JOIN 和 LEFT OUTER JOIN 在處理不匹配數據時的主要區別。
    INNER JOIN 只保留兩邊表中都能通過連接條件找到匹配的行。如果左表的一行在右表中沒有匹配,或者右表的一行在左表中沒有匹配,這些行都會被丟棄。
    LEFT OUTER JOIN 會保留左表的所有行。如果左表的某行在右表中找到了匹配,則合并兩邊的列;如果在右表中找不到匹配,則右表對應的列將填充為NULL,但左表的行仍然會出現在結果中。

  2. 如果 employees 表有100行,departments 表有5行,那么 CROSS JOIN 會產生多少行結果?
    100 * 5 = 500 行。

  3. 找出所有既有員工,其部門也在部門表中存在的員工姓名和部門名稱。(提示:思考多種JOIN方式)

SELECT e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
  1. 使用 FULL OUTER JOIN,然后篩選出只存在于員工表(在部門表無匹配)或只存在于部門表(在員工表無匹配)的記錄。請描述如何篩選。
    篩選條件是:當 employees.emp_id IS NULL (表示這條記錄只在departments表中有) 或者 departments.dept_id IS NULL (表示這條記錄只在employees表中有,且連接失敗)。
SELECT e.emp_name, e.dept_id AS emp_dept_id, d.dept_name, d.dept_id AS dep_dept_id
FROM employees e
FULL OUTER JOIN departments d ON e.dept_id = d.dept_id
WHERE e.emp_id IS NULL OR d.dept_id IS NULL;
  1. 查詢所有部門ID (dept_id),以及這些部門的名稱。如果一個部門ID只存在于員工表中,也需要列出這個ID,但部門名稱顯示為NULL。
SELECT DISTINCT e.dept_id AS emp_dept_id_distinct, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Excel在每行下面插入數量不等的空行

1、在B列輸入要添加的空行數量(如果加7行,則寫6,也可以插入數量不等的空行) 2、在C1單元格輸入1 3、在C2輸入公式:SUM($B$1:B1)1,下拉填充 4、在C9單元格輸入1 5、選中C9單元格-->選擇菜單欄“開始”…

iOS熱更新技術要點與風險分析

iOS的熱更新技術允許開發者在無需重新提交App Store審核的情況下,動態修復Bug或更新功能,但需注意蘋果的審核政策限制。以下是iOS熱更新的主要技術方案及要點: 一、主流熱更新技術方案 JavaScript動態化框架 React Native & Weex 通過Jav…

服務器多用戶共享Conda環境操作指南——Ubuntu24.02

1. 使用阿里云鏡像下載 Anaconda 最新版本 wget https://mirrors.aliyun.com/anaconda/archive/Anaconda3-2024.02-1-Linux-x86_64.sh bug解決方案 若出現:使用wget在清華鏡像站下載Anaconda報錯ERROR 403: Forbidden. 解決方案:wget --user-agent“M…

基于YOLO算法的目標檢測系統實現指南

YOLO(You Only Look Once)作為計算機視覺領域最具影響力的實時目標檢測算法之一,其最新版本YOLOv8在速度與精度之間達到了新的平衡。本文將從技術實現角度,詳細介紹如何使用YOLO算法構建高效的目標檢測系統。 一、算法原理與技術架構 1.1 YOLO核心思想…

C++ asio網絡編程(6)利用C11模擬偽閉包實現連接的安全回收

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、智能指針管理Session二、用智能指針來實現Server的函數1.start_accept()1.引用計數注意點2.std::bind 與異步回調函數的執行順序分析 2.handle_accept1.異步…

AI與產品架構設計(2):Agent系統的應用架構與落地實

什么是AI Agent?其在架構中的獨特定位 AI Agent(人工智能代理)是一種模擬人類智能行為的自主系統,通常以大型語言模型(LLM)作為核心引擎。簡單來說,Agent能夠像人一樣感知環境信息、規劃行動方…

Rust 數據結構:String

Rust 數據結構:String Rust 數據結構:String什么是字符串?創建新字符串更新字符串將 push_str 和 push 附加到 String 對象后使用 運算符和 format! 宏 索引到字符串字符串在內存中的表示字節、標量值和字形簇 分割字符串遍歷字符串的方法 R…

Java卡與SSE技術融合實現企業級安全實時通訊

簡介 在數字化轉型浪潮中,安全與實時數據傳輸已成為金融、物聯網等高安全性領域的核心需求。本文將深入剖析東信和平的Java卡權限分級控制技術與浪潮云基于SSE的大模型數據推送技術,探索如何將這兩項創新技術進行融合,構建企業級安全實時通訊系統。通過從零到一的開發步驟,…

繼MCP、A2A之上的“AG-UI”協議橫空出世,人機交互邁入新紀元

第一章:AI交互的進化與挑戰 1.1 從命令行到智能交互 人工智能的發展歷程中,人機交互的方式經歷了多次變革。早期的AI系統依賴命令行輸入,用戶需通過特定指令與機器溝通。隨著自然語言處理技術的進步,語音助手和聊天機器人逐漸普…

MySQL刷題相關簡單語法集合

去重 distinct 關鍵字 eg. :select distinct university from user_profile 返回行數限制: limit關鍵字 eg. :select device_id from user_profile limit 2 返回列重命名:as 關鍵字 eg.:select device_id as user_in…

Kubernetes MCP服務器(K8s MCP):如何使用?

#作者:曹付江 文章目錄 1、什么是 Kubernetes MCP 服務器?1.1、K8s MCP 服務器 2、開始前的準備工作2.1. Kubernetes集群2.2. 安裝并運行 kubectl2.3. Node.js 和 Bun2.4. (可選)Helm v3 3、如何設置 K8s MCP 服務器3.1. 克隆存儲…

計算機網絡-HTTP與HTTPS

文章目錄 計算機網絡網絡模型網絡OSITCP/IP 應用層常用協議HTTP報文HTTP狀態碼HTTP請求類型HTTP握手過程HTTP連接HTTP斷點續傳HTTPSHTTPS握手過程 計算機網絡 網絡模型 為了解決多種設備能夠通過網絡相互通信,解決網絡互聯兼容性問題。 網絡模型是計算機網絡中用于…

Springboot 跨域攔截器配置說明

錯誤代碼 跨域設置 Configuration public class WebConfig implements WebMvcConfigurer {/*** cors 跨域配置*/Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedMethods("GET", "HEAD", &qu…

受不了github的網絡限制了,我開源了一個圖床工具 gitee-spring-boot-starter

嗨嗨嗨~ 我老馬又又來了!!!上次寫了一篇我開源了一款阿里云OSS的spring-boot-starter,然后買的資源包到期了,后面又想白(開)嫖(源)的路子,首先想到了使用gith…

基于labview的聲音采集、存儲、處理

程序1:基于聲卡的數據采集 程序2:基于聲卡的雙聲道模擬輸出 程序3:聲音信號的采集與存儲 程序4:聲音信號的功率譜分析 程序5:基于labview的DTMF

第一次經歷項目上線

這幾天沒寫csdn,因為忙著項目上線的問題,我這階段改了非常多的前端bug哈哈哈哈,說幾個比較好的bug思想! 這個頁面算是我遇到的比較大的bug,因為我一開始的邏輯都寫好了,詢價就是在點擊快遞公司彈出彈框的時…

基于EFISH-SCB-RK3576/SAIL-RK3576的消防機器人控制器技術方案?

(國產化替代J1900的應急救援智能化解決方案) 一、硬件架構設計? ?極端環境防護系統? ?防爆耐高溫設計?: 采用陶瓷纖維復合裝甲(耐溫1200℃持續1小時),通過GB 26784-2023消防設備防爆認證IP68防護等級…

企業開發工具git的使用:從入門到高效團隊協作

前言:本文介紹了Git的安裝、本地倉庫的創建與配置,以及工作區、暫存區和版本庫的區分。詳細講解了版本回退、撤銷修改等操作,并深入探討了分支管理,包括分支的創建、切換、合并、刪除及沖突解決。此外,還介紹了遠程操作…

Java反射機制詳解:原理、應用與實戰

一、反射機制概述 Java反射(Reflection)是Java語言的一個強大特性,它允許程序在運行時(Runtime)獲取類的信息并操作類或對象的屬性、方法等。反射機制打破了Java的封裝性,但也提供了極大的靈活性。 反射的核心思想:在運行時而非編譯時動態獲…

成功案例丨從草圖到鞍座:用先進的發泡成型仿真技術變革鞍座制造

案例簡介 在鞍座制造中,聚氨酯泡沫成型工藝是關鍵環節,傳統依賴實驗測試的方法耗時且成本高昂。為解決這一問題,意大利自行車鞍座制造商 Selle Royal與Altair合作,采用Altair Inspire PolyFoam軟件進行發泡成型仿真。 該工具幫助團…