MySQL之鏈結查詢的多表查詢語句

2021-10-09 00:19:03 字數 2780 閱讀 2937

inner join

插入一條示例資料

insert into teacher (id,name) values (『3』, 『孫老師』);

1select *

from teacher tea

inner join student stu on tea.id = stu.teacher_id;

2select *

from student stu

inner join teacher tea on tea.id = stu.teacher_id;

總結

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。

在使用 join 連線查詢 時,on和where條件的區別如下:

1、on條件是在生成臨時表時使用的條件,需要和鏈結查詢一起使用。

2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

鏈結查詢,會發生笛卡爾乘積,但是不是完全的笛卡爾乘積,在生成檢視的時候,會進行匹配,不符合條件的就不要了

結果資料是以左表資料為準,先生成左表資料,再生成右表資料

使用內連線的話,會以左邊表為基準(student),生成新檢視的時候,先生成左邊表中的資料,然後再去匹配右邊表中是否有符合條件的,沒有的話,就不生成這一行

同時左表中有的,右表中沒有的資料,都不會生成

右表中有的,左表中沒有的也一樣不會生成,所以 左表和右表就算換了位置,資料行數不會變多

但是會丟失資料,不符合 條件的資料不會查詢出來,所以 剛新增的 孫老師就不會查詢出來的,就算是teacher表在左邊,也一樣不會查詢出來孫老師,並且學生小紅也沒有被查詢處理

因為學生表中 teacher_id列 沒有儲存孫老師的id,並且小紅也沒有儲存老師的id,所以都不要

多表查詢是有左右表之分的,一般左表是主表,以左邊為主

inner join 也可以直接寫join 不寫inner

** left join**

left join on : 左連線,又稱左外鏈結,是 left outer join 的簡寫 ,使用left join 和 使用 left outer join 是一樣的效果

1 查詢結果,顯示小紅,但是不顯示孫老師

select * from student s

left join teacher t on s.teacher_id = t.id;

2 查詢結果顯示孫老師,但是不顯示小紅

select * from teacher t

left join student s on s.teacher_id = t.id;

總結

以左邊的表為基準,左表中資料都有,右表中不符合條件的就沒有,就在指定列上用null代替

生成檢視的時候,也是先生成左表的資料

right join

right join on : 右鏈結,又稱右外連線,是 right outer join 的簡寫,使用right join 和 使用 right outer join 是一樣的

1 查詢結果,顯示孫老師,但是不顯示小紅

select * from student s

right join teacher t on s.teacher_id = t.id;

2 查詢結果顯示小紅,但是不顯示孫老師

select * from teacher t

right join student s on s.teacher_id = t.id;

總結

以右表為基準,右表中資料都有,左表中不符合條件的就沒有,就在指定列上用null代替

但是檢視生成的時候,還是會先生成左表資料

以上可以看出,student right join teacher 顯示的內容是與teacher left join student相同的。而teacher right join student 顯示的內容又與student left join student相同。

所以,我們工作中,right join基本不用。用的最多的是inner join 與left join。

ps:外來鍵與表連線沒有任何關係,不要混淆。

外來鍵是為了保證你不能隨便刪除/插入/修改資料,是資料完整性的一種約束機制。

而表連線是因為一張表的字段無法滿足業務需求(你想查的字段來自於2張甚至多張表)

乙個是為了增刪改,乙個是為了查,它倆之間沒有聯絡。

模擬oracle中的full join

上面幾個鏈結查詢中

inner是兩個表都符合條件的資料

left join 是 左表都有,右表符合條件才有

right join 是 右表都有,左表符合條件才有

那麼能不能讓兩個表,別管符合不符合,都有呢?

full join / full outer join ,但是mysql這裡給取消了,比如oracle就有

模擬一下 full join 的功能

使用 union 獲取並集

select * from student s

left join teacher t on s.teacher_id = t.id

union

select * from student s

right join teacher t on s.teacher_id = t.i

mysql 多表鏈結查詢

我要做乙個按銷售數量排序的查詢sql操作,現在有如下3個表,要求獲取d product表中的所有資料 包括沒有銷售記錄的資料 以及d item表中的銷售數量 product num欄位的值 查詢條件是d category表的id,按d item表中的銷售數量 product num欄位的值 請問這樣...

MySQL 多表鏈結查詢

多表鏈結查詢時從多個表中獲取資料 table reference inner join outer join table reference on conditional expr 根據連線條件從多個表中查詢選擇資料,顯示這些表中與連線條件匹配的資料行,組合成新紀錄 就是匹配兩表相同的行 交集 內連...

mysql多表查詢方式 MySQL多表查詢方式問題

你的 sql 沒有用到任何索引,對 a b 兩個表都是全表掃瞄,在資料量小的時候是沒有問題的,但是如果資料量超過 100 萬,效能問題就會突顯出來。這裡不清楚你的 created at 欄位是什麼型別,不過從你的 date format created at,y m d 看來,應該是 datetim...