MySql中join基础

Posted huabingood

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql中join基础相关的知识,希望对你有一定的参考价值。

mysql中,使用的最多就是join。理解他之后能对我们的业务代码有更深的概念。当然这里只是一个简单的入门,也只是个人理解,如有不正确的地方,也请见谅。

   

了解顺序

  1. 各种join的概念
  2. 对应关系
  3. (Hive中)join的原理

   

.各种join的概念

  1. join的基本概念
    1. join实际上就是数学中的求交集。当我们说集合A={1,2,3,4,5},集合B={2,3},两个集合的交集时,实际上是在求两个集合的共同元素,也就是集合A的元素=集合B的 元素的个数。
    2. 放到现实世界中,集合A和集合B就不再是一维的,而是多维的。假设有两个人:

姓名

性别

年龄

籍贯

工作

小红

18

上海

UI设计师

小绿

18

北京

UI设计师

当我们在求这两个人的交集时,我们会说:小红和小绿在性别互斥,但是两人在年龄上却存在交集,两人在籍贯上互斥,但是在工作上却存在交集。

  1. 在数据库中,当我们把现实世界世界的关系抽象出来。每个实体,比如说人类,就成了一张表,每个具体的人,比如小红,就成了人类表中的一条数据。。表的join,实际上就是在寻找这写具体的记录之间的关系。
  1. 数据准备
    1. 班级表

class_no

class_name

A

A

B

B

create table class(

        class_no varchar(5) comment \'班级编号\',

        class_name varchar(10) comment \'班级名称\'

) comment \'班级表\';

   

insert into class values(\'A\',\'A班\'),

(\'B\',\'B班\'); 

 

  1. 学生表

student_class

student_name

A

小红

B

小白

C

小黑

A

小绿

create table student(

        student_class varchar(5) comment \'学生所属班级\',

        student_name varchar(10) comment \'学生姓名\'

) comment \'学生表\';

   

insert into student values(\'A\',\'小红\'),

(\'B\',\'小白\'),

(\'C\',\'小黑\'),

(\'A\',\'小绿\'); 

 

  1. cross join
    1. 通常我们在join时不加on条件,就会出现笛卡尔积的情况。通常时左表和右表中的数据逐行进行关联。示意图如下:
    2. 查询结果如下:
      1. 注意:这里是没有on语句的
select class_no,class_name,student_class,student_name from class cross join student; 

 

  1. inner join
    1. 两个表根据制定的条件求并集,比如:寻找每个班级的学生,我们通常会加上条件 on class_no=student_class
    2. 查询结果以及语句
      1. 这里是有on条件
select class_no,class_name,student_class,student_name from class join student on class_no=student_class; 

 

  1. left join
    1. 左连接通常是求补集的。他允许左表为空。即左表中的数据必须全部显示出来,但是右表中有没有我们不管的。
    2. 查询结果及语句
      1. 这时student表是放在第一位的,class表放在了第二位
      2. 使用了left join关键字
      3. 我们会发现没有班级的小黑也显示出来了
select class_no,class_name,student_class,student_name from student left join class on class_no=student_class; 

 

  1. 但是:我们通常使用join是查询补集的。比如查询出没有班级的学生是谁。
    1. 注意:这里多了一个where
select class_no,class_name,student_class,student_name from student left join class on class_no=student_class where class_name is null; 

 

  1. 各种join的示例

   

.关于对应关系

  1. 表关联的对应关系
    1. 通常表关联存在三种对应关系:一对一,多对一,多对多的这三种情况。一对一:不会产生任何情况,就像一个身份证号对应一个人。多对一:这个是最常见的情况,比如一个老师教多个学生,一个班级有多个学生。。多对多:最容易出错的地方。就比如一个学生名称对应两个人,并且分布在不同的班级里。我们在使用join是通常是多对一或一对多的场景,但是我们如果误将多对多的场景理解为多对一,就会产生数据偏差,尤其值得注意。

   

.关于Hive中的join

请参考:https://tech.meituan.com/hive_sql_to_mapreduce.html

以上是关于MySql中join基础的主要内容,如果未能解决你的问题,请参考以下文章

Mysql基础(十二):sql语句执行步骤详解准备工作

spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)(代码片段

《零基础》MySQL 连接的使用(二十)

《零基础》MySQL 连接的使用(二十)

sql sql join片段

Mysql join 算法原理