日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库中的四大join 笛卡尔乘积(以MySQL为例)

發布時間:2024/3/26 数据库 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库中的四大join 笛卡尔乘积(以MySQL为例) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 緒言

  • 不管是面試還是實際工作中,總是會聽到你對兩個表做連接查詢試試呢,你知道數據庫有哪些連接嗎,諸如此類的對話

  • 數據庫中,表與表之間大部分都是存在關系的,比如經典的學生表和班級表、班級表與學校表等。

  • 這些表之間可以通過關聯屬性連接(join)在一起,提供了數據庫多表查詢的能力。

  • 數據庫中的連接主要分為兩大類:內連接和外連接,其中外連接包括左外連接、右外連接、全外連接。

  • 四大連接簡稱:內連接、左連接、右連接、全連接,它們的定義如下:

    內連接(innner join,或稱等值連接):返回兩張表中匹配的記錄 左連接(left join):返回兩張表匹配的記錄,以及左表中多余的記錄 右連接(right join):返回兩張表匹配的記錄,以及右表中多余的記錄 全連接(full join):返回兩張表匹配的記錄,以及左右兩表中各自多余的記錄

2. 圖解四大連接

2.1 基礎準備

  • 為了更好的解釋四大連接,需要在MySQL數據庫中的創建兩張表。

  • 建表語句如下:

    create table IF NOT EXISTS stu ( id bigint unsigned AUTO_INCREMENT comment '學號', name varchar(50) not null comment '姓名', age int unsigned not null comment '年齡', class_id bigint unsigned not null comment '班級號', PRIMARY KEY (id) )ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '學生表';create table IF NOT EXISTS class( id bigint unsigned comment '班級號', master varchar(50) not null comment '班主任', number int unsigned not null comment '學生人數', type varchar(20) not null comment '班級類型:文科、理科', PRIMARY KEY (id) )ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '班級表';
  • 使用insert into插入數據后,兩張表中的數據如下:

2.2 內連接

  • 內連接,又叫等值連接,顧名思義只有兩張表中匹配的數據才會發生連接
  • Venn圖表示如下:
  • 對于學生和班級表,通過班級編號進行關聯,兩表中匹配的記錄應該是:

個人心得:

  • 遍歷左表數據,用左表數據的聯屬性去匹配右表的每一條數據。
  • 如果關聯屬性相同,則匹配到一條數據。
    • 內連接的MySQL語句:

      select * from stu inner join class on stu.class_id=class.id; select * from stu join class on stu.class_id=class.id; -- MySQL的join默認為inner jion /* 對應的where語句 */ select * from stu,class where stu.class_id=class.id;

    2.3 左連接

    • Venn圖表示如下:
    • 對學生表和班級表進行左連接,結果如下:

    個人心得:

  • 遍歷左表數據,用左表數據的關聯屬性去匹配右表中的每一條數據。
  • 如果關聯屬性相同,則匹配到一條數據;
  • 如果左表數據沒有匹配到右表的任何一條數據,則將右表數據的所有字段置為NULL,仍記作匹配到一條數據。
    • 左連接對應的SQL語句如下:

      select * from stu left join class on stu.class_id=class.id;

    2.4 右連接

    • Venn圖表示如下:
    • 對學生和班級表進行右連接,結果如下:

      個人心得:
  • 遍歷右表數據,用右表數據的關聯屬性去匹配左表中的每一條數據。
  • 如果關聯屬性相同,則匹配到一條數據;
  • 如果右表數據沒有匹配到左表的任何一條數據,則將左表數據的所有字段置為NULL,仍記作匹配到一條數據。
    • 右連接的SQL語句:

      select * from stu right join class on stu.class_id=class.id;

    2.5 全連接

    • Venn圖表示如下:
    • 對學生和班級表進行全連接,結果如下:

      個人心得:
  • 先對左右表做左連接,再對左右表做右連接
  • 兩次連接的結果,去重后就是全連接的結果
    • MySQL目前不支持全連接,但可以對左連接、右連接的結果進行union操作實現。

      select * from stu left join class on stu.class_id=class.id union select * from stu right join class on stu.class_id=class.id;

    參考鏈接:

    • MySQL 連接的使用
    • 數據庫表連接的簡單解釋
    • mysql內連接、左連接,右連接,(全連接/外連接)之間的區別

    3. 笛卡爾乘積

    • 笛卡爾乘積其實是數學領域的概念,就是對兩個集合做乘法
    • 數據庫中也引入笛卡爾乘積的概念,笛卡爾乘積對兩表關聯時,不要求指定關聯屬性。
    • 如果左表有m行,右表有n行,則兩表的笛卡爾乘積將會有m?nm*nm?n
    • 對學生和班級表做笛卡爾乘積的結果如下:

    個人心得: 遍歷左表的每一行數據,用左表每一行數據分別于與右表的每一行數據做關聯

    • 笛卡爾乘積的SQL實現:

      select * from stu cross join class;select * from stu,class;
    • 可以看出,笛卡爾乘積的運算量超級大,一般不會使用笛卡爾乘積做表的關聯查詢

    總結

    以上是生活随笔為你收集整理的数据库中的四大join 笛卡尔乘积(以MySQL为例)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。