999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

SQL自連接詳解

2007-12-31 00:00:00古文瑋
考試周刊 2007年16期

摘要:本文對SQL語言中的自身連接進行了詳細的論述,討論了自身連接存在的必要性,并通過實例對SQL中自身連接查詢進行了深入的剖析。

關鍵詞:SQL 自連接 連接查詢

一、連接查詢

在SQL中,如果一個查詢同時涉及到兩個以上的表,那么這種查詢就稱為連接查詢。連接有多種形式,有等值連接、自然連接、非等值連接、外連接、復合條件連接和自身連接等。

大多數的連接,都是涉及到不同的表,以下面的SQL代碼為例:

SELECT Student.SNumber, Student.SName, StuCour.*

FROM Student, StuCour

WHERE Student.SNumber=StuCour.SNumber;

在上面的SQL代碼中,有兩個表:學生信息表Student(SNumber, SName, SSex, SAge)和學生選課信息表StuCour(SNumber, CNumber, Grade),這兩個表都有一個代表學生學號的叫做SNumber的屬性。查詢結果是將Student表和StuCour表中SNumber相同的學生的學號、姓名和選課信息顯示出來。

這種連接查詢,使用多個表格,并利用了不同表格中相應的列的邏輯關系,SQL代碼簡單、清楚、明了。但連接操作,并不只存在于多個表之中,有時,對單表進行查詢操作時,也必須使用連接操作。

二、用SQL自連接查詢處理列之間的關系

SQL自身連接,可以解決很多問題。下面舉的一個例子,就是使用了SQL自身連接,它解決了列與列之間的邏輯關系問題,準確的講是列與列之間的層次關系。SQL代碼如下:

SELECT FIRST.CNumber, SECOND.PCNumber

FROM Course FIRST, Course SECOND

WHERE FIRST.PCNumber=SECOND.CNumber;

在這個代碼中,只涉及到一個表,即課程信息表COURSE(CNumber, CName, PCNumber),其中CNumber是該課程的課程號,PCNumber是該課程的先修課課程號。在FROM子句中,為Course表起了兩個不同的別名,即FIRST和SECOND,即為Course表創建了兩個不同的實例。查詢時,使用了條件語句WHERE,要求FIRST表中的先修課號PCNumber同SECOND表中的課程號CNumber相同,而查詢所需要的結果,是FIRST表的課程號CNumber和SECOND表中的PCNumber,那么查詢結果,就應該是FIRST表中的課程號CNumber和該課程號所對應的間接先修課課程號。

同樣的查詢,如果不使用自連接,而純粹是對單表本身進行操作,那將是非常困難的。假設在這個表中,有兩個元組(cnumber1, cname1, pcnumber1)和(cnumber2, cname2, pcnumber2),其中,pcnumber1=cnumber2。在同一個COURSE表上,關于課程號的信息,只有CNumber和PCNumber這兩個屬性,它們只能表示一個課程號(cnumber1)和該課程號直接先修課(pcnumber1=cnumber2)的一層關系。而間接先修課,需要求出cnumber1和pcnumber2的關系,這是一個二層關系。對于這個只能表示一層關系的表而言,如果純粹對單表進行操作而不使用自然連接,那么一個可行的方案是,為Course表再增加一個列PPCNumber,令該列表示間接先修課,那么,通過三個列,就可以表示這種二層關系了。

通過這個例子以及對這個例子的分析,我們可以初步得出結論,自連接查詢,可以表示表中各列的層次關系。當所要查詢的信息都出于同一個表,而又不能直接通過該表的各個列的直接層次關系得到最終結果的時候,那么應該考慮使用表的自連接查詢。

三、SQL自連接查詢表示其它關系

除了處理前面例子中的列之間的層次關系之外,SQL自連接查詢還可用于處理列之間的順序關系、因果關系等多種邏輯關系。此外,SQL自身查詢還可以用于處理單列本身的邏輯關系。下面的例子,就說明了對單列的邏輯關系的處理。

SELECT FIRST.Num, FIRST Stop, SECOND.Stop

FROM Route FIRST, Route SECOND

WHERE FIRST.NUM=SECOND.NUM;

這個代碼中,只涉及到一個表Route(Num, Stop),這個表可以表示某一線路的火車的車站線路信息。Num表示該車的車次號,Stop表示該次車停靠的城市名稱。上面的代碼,可以求出某一線路的火車可以聯通的任意兩個城市的名稱。

在這里例子中,連接的操作對象只有Num這一個列,通過相同的車次號,找出該列車聯通的任意兩個城市的信息。在這個例子中,原來表Route中的每一個元組,只能表示車號和該車的某一站點的信息,實際上,這是“1Vs1”的映射關系。如果要表示兩個站點的聯通關系,那么就應該把兩個“1Vs1”關系合并,形成“1Vs多”的關系。我們利用自連接,很容易地解決了這個關系擴充的問題。

下面的這里例子,是對單一的列進行連接處理:

SELECT FIRST.Num, SECOND.Num, FIRST.Stop

FROM Route FIRST, Route SECOND

WHERE FRIST.Stop=SECOND.Stop;

上面的SQL代碼,求出了路經相同城市的車次的信息。原表中的車次和車站是“1Vs1”關系,通過自連接后,得到了車次和車站的“多Vs1”關系。

總結

同其它連接相比,SQL自連接查詢本身并沒有什么特殊的。但是,在應用中,自連接查詢因為其語法結構簡單,而邏輯結構復雜,語義往往不是那么容易被人理解,因此,在使用時,經常令人覺得迷惑不解。但只要把自連接運用的得當,把單表看成是多表,牢固樹立這一思維定式,我們會發現,自連接查詢會為我們解決很多復雜的問題。

參考文獻:

[1]何明. 從實踐中學習ORACLE/SQL. 清華大學出版社.

[2]施伯樂,丁寶康. 數據庫系統教程. 高等教育出版社.

[3]王海亮,張立民,王海鳳,鄭建茹.精通Oracle 10g SQL和PL/SQL. 中國水利水電出版社.

主站蜘蛛池模板: 久久99国产综合精品1| 久久香蕉国产线看观看精品蕉| 亚洲区欧美区| 欧美综合中文字幕久久| 97se亚洲| 国产福利不卡视频| 欧美成人在线免费| 久久无码av三级| 亚洲日韩久久综合中文字幕| 成人综合久久综合| 一本色道久久88| 亚洲欧美一区二区三区麻豆| 成人va亚洲va欧美天堂| 99ri精品视频在线观看播放| 国产一区在线视频观看| 91精品国产91久久久久久三级| 啪啪国产视频| a网站在线观看| 欧美一区精品| 福利国产在线| 四虎综合网| 日本免费一级视频| 国产成人乱码一区二区三区在线| yjizz视频最新网站在线| 亚洲欧美在线综合一区二区三区| 国产精品九九视频| 亚洲精品男人天堂| 国产在线精彩视频二区| 在线免费a视频| 色综合热无码热国产| 久久亚洲中文字幕精品一区| 午夜啪啪网| 啪啪永久免费av| 国产福利一区在线| 尤物亚洲最大AV无码网站| 国产亚洲欧美在线专区| 四虎在线高清无码| 欧美伊人色综合久久天天| 午夜成人在线视频| 欧美三級片黃色三級片黃色1| 成年人福利视频| 成人自拍视频在线观看| 欧美成人精品高清在线下载| 亚洲天堂精品视频| 欧美日本在线| 久久综合成人| 制服丝袜无码每日更新| 亚洲 欧美 日韩综合一区| 国产乱视频网站| 无码啪啪精品天堂浪潮av| 国产剧情一区二区| 福利在线不卡| 国产精品99在线观看| 风韵丰满熟妇啪啪区老熟熟女| 四虎影视永久在线精品| 久久人妻xunleige无码| 91美女视频在线观看| 91www在线观看| 国产婬乱a一级毛片多女| 四虎永久免费地址在线网站| 国产精品天干天干在线观看 | 国产91丝袜在线播放动漫 | 动漫精品中文字幕无码| 成人福利在线免费观看| 国产女人18水真多毛片18精品| 国产男女免费视频| 久久一色本道亚洲| 亚洲欧洲自拍拍偷午夜色| 亚洲一本大道在线| 亚洲黄色片免费看| 久久久精品无码一区二区三区| 青草视频网站在线观看| 伊人久久大香线蕉影院| 成人夜夜嗨| 亚洲二区视频| 成人一级黄色毛片| 国产本道久久一区二区三区| 国产区精品高清在线观看| 日本人妻一区二区三区不卡影院 | 91久久国产热精品免费| 成人午夜免费观看| 人人妻人人澡人人爽欧美一区|