left join on多表关联_资深DBA整理MySQL基础知识三:迅速理解MySQL的关联和子查询...
接上篇:
上篇主要介紹select的基本的構成,和一些簡單常用條件語句。這篇著重說幾種常用的多表關聯關系。
前面入門只說了一種表的簡單查詢。但在實際工作幾乎不會出現單表操作的情況,大多數還是多表的連接來實現一些需要問題。那么多有那些連接關系呢?
基本概念:
多表連接就是將二個或二個以上的表,“連接起來”當做一個數據源,并 從中去取得所須要的數據:
分類:1,笛卡爾基連接。2,內連接,3,外連接
第一:笛卡爾基連接
它沒有條件, 只是按連接的基本概念,將所有數據行都連接起來的結果。
笛卡爾積連接
如上圖所示:table1中的每一行都會把table2中的所有的行都關聯一次,所以會導致很多無用的數據。
對于表1(n1個字段,n2行),表2,(m1個字段,m2行),他們交叉連接的結 果是: 有n1+m1個列; 有n2*m2個行;
形式有: select * from 表1, 表2;
select * from 表1 join 表2;
select * from 表1 cross join 表2;
第二:內連接:inner join
形式:select * from 表1 [inner] join 表2 on 連接條件
先來研究沒有條件的“內連接”(其實就是交叉連接)的結果
這是未連接前的兩張表product 和product_type,紅色框出的是某些條件相同的數據,下面看運行結果。
select * from product inner join product type on product.protype_id = product_type.protype_id;
inner join 是連接方式表示內連接,on 表示 連接條件分別是product表的protype_id 和product_type表的protype_id進行關聯,運行結果如下。
或者是
第三:外連接
外連接和分為左外連接和右外連接
形式一: 表 1(左表) left [outer] join 表2(右表) on 連接條件
含義: 其實就是將兩個表的內容連接結果,再加上左邊表的不符合連接所設定的條件的那些數據結果
可見,左連接的結果,左邊表的數據,一定都會“全部取出”
形式二: 表 1(左表) right [outer] join 表2(右表) on 連接條件
和左連接一樣,右連接取的全是右表的數據。這里就不一一列舉了。
注意:左右連接可互換 A left join B 等價于B right join A。
子查詢
接下來就要說說查詢的方法了
基本含義: 簡單的說一個select 語句就是一個查詢語句 Select 字段或表達式 from 數據源 where 條件判斷。如下
可見,所謂子查詢,就是在一個查詢語句(select語句) 中內部,某些位置,又出現了”查詢語句”
子查詢分類:
表子查詢: 一個子查詢返回的結果理論上是“多行多列”的時候。此時可以當做一個 “表”來使用,通常是放在from后面。
行子查詢 : 一個子查詢返回的結果理論上是“一行多列”的時候。此時可以當做一個 “行”來使用,通常放在“行比較語法”中; 行比較語法類似這樣:where row(字段1,字段2) = (select 行子查詢)
列子查詢 : 一個子查詢返回的結果理論上是“多行一列”的時候。此時可以當做“多 個值”使用,類似這種:(5, 17, 8, 22)。
標量子查詢: 一個子查詢返回的結果理論上是“一行一列”的時候。此時可以當做“一 個單個值”使用,類似這種:select 5 as c1; 或select ...where a = 17,或select ... where b >8;即上述“單個數據值”,可以用標量子查 詢來代替;
作為主查詢的結果數據: select c1,(select f1 from tab2) as f11 from tab1; #這里子查詢應 該只有一個數據(一行一列,標量子查詢) 作為主查詢的條件數據: select c1 from tab1 where c1 in (select f1 from tab2); #這里子查 詢可以是多個數據(多行一列,列子查詢) 作為主查詢的來源數據:select c1 from (select f1 as c1, f2 from tab2) as t2; #這里子查詢可以是任意查詢結果(表子查詢)。
1.比較運算符中的子查詢
形式: 操作數 比較運算符 (標量子查詢); 說明: 操作數,其實就是比較運算符的2個數據之一而已,通常就是一個字段名; select .... from XXX where id > 5;
舉例: 找出最高價的商品;
select * from product where price = (select max(price) from product );
2.使用in的子查詢( 列子查詢 )
以前用的in的用法: XX in (值1,值2,值3,....); 則in子查詢為: XX in (列子查詢) 舉例: 找出所有類別名稱中帶“電”這個字的所有商品;
分析:[1] select protype_id,protype_name from product_type where protype_name like '%電%'
[2] select pro_name,price from product where protype_id in(1,3)
3.使用any的子查詢(列子查詢):
形式: 操作數 比較運算符 any(列子查詢) 含義: 當某個操作數(字段),對于對于該列子查詢的其中任意一個值,滿足該比較運算符,則就算是滿足了條件; 即:只要有一個值滿足,就算是滿足;
進一步解釋:
假設表1(tab1)有數據為:
id, name 1 ‘aa’, 5 ‘bb’ 11 ‘cc’
假設表2(tab2)有數據為:
f1 f2 3 ‘x1’ 6 ‘x2’ 12 ‘x3’
則: select * from tab1 where id > any (select f1 from tab2);
則可以取出的結果數據有: 5 ‘bb’ 11 ‘cc’
4.使用all的子查詢(列子查詢):
形式: 操作數 比較運算符 all (列子查詢);
含義: 當某個操作數(字段) 對于該列子查詢的所有數據值,都滿足該比較運算符,才算滿足了條件; 即:要求全部都滿足,才算是滿足;
進一步解釋:
假設表1(tab1)有數據為:
id, name 1 ‘aa’, 5 ‘bb’ 11 ‘cc’
假設表2(tab2)有數據為:
f1 f2 3 ‘x1’ 6 ‘x2’ 12 ‘x3’
則: select * from tab2 where f1 > all ( select id from tab1 );
結果是: 12 ‘x3’
使用exists的查詢
形式: where exists( 子查詢 ) 含義: 該子查詢如果“有數據”,則exists的結果是true,否則就是false
說明: 因為,exists子查詢的該含義,造成主查詢往往出現這樣的情形:要么全都取出,要么都不取出。 如果局限于這個含義(使用情形),其基本就失去了它的現實使用意義。 但: 實際應用中,該子查詢,往往都不是獨立的子查詢,而是會需要跟“主查詢”的數據源(表),建立某種關系——通常就是連接 關系。建立的方式是“隱式的”,即沒有在代碼上體現關系,但卻在內部有其連接的“實質”。 此隱式連接方式,通常就體現在子查詢中的where條件語句中,使用了主查詢表中的數據(字段);
舉例: 查詢商品表中其類別名稱中帶“電”這個字的所有商品;
運行結果如下:
下一篇介紹SQL語言中的運行順序,未完待續
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的left join on多表关联_资深DBA整理MySQL基础知识三:迅速理解MySQL的关联和子查询...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openpyxl 插入列_[Python
- 下一篇: build文件_把编译时间加入到目标文件