数据库中的四大join 笛卡尔乘积(以MySQL为例)
生活随笔
收集整理的這篇文章主要介紹了
数据库中的四大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圖表示如下:
- 對學生表和班級表進行左連接,結果如下:
個人心得:
-
左連接對應的SQL語句如下:
select * from stu left join class on stu.class_id=class.id;
2.4 右連接
- Venn圖表示如下:
- 對學生和班級表進行右連接,結果如下:
個人心得:
-
右連接的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为例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仿Bilibili iOS客户端
- 下一篇: php 查询mysql 乱码,如何做ph