關於使用多表聯查代替LEFT JOIN 的使用方案

2021-10-24 09:57:54 字數 2568 閱讀 4405

還記得,我們在剛剛開始學習mysql的時候,我們的老師或多或少都對我們說。mysql盡量不要去使用多表聯查。

但是,理由呢?我們學習的過程之中,不應該僅僅只是去聽 ,更應該自己思考。

我認為任何事情既然其存在必有其存在的含義。因此,我們不應該連考慮都不進行考慮就進行對其的否定。我們也應該勇敢的進行適當的嘗試。

當然了,這並不是對自己的東西完全的肯定,對他人的完全否定。

這下面的內容,也僅僅只是乙個使用方案罷了

假設我們有兩張表,一張記錄商品資訊,另一張商品型別,二者的關係是根據商品表之中記載的商品型別的主鍵來確定。二者的sql 查詢 語句如下

select shop_id , shop_name , shop_type_id from shop ;

//查詢商品表

select shop_type_id , shop_type_name from shop_type;

//查詢商品型別

// left join 查詢

seleft s.shop_id,s.shop_name,st.shop_type_id,st.shop_type_name from shop s

left

join shop_type st on s.shop_type_id = st.shop_type_id

//多次查詢

select shop_id , shop_name , shop_type_id from shop ;

//之後利用 shop_type_id 來進行查詢

select shop_type_id , shop_type_name from shop_type;

兩種方案各有各的好處,甚至他們的優缺點是相互互補的

1.查詢次數少,查詢資源浪費大

2.查詢次數多,查詢資源浪費少

上面兩種,便是我們平常經常使用的方法。但是,現在倘若我們需要 shop_type_name 這個關係表內的屬性值來進行查詢呢?

那麼首先,第二種的多次查詢方案,就不得不廢棄了,並且其sql語句也被更改為:

seleft s.shop_id,s.shop_name,st.shop_type_id,st.shop_type_name from shop s left

join

(select st.shop_type_id , st.shop_type_name from shop_type st where st.shop_type_name like

'%***x%'

) st

on s.shop_type_id = st.shop_type_id where

(***xx 's的查詢條件'

)and st.shop_type_name like

'%***x%'

如此的方案的確可行,但是執行速率卻並不是十分的樂觀。

當前的環境,十萬條資料,無索引。

雖然我們之前的學習可以知道,索引才是導致問題發生的主要原因。

但是,這樣的結果並不是能讓人忍受的

因此,就是出於這樣的目的,所以我想試一試雙表聯查。

但是施行不久,首先我們會先遇見乙個挫折,s.shop_type_id 擁有空的狀態,便是 s.shop_type_id 等於0 ,當結果等於此時,表示shop 並無型別

但是,雙表聯查的主要概念,便是查詢兩張表之間的交集。因此,當進行雙表聯查的時候,會自動忽略 那些 type_id 為 0的 字段。

因此,為了解決這個方案,我就在 shop_type_id 加上這麼乙個無意義的 id 為0的字段,便可以輕鬆解決這個問題。

這樣,我們的sql 查詢語句便成功誕生了

seleft s.shop_id,s.shop_name,st.shop_type_id,st.shop_type_name from shop s ,shop_type st

where s.shop_type_id = st.shop_type_id and

(s 查詢條件)

結果會比上 left join 快上一些,但卻不知道加上索引,速率是否能讓人接受

當然了,任何東西都是有利有弊,我們現在分析一下二者的問題所在

left join 最大的問題便是需要自己查詢一次,那麼我們不難發現,當 left join 內部的條件越少時,自然而然,查詢的速度就越慢,條件越多,查詢速率就越快。也就是如此。

雙表聯查呢?就很簡單,二者融合建立虛擬表,速度自然而然會快很多,但是我們不難想象所佔記憶體自然而然也會跟多,

它是將兩張資料表進行富裕整合,查詢的數列為 m 的n 次方,因此,如果條件越複製,速度自然而然也越慢,因為需要過的行數自然而然也越多

關於多表的leftJoin

建立表結構如下 create table x.a a1 int,a2 varchar 10 create table x.b b1 int,b2 varchar 10 create table x.c c1 int,c2 varchar 10 insert into x.a values 1 hah...

如何使用LEFT JOIN實現多表查詢

什麼是left join請各位自行了解,廢話不多說,先直接上三張表 組織表 t organization 部門表 t department 使用者表 t user 邏輯是組織下面有部門,部門下面有使用者,組織和部門通過organization id欄位關聯,部門和使用者通過department id...

SQL優化 使用關聯查詢代替子查詢

sql優化 使用關聯查詢代替子查詢 測試例子 子查詢 selecta.select workflowname from workflowbase whereid workflowid workflowname from zping.com a where a.operator 402882ed111...