posts - 15,comments - 65,trackbacks - 0

                    本文最新發(fā)布于http://www.lovestblog.cn,歡迎轉(zhuǎn)載該文,但請(qǐng)注明文章出處,謝謝合作。 

                    mysql的from從句用來指定參與查詢的表,當(dāng)然也可以是生成的中間表,在表前我們有時(shí)需要指定數(shù)據(jù)庫,這主要是用在我們需要訪問當(dāng)前數(shù)據(jù)庫之外的數(shù)據(jù)庫中的表的情況,在這中情況下我們采用"."操作符來進(jìn)行,如userdb.user,其實(shí)userdb為數(shù)據(jù)庫名,user為表名,這是對(duì)mysql數(shù)據(jù)庫而言的,對(duì)于DB2和Oracle就不是通過指定數(shù)據(jù)庫名了,而是指定sql用戶了,這就是說不同sql用戶可以建立相同名字的表,但是同一個(gè)sql用戶只能建立唯一名字的表。這就是它們?cè)谶@表規(guī)范上面的區(qū)別。對(duì)于列規(guī)范,mysql可以在需要查詢的列則可以采用如下形式進(jìn)行訪問:“數(shù)據(jù)庫名.表名.列名”。對(duì)于多個(gè)表的規(guī)范,也就是涉及查詢多個(gè)表的情況下,執(zhí)行的過程是采用笛卡爾積的形式進(jìn)行的。也就是說生成的中間表的列數(shù)為兩個(gè)表中列數(shù)的總和,而行的總數(shù)等于一個(gè)表中的行的數(shù)量與另外一個(gè)表中行的數(shù)量的乘積。
                 對(duì)于from從句中使用假名的情況,比如select u.id,name,age,a.account from utb as u,atb as a where u.id=a.user_id,在我們使用假名之后,那么在該sql語句的任何地方都只能使用假名,不能使用真實(shí)的表名,同時(shí)上面的as關(guān)鍵字也是可以省略的,也就是說對(duì)于上面的語句不能用atb來取代a,utb來取代u了。雖然from從句不是我們指定的第一條語句,但是絕對(duì)是第一個(gè)被處理的語句,所以在聲明假名前使用假名不會(huì)導(dǎo)致錯(cuò)誤。如果一條from從句引用到兩個(gè)有著相同名稱的表,則必須使用假名。如:

          1select p.playerno
          2from players as p,players as par
          3where par.fn="jp" and par.ln="l" and p.birth_date<par.birth_date


                 對(duì)于多個(gè)表間的連接處理可能會(huì)導(dǎo)致有相同的結(jié)果,即有重復(fù)的結(jié)果,sql并不會(huì)自動(dòng)從最終結(jié)果中刪除重復(fù)的行,這是如果我們不希望在結(jié)果中出現(xiàn)重復(fù)的行,那么我們可以在select后直接指定distinct。如:

          1select distinct T.playerno 
          2from teams as T,penalties as pen 
          3where T.playerno=pen.playerno。

           

                  接下來說說連接哈,對(duì)于內(nèi)連接,如果是兩個(gè)表的話,就取兩個(gè)表的一個(gè)交集,如果是左外連接的話,那就是左邊的表全取,右邊沒有的用null替代,弱國(guó)是右外連接的話,那就是右邊的表全取,左邊沒有的用null表示。下面看看一個(gè)具體的例子:

          1--表stu        --表exam 
          2id name        id grade 
          31, Jack         156 
          42, Tom         276
          53, Kity         1189
          64, nono 

           

          內(nèi)連接 (顯示兩表id匹配的)

          1select stu.id,exam.id,stu.name, exam.grade from stu (inner) join exam on stu.id=exam.id 
          2-------------------------------- 
          31 1 Jack 56 
          42 2 Tom 76 

           

          左連接(顯示join 左邊的表的所有數(shù)據(jù),exam只有兩條記錄,所以stu.id,grade 都用NULL 顯示)

          1select stu.id,exam.id,stu.name, exam.grade from stu left (outer) join exam on stu.id=exam.id 
          21 1 Jack 56 
          32 2 Tom 76 
          43 NULL Kity NULL 
          54 NULL nono NULL 

           

          右連接(與作連接相反,顯示join右邊表的所有數(shù)據(jù))

          1select stu.id,exam.id,stu.name, exam.grade from stu right join exam on stu.id=exam.id 
          21 1 Jack 56 
          32 2 Tom 76 
          4NULL 11 NULL 89 

           

          內(nèi)連接取交集,外連接分左和右,
          左連接左邊的全取,
          右連接右邊的全取

                對(duì)于連接的列的名稱相同的話,那么可以使用using來替代條件,如上面的內(nèi)連接可以這樣改寫:
              

          1  select stu.id,exam.id,stu.name, exam.grade from stu inner join exam using(id)。

                對(duì)于左外連接使用的情況一般是當(dāng)左表的連接列中存在未出現(xiàn)在右表的連接列中的值時(shí),左外連接才有用。
                還有個(gè)全外連接的,也就是說只要在兩個(gè)表中出現(xiàn)的記錄都會(huì)在中間表中出現(xiàn),當(dāng)右表有而左表沒有或當(dāng)左表有而右表沒有的時(shí)候用null表示。具體語法如下:select stu.id,exam.id,stu.name, exam.grade from stu full join exam using(id)。
                交叉連接:就是顯示求表的笛卡爾積,select * from teams cross join penalties.這句完全等價(jià)于select teams.*,penalties.* from teams,penalties.
                聯(lián)合連接:select * from teams union join penalties,這個(gè)其實(shí)很容易理解,產(chǎn)生結(jié)果所包含的列為兩個(gè)表所有的列和,對(duì)于數(shù)據(jù)的列出,首先列出左表的數(shù)據(jù),對(duì)于屬于右表的列,用null表示,接下來列出右表的數(shù)據(jù),對(duì)于屬于左表的列用null表示。
                 自然連接:select * from teams nature inner join penalties where division='first';此句完全等同與select t.playerno,t.teamno,t.division,pen.paymentno,pen.payment_date,pen.amount from teams  as t inner join penalties as pen on t.playerno=pen.playerno where dividion='first'.相比就知道,我們無須顯示指出必須要連接到哪些列,sql會(huì)自動(dòng)查找兩表中是否有相同名稱的列,且假設(shè)他們必須在連接條件中使用。此處的on或using從句是多余的,因此不允許使用。

                 下面看個(gè)例子創(chuàng)建一個(gè)稱為towns的虛擬表:

          1select *
          2from (select 'Stratford' as town,4 as number 
          3       union
          4       select 'Plymouth',6
          5       union
          6       select 'Inglewood',1                 
          7       union
          8       select 'Douglas',2) as towns
          9order by town;


          結(jié)果為:

          1town             number
          2----------------------
          3Douglas              2
          4Inglewood           1
          5Plymouth            6
          6Stratford            4


           

          posted on 2009-09-24 15:51 你假笨 閱讀(2030) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 津南区| 保亭| 丰镇市| 东光县| 伽师县| 大邑县| 南川市| 祁阳县| 闵行区| 横峰县| 东乡县| 黔西县| 东城区| 新河县| 鹤峰县| 新竹市| 东至县| 花莲市| 庄河市| 会宁县| 潮安县| 略阳县| 当涂县| 衢州市| 获嘉县| 香港| 奉新县| 青阳县| 贵港市| 新余市| 洛浦县| 霍林郭勒市| 宽城| 高平市| 雷州市| 望都县| 保定市| 连云港市| 信丰县| 通山县| 腾冲县|