1. 程式人生 > >MySql中join基礎

MySql中join基礎

人在 對應關系 是個 技術分享 hit jpg mapr width 性別

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