平時大多是執行單表查詢,通常你把索引建好,讓他盡可能走索引,性能都沒問題。但其實也有不少的多表關聯語句,因為有時查找目标數據,不得不借助多表關聯的語法,才能實現你想要但使用多表關聯的時候,你的SQL性能就可能會遇到一些問題。
最基礎的多表關聯查詢
select * from t1,t2
where t1.x1=xxx
and t1.x2=t2.x2
and t2.x3=xxx
若在FROM字句後直接來兩個表名,就是要針對兩個表進行查詢,而且會把兩個表的數據給關聯,假設你未限定多表連接條件,可能會搞出一個笛卡爾積。所以通常都會在多表關聯語句中的WHERE子句裡引入一些關聯條件:where t1.x1=xxx and t1.x2=t2.x2 and t2.x3=xxx
假設:
所以該SQL執行過程可能是:
他可能是先從一個表裡查一波數據:驅動表
再根據這波數據去另外一個表裡查一波數據進行關聯,另外一個表叫:被驅動表
内連接員工表包含id(主鍵)、name(姓名)、department(部門)
産品銷售業績表裡包含id(主鍵)、employee_id(員工id)、産品名稱(product_name)、銷售業績(saled_amount)。
現在要看每個員工對每個産品的銷售業績:
select e.name,e.department,ps.product_name,ps.saled_amount
from employee e,product_saled pa
where e.id=pa.employee_id
此時看到的數據:
執行原理
全表掃描員工表,找出每個員工,然後針對每個員工的id去業績表找 employee_id 跟員工id相等的數據,可能每個員工的id在業績表裡都會找到多條數據,因為他可能有多個産品的銷售業績。
然後把每個員工數據跟他在業績表裡找到的所有業績數據都關聯,比如:
内連接,inner join,要求兩個表裡的數據必須完全能關聯上,才能返回。
假設員工表裡有個人是新員工,入職到現在無銷售業績,此時還是希望能夠查出來該員工的數據,隻不過他的銷售業績那塊可以給個NULL,表示無業績。但若僅使用上述SQL語法,似乎搞不定,因為必須要兩個表能關聯上的數據才查得出來。
此時就需要
外連接outer join,分為:
還有個語法限制,如果你是内連接,那連接條件可以放在where語句,但外連接一般是把連接條件放在ON語句:
SELECT
e.name, e.department, ps.product_name, ps.saled_amount
FROM employee e
LEFT OUTER JOIN product_saled pa
ON e.id=pa.employee_id
一般寫多表關聯,主要就是内連接和外連接。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!