Hive 多表查询案例

文章目录

    • 前提条件
    • [Hive 多表查询案例](#Hive 多表查询案例)
      • JOIN案例
        • JOIN查询数据准备
        • [1. 内连接(INNER JOIN)](#1. 内连接(INNER JOIN))
        • [2. 左外连接(LEFT OUTER JOIN)](#2. 左外连接(LEFT OUTER JOIN))
        • [3. 右外连接(RIGHT OUTER JOIN)](#3. 右外连接(RIGHT OUTER JOIN))
        • [4. 全外连接(FULL OUTER JOIN)](#4. 全外连接(FULL OUTER JOIN))
        • [5. 多表连接](#5. 多表连接)
        • [6. 笛卡尔集(CROSS JOIN)](#6. 笛卡尔集(CROSS JOIN))
      • UNION案例

前提条件

Hive 多表查询案例

JOIN案例

JOIN查询数据准备
sql 复制代码
-- 创建员工临时表
CREATE TEMPORARY TABLE temp_employees (
    emp_id INT,
    emp_name STRING,
    dept_id INT
);

-- 插入员工数据
INSERT INTO temp_employees VALUES
(1, 'Alice', 10),
(2, 'Bob', 20),
(3, 'Charlie', NULL);

-- 创建部门临时表
CREATE TEMPORARY TABLE temp_departments (
    dept_id INT,
    dept_name STRING
);

-- 插入部门数据
INSERT INTO temp_departments VALUES
(10, 'HR'),
(20, 'IT'),
(30, 'Finance');

-- 创建项目临时表
CREATE TEMPORARY TABLE temp_projects (
    project_id INT,
    emp_id INT,
    project_name STRING
);

-- 插入项目数据
INSERT INTO temp_projects VALUES
(101, 1, 'Project A'),
(102, 2, 'Project B');
1. 内连接(INNER JOIN)

只返回两个表中匹配的行

sql 复制代码
-- 1. 内连接(INNER JOIN)
-- 只返回两个表中匹配的行
SELECT e.emp_id, e.emp_name, d.dept_name
FROM temp_employees e
INNER JOIN temp_departments d
ON e.dept_id = d.dept_id;
-- 结果
e.emp_id        e.emp_name      d.dept_name
1       Alice   HR
2       Bob     IT
2. 左外连接(LEFT OUTER JOIN)

返回左表的所有行,以及右表中匹配的行,右表无匹配则对应列值为 NULL

sql 复制代码
-- 2. 左外连接(LEFT OUTER JOIN)
-- 返回左表的所有行,以及右表中匹配的行,右表无匹配则对应列值为 NULL
-- LEFT OUTER JOIN 可以写成 LEFT JOIN
SELECT e.emp_id, e.emp_name, d.dept_name
FROM temp_employees e
LEFT OUTER JOIN temp_departments d
ON e.dept_id = d.dept_id;
-- 结果
e.emp_id        e.emp_name      d.dept_name
1       Alice   HR
2       Bob     IT
3       Charlie NULL

-- 另外的写法
SELECT e.emp_id, e.emp_name, d.dept_name
FROM temp_employees e
LEFT JOIN temp_departments d
ON e.dept_id = d.dept_id;
3. 右外连接(RIGHT OUTER JOIN)

返回右表的所有行,以及左表中匹配的行,左表无匹配则对应列值为 NULL

复制代码
-- 3. 右外连接(RIGHT OUTER JOIN)
-- 返回右表的所有行,以及左表中匹配的行,左表无匹配则对应列值为 NULL
-- RIGHT OUTER JOIN 可以写成 RIGHT JOIN
SELECT e.emp_id, e.emp_name, d.dept_name
FROM temp_employees e
RIGHT OUTER JOIN temp_departments d
ON e.dept_id = d.dept_id;
-- 结果
e.emp_id        e.emp_name      d.dept_name
1       Alice   HR
2       Bob     IT
NULL    NULL    Finance
4. 全外连接(FULL OUTER JOIN)

返回两个表中的所有行,某表无匹配则对应列值为 NULL

sql 复制代码
-- 4. 全外连接(FULL OUTER JOIN)
-- 返回两个表中的所有行,某表无匹配则对应列值为 NULL
-- FULL OUTER JOIN可以写出FULL JOIN
SELECT e.emp_id, e.emp_name, d.dept_name
FROM temp_employees e
FULL OUTER JOIN temp_departments d
ON e.dept_id = d.dept_id;
-- 结果
e.emp_id        e.emp_name      d.dept_name
3       Charlie NULL
1       Alice   HR
2       Bob     IT
NULL    NULL    Finance

-- 另外的写法
SELECT e.emp_id, e.emp_name, d.dept_name
FROM temp_employees e
FULL JOIN temp_departments d
ON e.dept_id = d.dept_id;
5. 多表连接

连接员工表、部门表和项目表

sql 复制代码
-- 5. 多表连接
-- 连接员工表、部门表和项目表
SELECT e.emp_id, e.emp_name, d.dept_name, p.project_name
FROM temp_employees e
JOIN temp_departments d ON e.dept_id = d.dept_id
JOIN temp_projects p ON e.emp_id = p.emp_id;
-- 结果
e.emp_id        e.emp_name      d.dept_name     p.project_name
1       Alice   HR      Project A
2       Bob     IT      Project B
6. 笛卡尔集(CROSS JOIN)

返回两个表中所有可能的行组合

sql 复制代码
-- 6. 笛卡尔集(CROSS JOIN)
-- 返回两个表中所有可能的行组合
SELECT e.emp_id, e.emp_name, d.dept_name
FROM temp_employees e
CROSS JOIN temp_departments d;
-- 结果
e.emp_id        e.emp_name      d.dept_name
1       Alice   HR
1       Alice   IT
1       Alice   Finance
2       Bob     HR
2       Bob     IT
2       Bob     Finance
3       Charlie HR
3       Charlie IT
3       Charlie Finance

-- 另外的写法
SELECT e.emp_id, e.emp_name, d.dept_name
FROM temp_employees e,temp_departments d;

UNION案例

数据准备
sql 复制代码
-- 创建另一个与 temp_employees 结构相同的临时表 temp_employees2
CREATE TEMPORARY TABLE temp_employees2 (
    emp_id INT,
    emp_name STRING,
    dept_id INT
);

-- 插入数据到 temp_employees2
INSERT INTO temp_employees2 VALUES
(2, 'Bob', 20),
(4, 'David', 10),
(5, 'Eve', 20);
1.UNION

使用 UNION 合并两个表的结果,会去除重复行

sql 复制代码
-- 使用 UNION 合并两个表的结果,会去除重复行
SELECT emp_id, emp_name, dept_id
FROM temp_employees
UNION
SELECT emp_id, emp_name, dept_id
FROM temp_employees2;
-- 结果
_u1.emp_id      _u1.emp_name    _u1.dept_id
1       Alice   10
2       Bob     20
3       Charlie NULL
4       David   10
5       Eve     20
2.UNION ALL

使用 UNION ALL 合并两个表的结果,不会去除重复行

sql 复制代码
-- 使用 UNION ALL 合并两个表的结果,不会去除重复行
SELECT emp_id, emp_name, dept_id
FROM temp_employees
UNION ALL
SELECT emp_id, emp_name, dept_id
FROM temp_employees2;  
-- 结果
_u1.emp_id      _u1.emp_name    _u1.dept_id
1       Alice   10
2       Bob     20
3       Charlie NULL
2       Bob     20
4       David   10
5       Eve     20

完成!enjoy it!

相关推荐
Gain_chance5 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
无级程序员13 小时前
大数据Hive之拉链表增量取数合并设计(主表加历史表合并成拉链表)
大数据·hive·hadoop
华农DrLai16 小时前
Spark SQL Catalyst 优化器详解
大数据·hive·sql·flink·spark
心疼你的一切1 天前
解密CANN仓库:AIGC的算力底座、关键应用与API实战解析
数据仓库·深度学习·aigc·cann
qq_12498707531 天前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
十月南城1 天前
Hive与离线数仓方法论——分层建模、分区与桶的取舍与查询代价
数据仓库·hive·hadoop
鹏说大数据1 天前
Spark 和 Hive 的关系与区别
大数据·hive·spark
B站计算机毕业设计超人1 天前
计算机毕业设计Hadoop+Spark+Hive招聘推荐系统 招聘大数据分析 大数据毕业设计(源码+文档+PPT+ 讲解)
大数据·hive·hadoop·python·spark·毕业设计·课程设计
B站计算机毕业设计超人1 天前
计算机毕业设计hadoop+spark+hive交通拥堵预测 交通流量预测 智慧城市交通大数据 交通客流量分析(源码+LW文档+PPT+讲解视频)
大数据·hive·hadoop·python·spark·毕业设计·课程设计
AI架构师小马1 天前
Hive调优手册:从入门到精通的完整指南
数据仓库·hive·hadoop·ai