当前位置: 首页 > news >正文

Hive 多表查询案例

文章目录

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

前提条件

  • 安装好Hive,可参考:openEuler24.03 LTS下安装Hive3

Hive 多表查询案例

JOIN案例

JOIN查询数据准备
-- 创建员工临时表
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)

只返回两个表中匹配的行

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

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

-- 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. 多表连接

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

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

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

-- 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案例

数据准备
-- 创建另一个与 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 合并两个表的结果,会去除重复行

-- 使用 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 合并两个表的结果,不会去除重复行

-- 使用 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!

http://www.xdnf.cn/news/93943.html

相关文章:

  • poi生成横向文档以及复杂表头
  • 【Hive入门】Hive数据模型与存储格式深度解析:从理论到实践的最佳选择
  • 【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】
  • 敏捷开发中的AI测试:未来的趋势与挑战
  • ubantu18.04(Hadoop3.1.3)Hive3.1.2安装指南
  • 静态存储区(Static Storage Area)的总结
  • 深入解析:C 语言实现快速傅里叶变换(FFT)算法
  • HTML与Web 性能优化:构建高速响应的现代网站
  • 微帧Visionular斩获NAB Show 2025年度产品奖
  • 网络原理————HTTP
  • Apache中间件解析漏洞与安全加固
  • OpenRAN 6G网络:架构、用例和开放问题
  • 系统架构师2025年论文《论软件三层结构的设计》
  • 【KWDB 创作者计划】_嵌入式硬件篇---数字电子器件
  • 互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析
  • 26-算法打卡-字符串-右旋字符串-第二十六天
  • 【每日八股】复习计算机网络 Day4:TCP 协议的其他相关问题
  • 机器学习算法-分类决策树
  • uv run 都做了什么?
  • WSL2-Ubuntu22.04下拉取Docker MongoDB镜像并启动
  • 与Ubuntu相关命令
  • 【Java学习方法】终止循环的关键字
  • 阻塞队列的介绍和简单实现——多线程编程简单案例[多线程编程篇(4)]
  • 第六章:Multi-Backend Configuration
  • VUE的创建
  • 锁存器知识点详解
  • spring,spring boot, spring cloud三者区别
  • [特殊字符]‍[特殊字符]Linux驱动开发入门 | 并发与互斥机制详解
  • Vue.js 之数据绑定
  • UV: Python包和项目管理器(从入门到不放弃教程)