首页 > 其他分享 >LEFT JOIN 与 left semi join 的区别

LEFT JOIN 与 left semi join 的区别

时间:2024-09-13 10:51:58浏览次数:1  
标签:customer JOIN semi example join com id LEFT

好的,我再给你举一个使用 Hive SQL 的例子,比较 `LEFT JOIN` 和 `LEFT SEMI JOIN` 的区别,并加入测试数据。

假设我们有两个表:

1. `customers` 表:
   - `customer_id`: 客户 ID
   - `customer_name`: 客户名称
   - `customer_email`: 客户邮箱

2. `orders` 表:
   - `order_id`: 订单 ID
   - `customer_id`: 下单客户 ID
   - `order_amount`: 订单金额

我们先创建这两个表并插入一些测试数据:

```sql
CREATE TABLE customers (
  customer_id INT,
  customer_name STRING,
  customer_email STRING
);

INSERT INTO customers VALUES
  (1, 'John Doe', '[email protected]'),
  (2, 'Jane Smith', '[email protected]'),
  (3, 'Bob Johnson', '[email protected]'),
  (4, 'Alice Williams', '[email protected]'),
  (5, 'Tom Lee', '[email protected]');

CREATE TABLE orders (
  order_id INT,
  customer_id INT,
  order_amount DOUBLE
);

INSERT INTO orders VALUES
  (1, 1, 100.0),
  (2, 2, 200.0),
  (3, 1, 150.0),
  (4, 3, 300.0),
  (5, 4, 120.0),
  (6, 2, 180.0),
  (7, 5, 250.0);
```

现在,让我们看看 `LEFT JOIN` 和 `LEFT SEMI JOIN` 的区别:

1. **使用 `LEFT JOIN`**

```sql
SELECT
  c.customer_id,
  c.customer_name,
  c.customer_email,
  COUNT(o.order_id) AS order_count,
  SUM(o.order_amount) AS total_order_amount
FROM
  customers c
  LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY
  c.customer_id,
  c.customer_name,
  c.customer_email;
```

这个查询会返回以下结果:

| customer_id | customer_name | customer_email           | order_count | total_order_amount |
|-------------|---------------|--------------------------|-------------|-------------------|
| 1           | John Doe      | [email protected]     | 2           | 250.0             |
| 2           | Jane Smith    | [email protected]   | 2           | 380.0             |
| 3           | Bob Johnson   | [email protected]  | 1           | 300.0             |
| 4           | Alice Williams| [email protected]| 1           | 120.0             |
| 5           | Tom Lee       | [email protected]      | 1           | 250.0             |

使用 `LEFT JOIN`,我们可以获取所有客户的信息,包括没有下过订单的客户。对于没有订单的客户,`order_count` 和 `total_order_amount` 列会显示为 0 和 NULL。

2. **使用 `LEFT SEMI JOIN`**

```sql
SELECT
  c.customer_id,
  c.customer_name,
  c.customer_email
FROM
  customers c
  LEFT SEMI JOIN orders o ON c.customer_id = o.customer_id;
```

这个查询会返回以下结果:

| customer_id | customer_name | customer_email           |
|-------------|---------------|--------------------------|
| 1           | John Doe      | [email protected]     |
| 2           | Jane Smith    | [email protected]   |
| 3           | Bob Johnson   | [email protected]  |
| 4           | Alice Williams| [email protected]|
| 5           | Tom Lee       | [email protected]      |

使用 `LEFT SEMI JOIN`,我们只能获取有下过订单的客户信息。对于没有订单的客户,它们不会出现在结果集中。
并且不能展示右表的数据。
总的来说,`LEFT JOIN` 会返回左表中的所有行,并将右表中匹配的行合并到结果集中。而 `LEFT SEMI JOIN` 只会返回左表中与右表有匹配的行,不会返回左表中没有匹配的行。 根据具体的业务需求,选择合适的连接方式可以提高查询效率和返回结果的准确性。 如果你有任何其他问题,欢迎继续问我。

 

 

 

  • ‌left join‌适用于需要从两个表中获取所有相关记录的场景,尤其是当右表中的记录可能重复时。
  • ‌left semi join‌适用于只需要获取左表中记录的场景,尤其是当右表中的记录可能重复且不需要重复显示左表记录时。
 重点讨论了LEFT SEMI JOIN作为IN/EXISTS子查询高效实现的特点   查询   a left semi join b    返回 A表 存在b 表中的数据 也就是 B表是大表的话 查询 在不在a表中 , 有的话返回.        

标签:customer,JOIN,semi,example,join,com,id,LEFT
From: https://www.cnblogs.com/mengbin0546/p/18411769

相关文章

  • MUR3040CT-ASEMI快恢复二极管MUR3040CT
    编辑:llMUR3040CT-ASEMI快恢复二极管MUR3040CT型号:MUR3040CT品牌:ASEMI封装:TO-220AB安装方式:插件批号:最新恢复时间:35ns最大平均正向电流(IF):30A最大循环峰值反向电压(VRRM):400V最大正向电压(VF):0.95V~1.90V工作温度:-50°C~150°C芯片个数:2芯片尺寸:mil正向浪涌电流(IFMS):300AM......
  • [1062] The function of geopandas.sjoin
    ref:https://geopandas.org/en/stable/docs/reference/api/geopandas.sjoin.htmlgeopandas.sjoingeopandas.sjoin(left_df, right_df, how='inner', predicate='intersects', lsuffix='left', rsuffix='right', distance=None, o......
  • `FULL JOIN` 和 `UNION ALL`
    在SQL中,`FULLJOIN`和`UNIONALL`是两种不同的操作,它们的结果也有显著的区别。###FULLJOIN`FULLJOIN`(全外连接)会返回两张表中所有的记录。对于没有匹配的记录,结果中会用`NULL`填充缺失的部分。具体来说:-如果表A和表B中有匹配的记录,这些记录会合并在一起。-如果......
  • MUR2060CTR-ASEMI快恢复二极管对管MUR2060CTR
    编辑:llMUR2060CTR-ASEMI快恢复二极管对管MUR2060CTR型号:MUR2060CTR品牌:ASEMI封装:TO-220AB安装方式:插件批号:最新最大平均正向电流(IF):20A最大循环峰值反向电压(VRRM):600V最大正向电压(VF):0.95V~1..90V工作温度:-50°C~150°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量......
  • MUR2060CT-ASEMI快恢复二极管MUR2060CT
    编辑:llMUR2060CT-ASEMI快恢复二极管MUR2060CT型号:MUR2060CT品牌:ASEMI封装:TO-220AB安装方式:插件批号:最新恢复时间:35ns最大平均正向电流(IF):20A最大循环峰值反向电压(VRRM):600V最大正向电压(VF):0.95V~1.90V工作温度:-50°C~150°C芯片个数:2芯片尺寸:mil正向浪涌电流(IFMS):200AM......
  • MySQL 中的 JOIN 操作:连接数据的强大工具
    在MySQL数据库的使用中,JOIN操作是一个非常重要且强大的功能,它允许我们从多个表中检索数据,从而实现更复杂的查询和数据分析。今天,我们就来深入了解一下MySQL中的JOIN操作。一、为什么需要JOIN操作?在实际的数据库应用中,数据通常被分散存储在多个表中。例如,一个电商系统可......
  • S50VB100-ASEMI单向整流桥S50VB100
    编辑:llS50VB100-ASEMI单向整流桥S50VB100型号:S50VB100品牌:ASEMI封装:SVB-4安装方式:直插批号:2024+现货:50000+正向电流(Id):50A反向耐压(VRRM):1000V正向浪涌电流:450A正向电压(VF):1.10V引脚数量:4芯片个数:4芯片尺寸:102MIL功率(Pd):大功率工作温度:-55°C~150°C类型:整流方桥、......
  • 3SRB5016-ASEMI三相整流桥3SRB5016
    编辑:ll3SRB5016-ASEMI三相整流桥3SRB5016型号:3SRB5016品牌:ASEMI封装:3SRB-5批号:2024+现货:50000+最大重复峰值反向电压:1600V最大正向平均整流电流(Vdss):50A功率(Pd):大功率芯片个数:5引脚数量:5安装方式:直插类型:整流扁桥、整流桥正向浪涌电流:500A正向电压:1.00V~1.30V封......
  • D45XT120-ASEMI无人机专用D45XT120
    编辑:llD45XT120-ASEMI无人机专用D45XT120型号:26MT160品牌:ASEMI封装:DXT-5批号:2024+现货:50000+最大重复峰值反向电压:1200V最大正向平均整流电流(Vdss):45A功率(Pd):大功率芯片个数:5引脚数量:5安装方式:直插类型:整流扁桥、整流桥正向浪涌电流:450A正向电压:1.00V~1.10V封装......
  • 基于ONSEMI电源管理芯片NCP1607之AC300V高输入电压36W调色温智能电源
    NCP1607PFC在LED智能电源PFC处理部分性价比高,输入电压范围宽到AC90-300V,母线电压420V导致高压低电流整机光效高,成熟芯片可靠新高,没有任何纹波与频闪,智能护眼。►场景应用图►产品实体图►展示板照片►方案方块图►核心技术优势1.输入AC300V/50HZ电源无损坏无发......