zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Android · SQLite
    Android · 获取网络图片
    Android · 广告走灯
    Android · 动画
    Android常用资源
    Android · Fragment
    JSP 自动刷新
    JSP 点击量统计
    JSP 页面重定向
    JSP 日期处理
  • 原文地址:https://www.cnblogs.com/yanghuabin/p/9502010.html
Copyright © 2011-2022 走看看