在MySQL中,使用的最多就是join。理解他之后能对我们的业务代码有更深的概念。当然这里只是一个简单的入门,也只是个人理解,如有不正确的地方,也请见谅。
了解顺序
- 各种join的概念
- 对应关系
- (Hive中)join的原理
一.各种join的概念
- join的基本概念
- join实际上就是数学中的求交集。当我们说集合A={1,2,3,4,5},集合B={2,3},两个集合的交集时,实际上是在求两个集合的共同元素,也就是集合A的元素=集合B的 元素的个数。
- 放到现实世界中,集合A和集合B就不再是一维的,而是多维的。假设有两个人:
姓名 |
性别 |
年龄 |
籍贯 |
工作 |
小红 |
女 |
18 |
上海 |
UI设计师 |
小绿 |
男 |
18 |
北京 |
UI设计师 |
当我们在求这两个人的交集时,我们会说:小红和小绿在性别互斥,但是两人在年龄上却存在交集,两人在籍贯上互斥,但是在工作上却存在交集。
- 在数据库中,当我们把现实世界世界的关系抽象出来。每个实体,比如说人类,就成了一张表,每个具体的人,比如小红,就成了人类表中的一条数据。。表的join,实际上就是在寻找这写具体的记录之间的关系。
- 数据准备
- 班级表
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班‘); |
- 学生表
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‘,‘小绿‘); |
- cross join
- 通常我们在join时不加on条件,就会出现笛卡尔积的情况。通常时左表和右表中的数据逐行进行关联。示意图如下:
- 查询结果如下:
- 注意:这里是没有on语句的
select class_no,class_name,student_class,student_name from class cross join student; |
- inner join
- 两个表根据制定的条件求并集,比如:寻找每个班级的学生,我们通常会加上条件 on class_no=student_class
- 查询结果以及语句
- 这里是有on条件
select class_no,class_name,student_class,student_name from class join student on class_no=student_class; |
- left join
- 左连接通常是求补集的。他允许左表为空。即左表中的数据必须全部显示出来,但是右表中有没有我们不管的。
- 查询结果及语句
- 这时student表是放在第一位的,class表放在了第二位
- 使用了left join关键字
- 我们会发现没有班级的小黑也显示出来了
select class_no,class_name,student_class,student_name from student left join class on class_no=student_class; |
- 但是:我们通常使用join是查询补集的。比如查询出没有班级的学生是谁。
- 注意:这里多了一个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; |
- 各种join的示例
二.关于对应关系
- 表关联的对应关系
- 通常表关联存在三种对应关系:一对一,多对一,多对多的这三种情况。一对一:不会产生任何情况,就像一个身份证号对应一个人。多对一:这个是最常见的情况,比如一个老师教多个学生,一个班级有多个学生。。多对多:最容易出错的地方。就比如一个学生名称对应两个人,并且分布在不同的班级里。我们在使用join是通常是多对一或一对多的场景,但是我们如果误将多对多的场景理解为多对一,就会产生数据偏差,尤其值得注意。
三.关于Hive中的join
请参考:https://tech.meituan.com/hive_sql_to_mapreduce.html
原文地址:https://www.cnblogs.com/yanghuabin/p/9502010.html
时间: 2024-11-07 04:21:55