加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Apache Flink 漫谈系列 - JOIN 算子

发布时间:2018-11-20 17:47:47 所属栏目:教程 来源:孙金城
导读:聊什么 在《Apache Flink 漫谈系列 - SQL概览》中我们先容了JOIN算子的语义和根基的行使方法,先容进程中各人发明Apache Flink在语法语义上是遵循ANSI-SQL尺度的,那么再深思一下传统数据库为啥必要有JOIN算子呢?在实现道理上面Apache Flink内部实现和传统

如上功效我们获得9行=student(3) x course(3)。交错联接一样平常会耗损较大的资源,也被许多用户质疑交错联接存在的意义?(任何时辰我们都有质疑的权力,同时也提议我们养本钱身质疑本身“质疑”的风俗,就像小时辰不领略怙恃的“空话”一样)。

我们以开篇的示例声名交错联接的奇妙之一,开篇中我们的查询需求是:在门生表(学号,姓名,性别),课程表(课程号,课程名,学分)和后果表(学号,课程号,分数)中查询全部门生的姓名,课程名和测验分数。开篇中的SQL语句获得的功效如下:

  1. mysql> SELECT 
  2.     ->   student.name, course.name, score 
  3.     -> FROM student JOIN  score ON student.no = score.s_no 
  4.     ->              JOIN course ON score.c_no = course.no; 
  5. +-------+-------+-------+ 
  6. | name  | name  | score | 
  7. +-------+-------+-------+ 
  8. | Sunny | Java  |    80 | 
  9. | Sunny | Blink |    98 | 
  10. | Sunny | Spark |    76 | 
  11. | Kevin | Java  |    78 | 
  12. | Kevin | Blink |    88 | 
  13. | Kevin | Spark |    68 | 
  14. +-------+-------+-------+ 
  15. 6 rows in set (0.00 sec) 

如上INNER JOIN的功效我们发明少了Tom同窗的后果,缘故起因是Tom同窗没有介入测验,在score表中没有Tom的后果,可是我们也许但愿固然Tom没有介入测验但如故但愿Tom的后果可以或许在查询功效中表现(后果 0 分),面临这样的需求,我们怎么处理赏罚呢?交错联接可以辅佐我们:

  • 第一步 student和course 举办交错联接:
    1. mysql> SELECT 
    2.     ->   stu.no, c.no, stu.name, c.name 
    3.     -> FROM student stu JOIN course c  笛卡尔积 
    4.     -> ORDER BY stu.no; -- 排序只是利便各人查察:) 
    5. +------+-----+-------+-------+ 
    6. | no   | no  | name  | name  | 
    7. +------+-----+-------+-------+ 
    8. | S001 | C03 | Sunny | Spark | 
    9. | S001 | C01 | Sunny | Java  | 
    10. | S001 | C02 | Sunny | Blink | 
    11. | S002 | C03 | Tom   | Spark | 
    12. | S002 | C01 | Tom   | Java  | 
    13. | S002 | C02 | Tom   | Blink | 
    14. | S003 | C02 | Kevin | Blink | 
    15. | S003 | C03 | Kevin | Spark | 
    16. | S003 | C01 | Kevin | Java  | 
    17. +------+-----+-------+-------+ 
    18. 9 rows in set (0.00 sec) 
  • 第二步 将交错联接的功效与score表举办左外联接,如下:
    1. mysql> SELECT 
    2.     ->   stu.no, c.no, stu.name, c.name, 
    3.     ->    CASE 
    4.     ->     WHEN s.score IS NULL THEN 0 
    5.     ->     ELSE s.score 
    6.     ->   END AS score 
    7.     -> FROM student stu JOIN course c  -- 迪卡尔积 
    8.     -> LEFT JOIN score s ON sstu.no = s.s_no and c.no = s.c_no -- LEFT OUTER JOIN 
    9.     -> ORDER BY stu.no; -- 排序只是为了各人悦目一点:) 
    10. +------+-----+-------+-------+-------+ 
    11. | no   | no  | name  | name  | score | 
    12. +------+-----+-------+-------+-------+ 
    13. | S001 | C03 | Sunny | Spark |    76 | 
    14. | S001 | C01 | Sunny | Java  |    80 | 
    15. | S001 | C02 | Sunny | Blink |    98 | 
    16. | S002 | C02 | Tom   | Blink |     0 | -- TOM 固然没有介入测验,可是如故看到他的信息 
    17. | S002 | C03 | Tom   | Spark |     0 | 
    18. | S002 | C01 | Tom   | Java  |     0 | 
    19. | S003 | C02 | Kevin | Blink |    88 | 
    20. | S003 | C03 | Kevin | Spark |    68 | 
    21. | S003 | C01 | Kevin | Java  |    78 | 
    22. +------+-----+-------+-------+-------+ 
    23. 9 rows in set (0.00 sec) 

颠末CROSS JOIN帮我们将Tom的信息也查询出来了!(TOM 固然没有介入测验,可是如故看到他的信息)

2. INNER JOIN

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读