码迷,mamicode.com
首页 > 数据库 > 详细

MySql中join基础

时间:2018-08-19 18:27:36      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:strong   一个人   font   tab   create   互斥   info   工作   身份证   

在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基础

标签:strong   一个人   font   tab   create   互斥   info   工作   身份证   

原文地址:https://www.cnblogs.com/yanghuabin/p/9502010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!