漁人碼頭

          天行健,君子以自強不息。地勢坤,君子以厚德載物。
          posts - 12, comments - 16, trackbacks - 0, articles - 43
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          二、 聯(lián)合查詢
            
          UNION運算符可以將兩個或兩個以上上SELECT語句的查詢結(jié)果集合合并成一個結(jié)果集合顯示,即執(zhí)行聯(lián)合查詢。UNION的語法格式為:
            select_statement
            
          UNION?[ALL]?selectstatement
            
          [UNION?[ALL]?selectstatement][…n]


          其中selectstatement為待聯(lián)合的SELECT查詢語句。
            
          ALL選項表示將所有行合并到結(jié)果集合中。不指定該項時,被聯(lián)合查詢結(jié)果集合中的重復(fù)行將只保留一行。
            
          聯(lián)合查詢時,查詢結(jié)果的列標(biāo)題為第一個查詢語句的列標(biāo)題。因此,要定義列標(biāo)題必須在第一個查詢語句中定義。要對聯(lián)合查詢結(jié)果排序時,也必須使用第一查詢語句中的列名、列標(biāo)題或者列序號。
            
          在使用UNION 運算符時,應(yīng)保證每個聯(lián)合查詢語句的選擇列表中有相同數(shù)量的表達(dá)式,并且每個查詢選擇表達(dá)式應(yīng)具有相同的數(shù)據(jù)類型,或是可以自動將它們轉(zhuǎn)換為相同的數(shù)據(jù)類型。在自動轉(zhuǎn)換時,對于數(shù)值類型,系統(tǒng)將低精度的數(shù)據(jù)類型轉(zhuǎn)換為高精度的數(shù)據(jù)類型。
            
          在包括多個查詢的UNION語句中,其執(zhí)行順序是自左至右,使用括號可以改變這一執(zhí)行順序。例如:
            
          查詢1 UNION (查詢2 UNION 查詢3)

          三、連接查詢
            
          通過連接運算符可以實現(xiàn)多個表查詢。連接是關(guān)系數(shù)據(jù)庫模型的主要特點,也是它區(qū)別于其它類型數(shù)據(jù)庫管理系統(tǒng)的一個標(biāo)志。
            
          在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,表建立時各數(shù)據(jù)之間的關(guān)系不必確定,常把一個實體的所有信息存放在一個表中。當(dāng)檢索數(shù)據(jù)時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數(shù)據(jù)類型。為不同實體創(chuàng)建新的表,爾后通過連接進行查詢。
            
          連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時有助于將連接操作與WHERE子句中的搜索條件區(qū)分開來。所以,在Transact-SQL中推薦使用這種方法。
            
          SQL-92標(biāo)準(zhǔn)所定義的FROM子句的連接語法格式為:

            FROM?join_table?join_type?join_table
            
          [ON?(join_condition)]


          其中join_table指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一個表操作的連接又稱做自連接。
            
          join_type 指出連接類型,可分為三種:內(nèi)連接、外連接和交叉連接。內(nèi)連接(INNER JOIN)使用比較運算符進行表間某(些)列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)據(jù)行。根據(jù)所使用的比較方式不同,內(nèi)連接又分為等值連接、自然連接和不等連接三種。外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內(nèi)連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數(shù)據(jù)行。
            
          交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數(shù)據(jù)行的笛卡爾積,其結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個表中符合查詢條件的數(shù)據(jù)行數(shù)。
            
          連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構(gòu)成。
            
          無論哪種連接都不能對text、ntext和image數(shù)據(jù)類型列進行直接連接,但可以對這三種列進行間接連接。例如:

            SELECT?p1.pub_id,p2.pub_id,p1.pr_info
            
          FROM?pub_info?AS?p1?INNER?JOIN?pub_info?AS?p2
            
          ON?DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)


          (一)內(nèi)連接
            
          內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行,它使用比較運算符比較被連接列的列值。內(nèi)連接分三種:
            
          1、等值連接:在連接條件中使用等于號(=)運算符比較被連接列的列值,其查詢結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)列。
            
          2、不等連接: 在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
            
          3、自然連接:在連接條件中使用等于(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結(jié)果集合中所包括的列,并刪除連接表中的重復(fù)列。
            
          例,下面使用等值連接列出authors和publishers表中位于同一城市的作者和出版社:

            SELECT?*
            
          FROM?authors?AS?a?INNER?JOIN?publishers?AS?p
            
          ON?a.city=p.city


          又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重復(fù)列(city和state):

            SELECT?a.*,p.pub_id,p.pub_name,p.country
            
          FROM?authors?AS?a?INNER?JOIN?publishers?AS?p
            
          ON?a.city=p.city


          (二)外連接
            
          內(nèi)連接時,返回查詢結(jié)果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行。而采用外連接時,它返回到查詢結(jié)果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數(shù)據(jù)行。如下面使用左外連接將論壇內(nèi)容和作者信息連接起來:

            SELECT?a.*,b.*?FROM?luntan?LEFT?JOIN?usertable?as?b
            
          ON?a.username=b.username


          下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:

            SELECT?a.*,b.*
            
          FROM?city?as?a?FULL?OUTER?JOIN?user?as?b
            
          ON?a.username=b.username


          (三)交叉連接
            
          交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數(shù)據(jù)行的笛卡爾積,返回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個表中符合查詢條件的數(shù)據(jù)行數(shù)。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數(shù)將等于6*8=48行。

            SELECT?type,pub_name
            
          FROM?titles?CROSS?JOIN?publishers
            
          ORDER?BY?type

          ?

          相關(guān)內(nèi)容:(來自csdn論壇)
          關(guān)于inner join,full outer join,left join,right jion的具體實現(xiàn)含義

          --查詢分析器中執(zhí)行:
          --建表table1,table2:

          create?table?table1(id?int,name?varchar(10))
          create?table?table2(id?int,score?int)
          insert?into?table1?select?1,'lee'
          insert?into?table1?select?2,'zhang'
          insert?into?table1?select?4,'wang'
          insert?into?table2?select?1,90
          insert?into?table2?select?2,100
          insert?into?table2?select?3,70


          如表
          -------------------------------------------------
          table1|table2|
          -------------------------------------------------
          idname|idscore|
          1lee|190|
          2zhang|2100|
          4wang|370|
          -------------------------------------------------

          以下均在查詢分析器中執(zhí)行

          一、外連接
          1.概念:包括左向外聯(lián)接、右向外聯(lián)接或完整外部聯(lián)接

          2.左連接:left join 或 left outer join
          (1)左向外聯(lián)接的結(jié)果集包括 LEFT OUTER 子句中指定的左表的所有行,而不僅僅是聯(lián)接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值(null)。
          (2)sql語句

          select?*?from?table1?left?join?table2?on?table1.id=table2.id


          -------------結(jié)果-------------
          idnameidscore
          ------------------------------
          1lee190
          2zhang2100
          4wangNULLNULL
          ------------------------------
          注釋:包含table1的所有子句,根據(jù)指定條件返回table2相應(yīng)的字段,不符合的以null顯示

          3.右連接:right join 或 right outer join
          (1)右向外聯(lián)接是左向外聯(lián)接的反向聯(lián)接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
          (2)sql語句

          select?*?from?table1?right?join?table2?on?table1.id=table2.id


          -------------結(jié)果-------------
          idnameidscore
          ------------------------------
          1lee190
          2zhang2100
          NULLNULL370
          ------------------------------
          注釋:包含table2的所有子句,根據(jù)指定條件返回table1相應(yīng)的字段,不符合的以null顯示

          4.完整外部聯(lián)接:full join 或 full outer join
          (1)完整外部聯(lián)接返回左表和右表中的所有行。當(dāng)某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結(jié)果集行包含基表的數(shù)據(jù)值。
          (2)sql語句

          select?*?from?table1?full?join?table2?on?table1.id=table2.id


          -------------結(jié)果-------------
          idnameidscore
          ------------------------------
          1lee190
          2zhang2100
          4wangNULLNULL
          NULLNULL370
          ------------------------------
          注釋:返回左右連接的和(見上左、右連接)

          二、內(nèi)連接
          1.概念:內(nèi)聯(lián)接是用比較運算符比較要聯(lián)接列的值的聯(lián)接

          2.內(nèi)連接:join 或 inner join

          3.sql語句

          select?*?from?table1?join?table2?on?table1.id=table2.id


          -------------結(jié)果-------------
          idnameidscore
          ------------------------------
          1lee190
          2zhang2100
          ------------------------------
          注釋:只返回符合條件的table1和table2的列

          4.等價(與下列執(zhí)行效果相同)

          A:select?a.*,b.*?from?table1?a,table2?b?where?a.id=b.id
          B:
          select?*?from?table1?cross?join?table2?where?table1.id=table2.id


          ?(注:cross join后加條件只能用where,不能用on)

          三、交叉連接(完全)

          1.概念:沒有 WHERE 子句的交叉聯(lián)接將產(chǎn)生聯(lián)接所涉及的表的笛卡爾積。第一個表的行數(shù)乘以第二個表的行數(shù)等于笛卡爾積結(jié)果集的大小。(table1和table2交叉連接產(chǎn)生3*3=9條記錄)

          2.交叉連接:cross join (不帶條件where...)

          3.sql語句

          select?*?from?table1?cross?join?table2


          -------------結(jié)果-------------
          idnameidscore
          ------------------------------
          1lee190
          2zhang190
          4wang190
          1lee2100
          2zhang2100
          4wang2100
          1lee370
          2zhang370
          4wang370
          ------------------------------
          注釋:返回3*3=9條記錄,即笛卡爾積

          4.等價(與下列執(zhí)行效果相同)

          A:select?*?from?table1,table2

          ?



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1376243

          主站蜘蛛池模板: 容城县| 嘉峪关市| 新干县| 镇原县| 桐梓县| 卢湾区| 昌都县| 九龙城区| 黄冈市| 浦北县| 贵阳市| 西安市| 格尔木市| 兴安盟| 阜新市| 南靖县| 南乐县| 慈溪市| 静乐县| 鹿泉市| 九寨沟县| 雅安市| 江陵县| 广西| 惠东县| 云和县| 吉木乃县| 连平县| 道真| 嘉兴市| 隆安县| 论坛| 龙南县| 元江| 依安县| 巩义市| 上思县| 深水埗区| 唐山市| 博野县| 辽宁省|