美文网首页
理解join操作

理解join操作

作者: 橡树人 | 来源:发表于2021-03-28 11:23 被阅读0次

join操作

为什么要给予join操作特殊的关照?

答:join操作受到了许多关注,存在若干个变形,理由有3个:

  1. join操作是关系代数中最有用的操作之一,是联合来自两个或者多个关系的信息最常用的操作之一;
  2. 虽然一个join可通过selections和projections之后接一个cross-product来定义,但是在实践中,join比普通的cross-product出现的频率更高;
  3. 不用将底层的叉积实物化就能识别和实现join非常重要,因为一个cross-product的结果通常要比join大很多;
  4. 跟叉积相比,用join操作来表示一些查询更自然;
  5. 存在一些仅使用叉积是很难表示的查询;

难道不能使用cross-product、selections、projections等操作来表示每个join操作吗?

答:不能,因为存在一些查询用叉积是很难表示的。

join操作的变形

join类型和join条件.png
  • inner join
    natual join;
    join...on
    join...using
  • outer join
    left outer join
    right outer join
    full outer join

natural join

natural-join.png

示例代码

mysql> desc student;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| ID | varchar(5) | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| dept_name | varchar(20) | YES | MUL | NULL | |
| tot_cred | decimal(3,0) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> desc takes;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| ID | varchar(5) | NO | PRI | NULL | |
| course_id | varchar(8) | NO | PRI | NULL | |
| sec_id | varchar(8) | NO | PRI | NULL | |
| semester | varchar(6) | NO | PRI | NULL | |
| year | decimal(4,0) | NO | PRI | NULL | |
| grade | varchar(2) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> select count(*) from student;
+----------+
| count(*) |
+----------+
| 13 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from takes;
+----------+
| count(*) |
+----------+
| 22 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from student natural join takes;
+----------+
| count(*) |
+----------+
| 22 |
+----------+
1 row in set (0.00 sec)

mysql> select * from student natural join takes;
+-------+----------+------------+----------+-----------+--------+----------+------+-------+
| ID | name | dept_name | tot_cred | course_id | sec_id | semester | year | grade |
+-------+----------+------------+----------+-----------+--------+----------+------+-------+
| 00128 | Zhang | Comp. Sci. | 102 | CS-101 | 1 | Fall | 2017 | A |
| 00128 | Zhang | Comp. Sci. | 102 | CS-347 | 1 | Fall | 2017 | A- |
| 12345 | Shankar | Comp. Sci. | 32 | CS-101 | 1 | Fall | 2017 | C |
| 12345 | Shankar | Comp. Sci. | 32 | CS-190 | 2 | Spring | 2017 | A |
| 12345 | Shankar | Comp. Sci. | 32 | CS-315 | 1 | Spring | 2018 | A |
| 12345 | Shankar | Comp. Sci. | 32 | CS-347 | 1 | Fall | 2017 | A |
| 19991 | Brandt | History | 80 | HIS-351 | 1 | Spring | 2018 | B |
| 23121 | Chavez | Finance | 110 | FIN-201 | 1 | Spring | 2018 | C+ |
| 44553 | Peltier | Physics | 56 | PHY-101 | 1 | Fall | 2017 | B- |
| 45678 | Levy | Physics | 46 | CS-101 | 1 | Fall | 2017 | F |
| 45678 | Levy | Physics | 46 | CS-101 | 1 | Spring | 2018 | B+ |
| 45678 | Levy | Physics | 46 | CS-319 | 1 | Spring | 2018 | B |
| 54321 | Williams | Comp. Sci. | 54 | CS-101 | 1 | Fall | 2017 | A- |
| 54321 | Williams | Comp. Sci. | 54 | CS-190 | 2 | Spring | 2017 | B+ |
| 55739 | Sanchez | Music | 38 | MU-199 | 1 | Spring | 2018 | A- |
| 76543 | Brown | Comp. Sci. | 58 | CS-101 | 1 | Fall | 2017 | A |
| 76543 | Brown | Comp. Sci. | 58 | CS-319 | 2 | Spring | 2018 | A |
| 76653 | Aoi | Elec. Eng. | 60 | EE-181 | 1 | Spring | 2017 | C |
| 98765 | Bourikas | Elec. Eng. | 98 | CS-101 | 1 | Fall | 2017 | C- |
| 98765 | Bourikas | Elec. Eng. | 98 | CS-315 | 1 | Spring | 2018 | B |
| 98988 | Tanaka | Biology | 120 | BIO-101 | 1 | Summer | 2017 | A |
| 98988 | Tanaka | Biology | 120 | BIO-301 | 1 | Summer | 2018 | NULL |
+-------+----------+------------+----------+-----------+--------+----------+------+-------+
22 rows in set (0.00 sec)

相关文章

  • 理解join操作

    join操作 为什么要给予join操作特殊的关照? 答:join操作受到了许多关注,存在若干个变形,理由有3个:j...

  • MySQL数据库篇4

    本章主要为多表联查的相关操作。 关键词:left join、reght join、inner join、join ...

  • 图说SQL Join

    原文:图说SQL Join 如果你也曾经被SQL语言中各种Join操作:Left Join, Right Join...

  • hive 查询性能优化总结

    一、join优化 ** Join查找操作的基本原则:** 应该将条目少的表/子查询放在 Join 操作符的左边。原...

  • kafka streams的join实例

    序 本文简单介绍一下kafka streams的join操作 join A join operation merg...

  • MapReduce join

    一、说明 MapReduce提供的表连接操作包括:Map端join、Reduce端join、semi join(半...

  • MySQL 的 join 功能弱爆了?

    简介: 对于 join 操作的实现,大概有 Nested Loop Join (循环嵌套连接),Hash Join...

  • join

    join 操作 window join 方式 代码形式 相当于sql中的stream1 join stream2 ...

  • 关于left join

    前言 join是SQL查询中非常常见的一种操作,具体来说有join.left join,right join ,f...

  • pyspark: dataframe的join操作

    本文主要是想看看dataframe中join操作后的结果。 left join 上面的例子,join也同样适用。 ...

网友评论

      本文标题:理解join操作

      本文链接:https://www.haomeiwen.com/subject/njkphltx.html