日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

left join on多表关联_资深DBA整理MySQL基础知识三:迅速理解MySQL的关联和子查询...

發(fā)布時間:2024/1/23 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 left join on多表关联_资深DBA整理MySQL基础知识三:迅速理解MySQL的关联和子查询... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

接上篇:

上篇主要介紹select的基本的構(gòu)成,和一些簡單常用條件語句。這篇著重說幾種常用的多表關(guān)聯(lián)關(guān)系。

前面入門只說了一種表的簡單查詢。但在實際工作幾乎不會出現(xiàn)單表操作的情況,大多數(shù)還是多表的連接來實現(xiàn)一些需要問題。那么多有那些連接關(guān)系呢?

基本概念:

多表連接就是將二個或二個以上的表,“連接起來”當(dāng)做一個數(shù)據(jù)源,并 從中去取得所須要的數(shù)據(jù):

分類:1,笛卡爾基連接。2,內(nèi)連接,3,外連接

第一:笛卡爾基連接

它沒有條件, 只是按連接的基本概念,將所有數(shù)據(jù)行都連接起來的結(jié)果。

笛卡爾積連接

如上圖所示:table1中的每一行都會把table2中的所有的行都關(guān)聯(lián)一次,所以會導(dǎo)致很多無用的數(shù)據(jù)。

對于表1(n1個字段,n2行),表2,(m1個字段,m2行),他們交叉連接的結(jié) 果是: 有n1+m1個列; 有n2*m2個行;

形式有: select * from 表1, 表2;

select * from 表1 join 表2;

select * from 表1 cross join 表2;

第二:內(nèi)連接:inner join

形式:select * from 表1 [inner] join 表2 on 連接條件

先來研究沒有條件的“內(nèi)連接”(其實就是交叉連接)的結(jié)果

這是未連接前的兩張表product 和product_type,紅色框出的是某些條件相同的數(shù)據(jù),下面看運行結(jié)果。

select * from product inner join product type on product.protype_id = product_type.protype_id;

inner join 是連接方式表示內(nèi)連接,on 表示 連接條件分別是product表的protype_id 和product_type表的protype_id進(jìn)行關(guān)聯(lián),運行結(jié)果如下。

或者是

第三:外連接

外連接和分為左外連接和右外連接

形式一: 表 1(左表) left [outer] join 表2(右表) on 連接條件

含義: 其實就是將兩個表的內(nèi)容連接結(jié)果,再加上左邊表的不符合連接所設(shè)定的條件的那些數(shù)據(jù)結(jié)果

可見,左連接的結(jié)果,左邊表的數(shù)據(jù),一定都會“全部取出”

形式二: 表 1(左表) right [outer] join 表2(右表) on 連接條件

和左連接一樣,右連接取的全是右表的數(shù)據(jù)。這里就不一一列舉了。

注意:左右連接可互換 A left join B 等價于B right join A。

子查詢

接下來就要說說查詢的方法了

基本含義: 簡單的說一個select 語句就是一個查詢語句 Select 字段或表達(dá)式 from 數(shù)據(jù)源 where 條件判斷。如下

可見,所謂子查詢,就是在一個查詢語句(select語句) 中內(nèi)部,某些位置,又出現(xiàn)了”查詢語句”

子查詢分類:

表子查詢: 一個子查詢返回的結(jié)果理論上是“多行多列”的時候。此時可以當(dāng)做一個 “表”來使用,通常是放在from后面。

行子查詢 : 一個子查詢返回的結(jié)果理論上是“一行多列”的時候。此時可以當(dāng)做一個 “行”來使用,通常放在“行比較語法”中; 行比較語法類似這樣:where row(字段1,字段2) = (select 行子查詢)

列子查詢 : 一個子查詢返回的結(jié)果理論上是“多行一列”的時候。此時可以當(dāng)做“多 個值”使用,類似這種:(5, 17, 8, 22)。

標(biāo)量子查詢: 一個子查詢返回的結(jié)果理論上是“一行一列”的時候。此時可以當(dāng)做“一 個單個值”使用,類似這種:select 5 as c1; 或select ...where a = 17,或select ... where b >8;即上述“單個數(shù)據(jù)值”,可以用標(biāo)量子查 詢來代替;

作為主查詢的結(jié)果數(shù)據(jù): select c1,(select f1 from tab2) as f11 from tab1; #這里子查詢應(yīng) 該只有一個數(shù)據(jù)(一行一列,標(biāo)量子查詢) 作為主查詢的條件數(shù)據(jù): select c1 from tab1 where c1 in (select f1 from tab2); #這里子查 詢可以是多個數(shù)據(jù)(多行一列,列子查詢) 作為主查詢的來源數(shù)據(jù):select c1 from (select f1 as c1, f2 from tab2) as t2; #這里子查詢可以是任意查詢結(jié)果(表子查詢)。

1.比較運算符中的子查詢

形式: 操作數(shù) 比較運算符 (標(biāo)量子查詢); 說明: 操作數(shù),其實就是比較運算符的2個數(shù)據(jù)之一而已,通常就是一個字段名; 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子查詢?yōu)?#xff1a; 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的子查詢(列子查詢):

形式: 操作數(shù) 比較運算符 any(列子查詢) 含義: 當(dāng)某個操作數(shù)(字段),對于對于該列子查詢的其中任意一個值,滿足該比較運算符,則就算是滿足了條件; 即:只要有一個值滿足,就算是滿足;

進(jìn)一步解釋:

假設(shè)表1(tab1)有數(shù)據(jù)為:

id, name 1 ‘a(chǎn)a’, 5 ‘bb’ 11 ‘cc’

假設(shè)表2(tab2)有數(shù)據(jù)為:

f1 f2 3 ‘x1’ 6 ‘x2’ 12 ‘x3’

則: select * from tab1 where id > any (select f1 from tab2);

則可以取出的結(jié)果數(shù)據(jù)有: 5 ‘bb’ 11 ‘cc’

4.使用all的子查詢(列子查詢):

形式: 操作數(shù) 比較運算符 all (列子查詢);

含義: 當(dāng)某個操作數(shù)(字段) 對于該列子查詢的所有數(shù)據(jù)值,都滿足該比較運算符,才算滿足了條件; 即:要求全部都滿足,才算是滿足;

進(jìn)一步解釋:

假設(shè)表1(tab1)有數(shù)據(jù)為:

id, name 1 ‘a(chǎn)a’, 5 ‘bb’ 11 ‘cc’

假設(shè)表2(tab2)有數(shù)據(jù)為:

f1 f2 3 ‘x1’ 6 ‘x2’ 12 ‘x3’

則: select * from tab2 where f1 > all ( select id from tab1 );

結(jié)果是: 12 ‘x3’

使用exists的查詢

形式: where exists( 子查詢 ) 含義: 該子查詢?nèi)绻坝袛?shù)據(jù)”,則exists的結(jié)果是true,否則就是false

說明: 因為,exists子查詢的該含義,造成主查詢往往出現(xiàn)這樣的情形:要么全都取出,要么都不取出。 如果局限于這個含義(使用情形),其基本就失去了它的現(xiàn)實使用意義。 但: 實際應(yīng)用中,該子查詢,往往都不是獨立的子查詢,而是會需要跟“主查詢”的數(shù)據(jù)源(表),建立某種關(guān)系——通常就是連接 關(guān)系。建立的方式是“隱式的”,即沒有在代碼上體現(xiàn)關(guān)系,但卻在內(nèi)部有其連接的“實質(zhì)”。 此隱式連接方式,通常就體現(xiàn)在子查詢中的where條件語句中,使用了主查詢表中的數(shù)據(jù)(字段);

舉例: 查詢商品表中其類別名稱中帶“電”這個字的所有商品;

運行結(jié)果如下:

下一篇介紹SQL語言中的運行順序,未完待續(xù)

超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的left join on多表关联_资深DBA整理MySQL基础知识三:迅速理解MySQL的关联和子查询...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。