SQL join中的on与where区别,附PySpark和SQL代码

目录

参考网址: join on 和 where的区别

  • 定义df
d1 = {'name1':["A","B","C"], 'height':[165,170,160]}
d2 = {'name2':["B","C","D"], 'age':[45,43,50]}
df1 = spark.createDataFrame(pd.DataFrame(d1))
df2 = spark.createDataFrame(pd.DataFrame(d2))
df1.createOrReplaceTempView("table1")
df2.createOrReplaceTempView("table2")
     df1           df2
+-----+------+    +-----+---+
|name1|height|    |name2|age|
+-----+------+    +-----+---+
|    A|   165|    |    B| 45|
|    B|   170|    |    C| 43|
|    C|   160|    |    D| 50|
+-----+------+    +-----+---+
  • join是一个笛卡尔积操作,形成一张临时表
>>>spark.sql(
    """
    select * from table1
    left join table2
    """
).show()
# 输出
+-----+------+-----+---+
|name1|height|name2|age|
+-----+------+-----+---+
|    A|   165|    B| 45|
|    A|   165|    C| 43|
|    A|   165|    D| 50|
|    B|   170|    B| 45|
|    B|   170|    C| 43|
|    B|   170|    D| 50|
|    C|   160|    B| 45|
|    C|   160|    C| 43|
|    C|   160|    D| 50|
+-----+------+-----+---+

ON

on条件是在生成临时表时使用的条件,他不管on的条件是否为真,都会返回左边表所有的记录

  • (1) 自己理解: 如果条件为左表条件,返回on中满足条件的左表记录对应右表的所有记录,返回不满足条件的左表记录对应右表null,不管on的条件是否为真,都会返回左边表所有的记录
>>>spark.sql(
    """
    select * from table1
    left join table2
    on table1.name1 in ('A','B')
    """
).show()
# 输出
+-----+------+-----+----+
|name1|height|name2| age|
+-----+------+-----+----+
|    A|   165|    B|  45|
|    A|   165|    C|  43|
|    A|   165|    D|  50|
|    B|   170|    B|  45|
|    B|   170|    C|  43|
|    B|   170|    D|  50|
|    C|   160| null|null|
+-----+------+-----+----+
  • (2)自己理解: 如果条件为右表条件,返回on中满足条件的右表记录对应的左表所有记录。
>>>spark.sql(
    """
    select * from table1
    left join table2
    on table2.name2 in ('B','C')
    """
).show()
# 输出
+-----+------+-----+---+
|name1|height|name2|age|
+-----+------+-----+---+
|    A|   165|    B| 45|
|    A|   165|    C| 43|
|    B|   170|    B| 45|
|    B|   170|    C| 43|
|    C|   160|    B| 45|
|    C|   160|    C| 43|
+-----+------+-----+---+
  • (3)自己理解: 如果条件为右表条件,但没有满足on中条件的右表记录,则也返回左表记录
>>>spark.sql(
    """
    select * from table1
    left join table2
    on table2.name2 in ('A')
    """
).show()
# 输出
+-----+------+-----+----+
|name1|height|name2| age|
+-----+------+-----+----+
|    A|   165| null|null|
|    B|   170| null|null|
|    C|   160| null|null|
+-----+------+-----+----+
  • (4)自己理解: 如果条件为左表条件等于右表条件,则在1的基础上,过滤右表条件
>>>spark.sql(
    """
    select * from table1
    left join table2
    on table1.name1=table2.name2
    """
).show()
# 输出
+-----+------+-----+----+
|name1|height|name2| age|
+-----+------+-----+----+
|    A|   165| null|null|
|    B|   170|    B|  45|
|    C|   160|    C|  43|
+-----+------+-----+----+

WHERE

where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义了,where后提交不为真的就全部过滤掉.

  • 在笛卡尔积的基础上,直接按照where过滤
>>>spark.sql(
    """
    select * from table1
    left join table2
    where table1.name1='A'
    """
).show()
# 输出
+-----+------+-----+---+
|name1|height|name2|age|
+-----+------+-----+---+
|    A|   165|    B| 45|
|    A|   165|    C| 43|
|    A|   165|    D| 50|
+-----+------+-----+---+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值