MySql中join基礎
在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
MySql中join基礎