免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
MySQL數(shù)據(jù)庫(kù)技術(shù)(16)
破釜沉舟 http://www.7880.com
MySQL數(shù)據(jù)庫(kù)技術(shù)(16)
文章類別:MySQL  發(fā)表日期:2005-09-27     
閱讀次數(shù): 158
3.6 檢索記錄
除非最終檢索它們并利用它們來(lái)做點(diǎn)事情,否則將記錄放入數(shù)據(jù)庫(kù)沒(méi)什么好處。這就是SELECT 語(yǔ)句的用途,即幫助取出數(shù)據(jù)。SELECT 大概是SQL 語(yǔ)言中最常用的語(yǔ)句,而且怎樣使用它也最為講究;用它來(lái)選擇記錄可能相當(dāng)復(fù)雜,可能會(huì)涉及許多表中列之間的比較。SELECT 語(yǔ)句的語(yǔ)法如下:
除了詞“ S E L E C T”和說(shuō)明希望檢索什么的column_list 部分外,語(yǔ)法中的每樣?xùn)|西都是可選的。有的數(shù)據(jù)庫(kù)還需要FROM 子句。MySQL 有所不同,它允許對(duì)表達(dá)式求值而不引用任何表:
在第1章中,我們對(duì)SELECT 語(yǔ)句下了很大的功夫,主要集中介紹了列選擇的列表和WHERE、GROUP BY、ORDER BY、H AVING 以及LIMIT 子句。本章中,我們將主要精力放在SELECT 語(yǔ)句中最可能令人搞不清的方面,即連接( j o i n)上。我們將介紹MySQL 支持的連接類型、它們的含義、怎樣指定它們等。這樣做將有助于更有效地使用M y S Q L,因?yàn)樵谠S多情況下,解決怎樣編寫查詢的關(guān)鍵是確定怎樣將表恰當(dāng)?shù)剡B接在一起。還應(yīng)該參閱一下本章后面3 . 8節(jié)“解決方案隨筆”。在那一節(jié)中將會(huì)找到解決幾個(gè)SQL 問(wèn)題的方案,它們多數(shù)
都涉及SELECT 語(yǔ)句這樣或那樣的功能。
使用SELECT 的一個(gè)問(wèn)題是,在第一次遇到一種新的問(wèn)題時(shí),并不總是能夠知道怎樣編寫SELECT 查詢來(lái)解決它。但在解決以后,再遇到類似的問(wèn)題時(shí),可利用其中的經(jīng)驗(yàn)。SELECT 大概是過(guò)去的經(jīng)驗(yàn)在能夠有效地使用中起很大作用的語(yǔ)句,這是因?yàn)槭褂盟姆椒ㄌ嗟脑省?div style="height:15px;">
在有了一定的經(jīng)驗(yàn)后,可將這些經(jīng)驗(yàn)用于新問(wèn)題,您會(huì)發(fā)現(xiàn)自己思考問(wèn)題類似于,“噢,是的,它就是一個(gè)LEFT JOIN 問(wèn)題。”或者,“啊哈,這就是一個(gè)受各對(duì)索引列制約的三路線連接。”(指出這一點(diǎn),實(shí)際上我也感到有點(diǎn)不愿意。聽到經(jīng)驗(yàn)有幫助,您可能受到一定的鼓舞。另外,考慮到您最終能那樣思考問(wèn)題也會(huì)令自己有點(diǎn)驚訝。)下幾節(jié)中介紹怎樣利用MySQL 支持的連接操作的格式,多數(shù)例子使用了下面的兩個(gè)表。它們很小,很簡(jiǎn)單,足以很清楚地看出每種連接的效果。
3.6.1 平凡連接
最簡(jiǎn)單的連接是平凡連接( trivial join),這種連接中只指定一個(gè)表。在此情況下,行從指定的表中選擇。如:
有的作者根本就不考慮這種SELECT 連接的形式,僅對(duì)從兩個(gè)或多個(gè)表中檢索記錄的SELECT 語(yǔ)句使用“連接”這個(gè)術(shù)語(yǔ)。本人認(rèn)為那只是看法不同而已。
3.6.2 全連接
如果指定多個(gè)表,將各個(gè)表名用逗號(hào)分隔,就指定了全連接。例如,如果連接兩個(gè)表,來(lái)自第一個(gè)表中的每行與第二個(gè)表中每行進(jìn)行組合:
全連接也稱為叉連接,因?yàn)槊總€(gè)表的每行都與其他表中的每行交叉以產(chǎn)生所有可能的組合。這也就是所謂的笛卡兒積。這樣連接表潛在地產(chǎn)生數(shù)量非常大的行,因?yàn)榭赡艿玫降男袛?shù)為每個(gè)表中行數(shù)之積。三個(gè)分別含有1 0 0、2 0 0、3 0 0行的表的全連接將產(chǎn)生1 0 0×2 0 0×3 0 0= 6百萬(wàn)行。即使各表很小,所得到的行數(shù)也會(huì)很大。在這樣的情形下,通常要使用W H E R E
子句來(lái)將結(jié)果集減少為易于管理的大小。
如果在WHERE 子句中增加一個(gè)條件使各表在某些列上進(jìn)行匹配,此連接就是所謂的等同連接(e q u i - j o i n),因?yàn)橹贿x擇那些在指定列中具有相等的值的行。如:
J O I N、CROSS JOIN 和INNER JOIN 連接類型都與“,”連接操作符意義相同。STRAIGHT_JOIN 與全連接類似,但各表按FROM 子句中指定的次序進(jìn)行連接。一般情況下,在全連接中MySQL 優(yōu)化程序自身完全不考慮安排各表的順序,以便使記錄的檢索更快。在有的場(chǎng)合,優(yōu)化程序?qū)⒆鞒龇莾?yōu)化的選擇,這樣將忽略STRAIGHT_JOIN 關(guān)鍵字。在SELECT 語(yǔ)句中,可在兩個(gè)位置給出S T R A I G H T _ J O I N。一個(gè)位置是在SELECT 關(guān)鍵字與選擇列表之間,將其放在這里對(duì)語(yǔ)句中所有全連接具有整體作用。另一個(gè)在FROM 子句中。下面兩條語(yǔ)句是等價(jià)的:
限定列引用
SELECT 語(yǔ)句中列的引用必須對(duì)FROM 子句中指定的每個(gè)表是無(wú)歧義的。如果FROM 子句中僅指定了一個(gè)表,則無(wú)歧義存在,因?yàn)樗辛斜仨毷窃摫淼牧?。如果指定了多個(gè)表,只出現(xiàn)在一個(gè)表中的列名也是無(wú)歧義的。但是,如果某個(gè)列名出現(xiàn)在多個(gè)表中,該列的引用必須用表名來(lái)限定,用tbl_name.col_name 語(yǔ)法來(lái)表明所指的是哪個(gè)表。如果表my_tbl1 含有列a 和b,表my_tbl2 含有列b 和c,則列a 和c 的引用是無(wú)歧義的,但b 的引用必須限定為my_tbl1.b 或m y _ t b l 2 . b,如:
有時(shí),表名限定符還不能解決列的引用問(wèn)題。例如,如果在一個(gè)查詢中多次使用一個(gè)表,用表名限定列名沒(méi)有什么用處。在此情況下,為表達(dá)您的想法可使用別名。給表指派一個(gè)別名,利用這個(gè)別名來(lái)引用列,其語(yǔ)法為: alias _ name.col _ name。下面的查詢將表與
自身進(jìn)行連接,給表指派了一個(gè)別名,以便應(yīng)付引用列時(shí)有歧義的情況:
3.6.3 左連接
等價(jià)連接只給出兩個(gè)表匹配的行。左連接也給出匹配行,但它還顯示左邊表中有的但在右邊表中無(wú)匹配的行。對(duì)于這樣的行,從右邊表中選擇的列都顯示為N U L L。這樣,每一行都從左邊表中選出。如果右邊表中有一個(gè)匹配行,則該行被選中。如果不匹配,行仍然被選中,但它是一個(gè)“假”行,其中所有列被設(shè)置為N U L L。換句話說(shuō),LEFT JOIN 強(qiáng)制結(jié)果集包含對(duì)應(yīng)左邊表中每一行的行,而不管左邊表中的行在右邊表中是否有匹配的行。匹配是根據(jù)ON 或USING( ) 子句中給出的列進(jìn)行的。不管所連接的列是否具有相同的名稱,都可使用ON。如:
USING( ) 子句類似于O N,但連接列的名稱必須在每個(gè)表中是相同的。下面的查詢將my_tbl1.b 連接到m y _ t b l 2 . b:
在希望只查找出現(xiàn)在左邊表而不出現(xiàn)在右邊表中的行時(shí), LEFT JOIN 極為有用??赏ㄟ^(guò)增加一條查詢右邊表中具有NULL 值的列的WHERE 子句來(lái)完成這項(xiàng)工作。
一般不用擔(dān)心選擇為NULL 的列,因?yàn)闆](méi)有什么意思。真正要關(guān)心的是左邊表中不匹配的列,如:
利用LEFT JOIN 時(shí)有一件事情需要提防,如果所連接的列未定義為NOT NULL,將會(huì)在結(jié)果中得出一些無(wú)關(guān)的行。
LEFT JOIN 有幾個(gè)同義詞和變種。LEFT OUTER JOIN 為L(zhǎng)EFT JOIN 的一個(gè)同義詞。
LEFT JOIN 還有一個(gè)為MySQL 所接受的ODBC 表示如下(“o j”意為“outer join”):
N ATURAL LEFT JOIN 類似于LEFT JOIN;它執(zhí)行一個(gè)LEFT JOIN,匹配左邊表和右邊表中具有相同名稱的所有列。
有的數(shù)據(jù)庫(kù)還有,RIGHT JOIN,但MySQL 迄今還沒(méi)有。
破釜沉舟 http://www.7880.com
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
一千行MySQL學(xué)習(xí)筆記
MySQL JOIN查詢
一條SQL語(yǔ)句的千回百轉(zhuǎn)
你們要的多表查詢優(yōu)化來(lái)啦!請(qǐng)查收
MySQL優(yōu)化(三) MySQL 卓越資源
數(shù)據(jù)庫(kù)中的左連接(left join)和右連接(right join)區(qū)別
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服