




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
.net面試題目匯總Abstructclass與Interface的區(qū)別相同點:1)都不能被初始化;2)都支持抽象方法;不同點:1)abstractclass的成員函數(shù)允許有函數(shù)體,interface不能2)abstractclass允許有成員變量,interface不能(interface只能含有事件,委托,函數(shù),屬性,索引器);3)abstractclass的方法允許含有可見性修飾符,interface不能(默認為public)4)abstractclass不能被多重繼承,interface可以被多重繼承(實現(xiàn))5)abstractclass可以擁有構(gòu)造函數(shù)/靜態(tài)構(gòu)造函數(shù),interface不可以class與Struct的區(qū)別相同點:1)它們都是創(chuàng)建對象的模板,用以抽象某類具有統(tǒng)統(tǒng)特征的對象;他們都包含數(shù)據(jù)和方法;2)它們在使用上沒有太大的區(qū)別,除了關(guān)鍵字class和struct不同;不同點:1)Struct是值類型,它在內(nèi)存中的存儲方式是存儲于堆(heap)上2)Class是引用類型,它在內(nèi)存中的存儲方式是存儲于棧(stack)上Ref,Out,Params的區(qū)別params關(guān)鍵字可以指定在參數(shù)數(shù)目可變處采用參數(shù)的方法參數(shù)。在方法聲明中的params關(guān)鍵字之后不允許任何其他參數(shù),并且在方法聲明中只允許一個params關(guān)鍵字。Out這是一個引用傳遞L。原則一:當一個方法(函數(shù))在使用out作為參數(shù)時,在方法中(函數(shù))對out參數(shù)所做的任何更改都將反映在該變量中。原則二:當希望方法返回多個值時,聲明out方法非常有用。使用out參數(shù)的方法仍然可以返回一個值。一個方法可以有一個以上的out參數(shù)。原則三:若要使用out參數(shù),必須將參數(shù)作為out參數(shù)顯式傳遞到方法。out參數(shù)的值不會傳遞到out參數(shù)。原則四:不必初始化作為out參數(shù)傳遞的變量,因為out參數(shù)在進入方法(函數(shù))時后清空自己,使自己變成一個干凈的參數(shù),也因為這個原因必須在方法返回之前為out參數(shù)賦值(只有地址沒有值的參數(shù)是不能被.net接受的)。原則五:屬性不是變量,不能作為out參數(shù)傳遞。原則六:如果兩個方法的聲明僅在out的使用方面不同,則會發(fā)生重載。不過,無法定義僅在ref和out方面不同的重載。ref僅僅是一個地址?。?!原則一:當一個方法(函數(shù))在使用ref作為參數(shù)時,在方法中(函數(shù))對ref參數(shù)所做的任何更改都將反映在該變量中。原則二:調(diào)用方法時,在方法中對參數(shù)所做的任何更改都將反映在該變量中。原則三:若要使用ref參數(shù),必須將參數(shù)作為ref參數(shù)顯式傳遞到方法。ref參數(shù)的值可以被傳遞到ref參數(shù)。原則四:ref參數(shù)傳遞的變量必須初始化,因為ref參數(shù)在進入方法(函數(shù))時后還是它自己,它這個地址指向的還是原來的值,也因為這個原因ref參數(shù)也可以在使用它的方法內(nèi)部不操作。原則六:如果兩種方法的聲明僅在它們對ref的使用方面不同,則將出現(xiàn)重載。但是,無法定義僅在ref和out方面不同的重載。經(jīng)常會被問到的二個算法:冒泡排序和二分法。以下是兩個比較經(jīng)典的實現(xiàn)。冒泡排序算法:publicvoidBubbleSort(int[]arr){for(inti=1;i<arr.Length;i++)for(intj=0;j<arr.Length-i;j++){if(arr[j]>arr[j+1]){inttmp=arr[j];arr[j]=arr[j+1];arr[j+1]=tmp;}}}二分法查找:publicintHalfSearch(intkey,int[]arr){intleft=0;intright=arr.Length-1;while(left<=right){intmiddle=(left+right)/2;if(key==arr[middle])returnmiddle;elseif(key>arr[middle]){left=middle+1;}else{right=middle-1;return-1;面試時有相當大的可能會被問到面向?qū)ο竦奶攸c:繼承,封裝,多態(tài)。封裝:每個對象都包含它能進行操作所需要的所有信息,這個特性稱為封裝,因此對象不必依賴其他對象來完成自己的操作。繼承:對象的繼承代表了一種“is-a”的關(guān)系,如果兩個對象A和B,可以描述為“B是A”,則表明B可以繼承A。多態(tài):表示不同的對象可以執(zhí)行相同的動作,但要通過它們自己的實現(xiàn)代碼來執(zhí)行。集合ArrayList是命名空間System.Collections下的一部分,它是使用大小可以按需要動態(tài)增加的數(shù)組實現(xiàn)IList接口。泛型泛型是具有占位符(類型參數(shù))的類、結(jié)構(gòu)、接口和方法,這些占位符是類、結(jié)構(gòu)、接口和方法所存儲或使用的一個或多個類型的占位符。泛型集合類可以將類型參數(shù)用作它所存儲的對象的類型占位符;類型參數(shù)作為其字段的類型和其方法的參數(shù)類型出現(xiàn)。IList<A>arrA=newList<A>();通常情況下,都建議使用泛型集合,因為這樣可以獲得得類型安全的直接優(yōu)點而不需要從基集合類型派生并實現(xiàn)類型的特定成員。此外,如果集合元素為值類型,泛型集合的性能通常優(yōu)于對應(yīng)的非泛型集合類型(并優(yōu)于從非泛基集合型類型派生的類型),因為使用泛型時不必對元素進行裝箱。委托和事件委托是對函數(shù)的封裝,可以當作給方法的特征指定一個名稱。而事件則是委托的一種特殊形式,當發(fā)生有意義的事情時,事件對象處理通知過程。委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為。事件是在發(fā)生其他類或?qū)ο箨P(guān)注的事情時,類或?qū)ο罂赏ㄟ^事件通知它們。publicdelegatevoidCatShoutEventHandler();publiceventCatShoutEventHandlerCatShout;EventArges是包含事件數(shù)據(jù)的類的基類。一、Remoting和WebService面試的時候有時候會被問到Remoting和Webservice技術(shù)的區(qū)別:1.Remoting是MarshByReference的,可以傳變量的引用,直接對服務(wù)器對象操作。速度快,適合intranet(企業(yè)內(nèi)部互聯(lián)網(wǎng))。Webservice是MarshByValue的,必須傳對象的值。速度慢,可以過FIREWALL配置比較簡單,適合internet(因特網(wǎng))。一般來說,Remoting是和平臺相關(guān)的,需要客戶和服務(wù)器都是.NET,但可配置特性比較好,可以自定義協(xié)議,可以使用Http或Tcp協(xié)議。Webservice可以做到跨平臺通信,但必須采用SOAP協(xié)議。soap消息有rpc和文檔兩種樣式。文檔樣式的body元素中包含一個或多個元素,可以是任何內(nèi)容,只要接受者理解就行了。rpc樣式的的body元素中包含調(diào)用的方法或遠程過程的名稱,以及代表方法參數(shù)的元素。.net對這兩種樣式的實現(xiàn)就是Webservice和RemotingRemoting不僅能傳輸XML格式的SOAP包(HTTP),還能傳輸二進制的數(shù)據(jù)流(TCP)。Webservice只能傳輸SOAP包。Remoting可以用于有狀態(tài)的情況,Webservice是基于Http無狀態(tài)的。在Windows操作系統(tǒng)中,Webservice是基于.netframework和IIS框架之上的,而Remoting則是不依賴于IIS的,使用者可以開發(fā)和部署自己的宿主服務(wù)器。這里還有兩個重點:1.Remoting的SingleTon和SingleCall模式SingleTon模式:此為有狀態(tài)模式。如果設(shè)置為SingleTon激活方式,則Remoting將為所有客戶端建立同一個對象實例。當對象處于活動狀態(tài)時,SingleTon實例會處理所有后來的客戶端訪問請求,而不管它們是同一個客戶端,還是其他客戶端。SingleTon實例將在方法調(diào)用中一直維持其狀態(tài)。舉例來說,如果一個遠程對象有一個累加方法(i=0;++i),被多個客戶端(例如兩個)調(diào)用。如果設(shè)置為SingleTon方式,則第一個客戶獲得值為1,第二個客戶獲得值為2,因為他們獲得的對象實例是相同的。如果熟悉Asp.Net的狀態(tài)管理,我們可以認為它是一種Application狀態(tài)。SingleCall模式:SingleCall是一種無狀態(tài)模式。一旦設(shè)置為SingleCall模式,則當客戶端調(diào)用遠程對象的方法時,Remoting會為每一個客戶端建立一個遠程對象實例,至于對象實例的銷毀則是由GC自動管理的。同上一個例子而言,則訪問遠程對象的兩個客戶獲得的都是1。我們?nèi)匀豢梢越梃bAsp.Net的狀態(tài)管理,認為它是一種Session狀態(tài)。WebService和SOAP支持處理的數(shù)據(jù)類型不知道大家有沒有遇到這種情況:在調(diào)用WebService并給一個方法傳遞了一個DataRow參數(shù)時,運行時會拋出異常:”沒法將參數(shù)序列化!”,如果把DataRow加入到DataSet中,并將DataSet作為參數(shù)傳遞再運行就OK了。這是因為:XMLWebService只能對數(shù)據(jù)集DataSet對象類型進行XML序列化,不能對DataRow對象類型進行XML序列化造成的錯誤.所以了解一下XMLWebService支持序列化的基本數(shù)據(jù)類型是比較重要的.它支持的數(shù)據(jù)類型如下:1).基本數(shù)據(jù)類型.標準類型,如:intfloatboolDateTimestring等基本數(shù)據(jù)類型2).枚舉.支持枚舉Enum定義的類型3).自定義對象.可以傳遞任意基于自定義類或結(jié)構(gòu)創(chuàng)建的對象。但要注意一點:它只能傳輸數(shù)據(jù)成員(變量和屬性).如果定義了方法,則方法不能進行序列化傳輸,序列化后只剩下數(shù)據(jù)成員..DataSet對象支持DataSet,切記:不支持DataTable和DataRow,DataSet已經(jīng)是Webservice能夠支持的最小的可序列化對象..XmlNode對象基于XmlNode的對象可以表示XML文檔的一部分..數(shù)組和集合可以使用任何被支持的類型的數(shù)組和簡單集合,包括:DataSet對象/XmlNode對象和自定義對象.順便說明一下序列化的概念:序列化是指將對象實例的狀態(tài)存儲到存儲媒體的過程。在此過程中,先將對象的公共字段和私有字段以及類的名稱轉(zhuǎn)換為字節(jié)流,然后再把字節(jié)流寫入數(shù)據(jù)流。在隨后對對象進行反序列化時,將創(chuàng)建出與原對象完全相同的副本。要使一個類可序列化,最簡單的方法是使用Serializable屬性對它進行標記。給個例子:[Serializable]classMyUser{publicstringsUserName;publicintiAage;publicoverridestringToString(){returnstring.Format("姓名:{0},年齡:{1}”,sUserName,iAage);}}///////1、CTS、CLS和CLR分別是什么意思?什么是裝箱和拆箱?答:CTS是公共類型系統(tǒng),CLS是公共語言規(guī)范,CLR公共語言運行庫。裝箱和拆箱:是把值類型轉(zhuǎn)換為引用類型的過程,是隱式的,相反的過程就是拆箱,是顯式的。2、C#、JavaC++特點,有什么相同地方,不同的。C#從C++和Java吸取了什么優(yōu)點?答:C#大部分的特性來源于Java,例如編譯機制,運行機制,中間語言,虛擬機等等。但是C#拓展了Java,支持了更多優(yōu)良的語法,比如事件編程機制。并且dotnetframework的支持多種編程語言(java,C#,C++,VB.NET等),不同于java虛擬機單一的支持java語言。C#繼承于C++的特性是指針,通過unsafe關(guān)鍵字,C#可以使用底層的指針直接操作內(nèi)存,但是一個有爭議的特性。3、C#可否對內(nèi)存直接操作。答:可以,通過unsafe語法,C#可以使用類似于C++的指針,直接操作內(nèi)存。但是最好不要使用!4、維護數(shù)據(jù)庫的完整性,你喜歡用觸發(fā)器還是自寫業(yè)務(wù)邏輯?為什么?答:盡可能用約束(包括CHECK、主鍵、唯一鍵、外鍵、非空字段)實現(xiàn),這種方式的效率最好;其次用觸發(fā)器,這種方式可以保證無論何種業(yè)務(wù)系統(tǒng)訪問數(shù)據(jù)庫都能維持數(shù)據(jù)庫的完整性、一致性;最后再考慮用自寫業(yè)務(wù)邏輯實現(xiàn),但這種方式效率最低、編程最復(fù)雜,當為下下之策5、C#中的委托是什么?事件是不是委托?答:1,委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為。委托方法的使用可以像其他任何方法一樣,具有參數(shù)和返回值。例子:publicdelegateintPerformCalculation(intx,inty);2,事件不是委托,但是事件的底層實確實是基于委托的。所以某種意義上可以把事件理解為加上的event關(guān)鍵字的委托變量。6、簡述以下你對分布式程序設(shè)計的理解,你對COM、DCOM、remoting、webservice了解嗎?簡單描述其特點作用7、自定義控件和一般控件的異同。如果用過兩者之一你選什么?為什么?答:自定控件可以加到VS工具欄里用,一般控件做不到,自定義控件可以繼承其它控件,也可以被繼承.8、大概描述一下ASP.NET服務(wù)器控件的生命周期?答:初始化---加載視圖狀態(tài)---處理回發(fā)數(shù)據(jù)---加載---發(fā)送回發(fā)更改通知---處理同發(fā)事件---預(yù)呈現(xiàn)---保存狀態(tài)---呈現(xiàn)---處置---卸載9、colloction和collections區(qū)別?答:Collection是集合類的上級接口,Collections是針對集合類的一個幫助類,它提供一系列靜態(tài)方法來實現(xiàn)對各種集合的搜索,排序,線程安全化操作。10、ASP、ASP.NET實現(xiàn)報表顯示打印的方案?答:應(yīng)用XML技術(shù)實現(xiàn)報表打印的方案。11、math.roand(11.5)等于多少?,mathround(-11.5)等于多少?答:12、-1112、overload和override區(qū)別overloaded的方法是否可以改變返回值、類型?答:Override是重寫的意思,它表示重寫基類的方法,而且方法的名稱,返回類型,參數(shù)類型,參數(shù)個數(shù)要與基類相同。Overload是重載是意思,它也表示重寫基類的方法,但是只要方法名相同,別的可以不同。是可以改變返回值、類型13、set里的元素是不能重復(fù)的,那么用什么方法區(qū)分復(fù)與否呢?用==還是equas(),他們有什么區(qū)別?答:Set里的元素是不能重復(fù)的,那么用iterator()方法來區(qū)分重復(fù)與否。equals()是判讀兩個Set是否相等。equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內(nèi)容和類型相配的話,返回真值14、List、Set、Map是否繼承自colloction接口?答:List,Set是Map不是15、兩個對象值相同((X?EAUSCY)==TURE)fi卻可有不同的hashcode這句話對嗎?答:不對,有相同的hashcode。16.SonSurtion能不能作用在byte.string.long上?不能存儲過程和函數(shù)區(qū)別?答:函數(shù)有且只有一個返回值,就像普通的函數(shù)一樣,可以直接在表達式中嵌入調(diào)用存儲過程可以沒有返回值,也可以有任意個輸出參數(shù),必須單獨調(diào)用事務(wù)是什么?答:事務(wù)是指一個工作單元,它包含了一組數(shù)據(jù)操作命令,并且所有的命令作為一個整體一起向系統(tǒng)提交或撤消請求操作,這組命令要么都執(zhí)行,要么都不執(zhí)行。游標作用,如何知道游標已到了最后?答:游標用于定位結(jié)果集的行,通過判斷全局變量@@fetch_status砍斷是否到了最后,通常變量不等于0表示出錯或到了最后觸發(fā)器分事前觸發(fā)的事后觸發(fā)區(qū)別是什么?語句級觸發(fā)和行級觸發(fā)區(qū)別?事前觸發(fā)器運行于觸發(fā)事件發(fā)生之前,而事后觸發(fā)器運行于觸發(fā)事件發(fā)生之后。通常事前觸發(fā)器可以獲取事件之前和新的字段值。語句級觸發(fā)器可以在語句執(zhí)行前或后執(zhí)行,而行級觸發(fā)在觸發(fā)器所影響的每一行觸發(fā)一次。分析下SQLServer,Excharge.Server.Share,Porint,PortfalServerBiaTalkserve各自的功能及其作用?ApplicafionBlock說明其作用?ApplicationBlock將工作流代碼從用戶界面層抽象出來放到用戶界面處理層。UIPApplicationBlock將UIP狀態(tài)從用戶界面中抽象出來并且存儲在一個通用狀態(tài)對象中,這個對象通過block類來訪問ASP中怎么連接數(shù)據(jù)庫?用javascript連接什么是AppheafionPool?應(yīng)用程序池是將一個或多個應(yīng)用程序鏈接到一個或多個工作進程集合的配置。因為應(yīng)用程序池中的應(yīng)用程序與其他應(yīng)用程序被工作進程邊界分隔,所以某個應(yīng)用程序池中的應(yīng)用程序不會受到其他應(yīng)用程序池中應(yīng)用程序所產(chǎn)生的問題的影響。Remoting在客戶端服務(wù)怎么實現(xiàn)?COM、DCOM、REMOTING、WEBSERVICE了解多少?com是一個很好的組鍵說說你的項目經(jīng)驗及心得?你在三年內(nèi)的職業(yè)規(guī)劃是什么?swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?答:switch(exprl)中,exprl是一個整數(shù)表達式。因此傳遞給switch和case語句的參數(shù)應(yīng)該是int、short、char或者byte。long,string都不能作用于swtich。ADO.NET的對象分別有什么?答:1,Connection//標識一個數(shù)據(jù)庫的連接2,Command//可以通過該對象向數(shù)據(jù)庫服務(wù)器發(fā)送Sql命令,并且得到返回結(jié)果。3,Transaction//表示一個數(shù)據(jù)庫的事務(wù),通過SqlConnection的BeginTransaction方法啟動事務(wù),它包含Commit提交和Rollback回滾兩個操作。4,DataReader//返回游標讀取類5,DataAdapter//數(shù)據(jù)配置器,配合DataSet使用,提供離線的數(shù)據(jù)集合訪問支持。6,SqlCommandBuilder//SqlDataAdapter類的輔助類,可以通過查詢命令生成增,刪,改的命令。什么時候用到虛方法?虛方法和接口有什么區(qū)別?什么是“虛方法"?當實例方法聲明包含virtual修飾符時,稱該方法為虛擬方法。不存在virtual修飾符時,稱該方法為非虛擬方法。非虛擬方法的實現(xiàn)是不變的:無論是在聲明它的類的實例上調(diào)用該方法還是在派生類的實例上調(diào)用,實現(xiàn)都是相同的。與此相反,虛擬方法的實現(xiàn)可以由派生類取代。取代所繼承的虛擬方法之實現(xiàn)的過程稱為重寫方法在虛擬方法調(diào)用中,為其進行調(diào)用的實例的運行時類型確定要調(diào)用的實際方法實現(xiàn)。在非虛擬方法調(diào)用中,實例的編譯時類型是決定性因素。準確地說,當在具有編譯時類型C和運行時類型R的實例(其中R為C或者從C派生的類)上用參數(shù)列表A調(diào)用名為N的方法時,調(diào)用按下面這樣處理:首先,將重載決策應(yīng)用于C、N和A,以從在C中聲明和由C繼承的方法集中選擇一個特定方法M。然后,如果M為非虛擬方法,則調(diào)用M。否則,M為虛擬方法,調(diào)用就R而言M的派生程度最大的實現(xiàn)。32.請編程遍歷頁面上所有TextBox控件并給它賦值為string.Empty?答:foreach(System.Windows.Forms.Controlcontrolinthis.Controls){if(controlisSystem.Windows.Forms.TextBox){System.Windows.Forms.TextBoxtb=(System.Windows.Forms.TextBox)control;tb.Text=String.Empty;}}SQL基本語句SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于這是大多數(shù)SQL用戶經(jīng)常用到的,我們有必要在此對它們進行一一說明。在圖1中我們給出了一個名為EMPLOYEES的表。其中的每一行對應(yīng)一個特定的雇員記錄。請熟悉這張表,我們在后面的例子中將要用到它。INSERT語句用戶可以用INSERT語句將一行記錄插入到指定的一個表中。例如,要將雇員JohnSmith的記錄插入到本例的表中,可以使用如下語句:INSERTINTOEMPLOYEESVALUES('Smith','John','1980-06-10','LosAngles',16,45000);通過這樣的INSERT語句,系統(tǒng)將試著將這些值填入到相應(yīng)的列中。這些列按照我們創(chuàng)建表時定義的順序排列。在本例中,第一個值“Smith”將填到第一個列LAST_NAME中;第二個值“John”將填到第二列FIRST_NAME中……以此類推。我們說過系統(tǒng)會“試著”將值填入,除了執(zhí)行規(guī)則之外它還要進行類型檢查。如果類型不符(如將一個字符串填入到類型為數(shù)字的列中),系統(tǒng)將拒絕這一次操作并返回一個錯誤信息。如果SQL拒絕了你所填入的一列值,語句中其他各列的值也不會填入。這是因為SQL提供對事務(wù)的支持。一次事務(wù)將數(shù)據(jù)庫從一種一致性轉(zhuǎn)移到另一種一致性。如果事務(wù)的某一部分失敗,則整個事務(wù)都會失敗,系統(tǒng)將會被恢復(fù)(或稱之為回退)到此事務(wù)之前的狀態(tài)。回到原來的INSERT的例子,請注意所有的整形十進制數(shù)都不需要用單引號引起來,而字符串和日期類型的值都要用單引號來區(qū)別。為了增加可讀性而在數(shù)字間插入逗號將會引起錯誤。記住,在SQL中逗號是元素的分隔符。同樣要注意輸入文字值時要使用單引號。雙引號用來封裝限界標識符。對于日期類型,我們必須使用SQL標準日期格式(yyyy-mm-dd),但是在系統(tǒng)中可以進行定義,以接受其他的格式。當然,2000年臨近,請你最好還是使用四位來表示年份。既然你已經(jīng)理解了INSERT語句是怎樣工作的了,讓我們轉(zhuǎn)到EMPLOYEES表中的其他部分:INSERTINTOEMPLOYEESVALUES('Bunyan','Paul','1970-07-04','Boston',12,70000);INSERTINTOEMPLOYEESVALUES('John','Adams','1992-01-21','Boston',20,100000);INSERTINTOEMPLOYEESVALUES('Smith','Pocahontas','1976-04-06','LosAngles',12,100000);INSERTINTOEMPLOYEESVALUES('Smith','Bessie','1940-05-02','Boston',5,200000);INSERTINTOEMPLOYEESVALUES('Jones','Davy','1970-10-10','Boston',8,45000);INSERTINTOEMPLOYEESVALUES('Jones','Indiana','1992-02-01','Chicago',NULL,NULL);在最后一項中,我們不知道Jones先生的工薪級別和年薪,所以我們輸入NULL(不要引號)。NULL是SQL中的一種特殊情況,我們以后將進行詳細的討論?,F(xiàn)在我們只需認為NULL表示一種未知的值。有時,像我們剛才所討論的情況,我們可能希望對某一些而不是全部的列進行賦值。除了對要省略的列輸入NULL外,還可以采用另外一種INSERT語句,如下:INSERTINTOEMPLOYEES(FIRST_NAME,LAST_NAME,HIRE_DATE,BRANCH_OFFICE)VALUE('Indiana','Jones','1992-02-01','Indianapolis');這樣,我們先在表名之后列出一系列列名。未列出的列中將自動填入缺省值,如果沒有設(shè)置缺省值則填入NULL。請注意我們改變了列的順序,而值的順序要對應(yīng)新的列的順序。如果該語句中省略了FIRST_NAME和LAST_NAME項(這兩項規(guī)定不能為空),SQL操作將失敗。讓我們來看一看上述INSERT語句的語法圖:INSERTINTOtable[(column{,column})]VALUES(columnvalue[{,columnvalue}]);和前一篇文章中一樣,我們用方括號來表示可選項,大括號表示可以重復(fù)任意次數(shù)的項(不能在實際的SQL語句中使用這些特殊字符)。VALUE子句和可選的列名列表中必須使用圓括號。SELECT語句SELECT語句可以從一個或多個表中選取特定的行和列。因為查詢和檢索數(shù)據(jù)是數(shù)據(jù)庫管理中最重要的功能,所以SELECT語句在SQL中是工作量最大的部分。實際上,僅僅是訪問數(shù)據(jù)庫來分析數(shù)據(jù)并生成報表的人可以對其他SQL語句一竅不通。SELECT語句的結(jié)果通常是生成另外一個表。在執(zhí)行過程中系統(tǒng)根據(jù)用戶的標準從數(shù)據(jù)庫中選出匹配的行和列,并將結(jié)果放到臨時的表中。在直接SQL(directSQL)中,它將結(jié)果顯示在終端的顯示屏上,或者將結(jié)果送到打印機或文件中。也可以結(jié)合其他SQL語句來將結(jié)果放到一個已知名稱的表中。SELECT語句功能強大。雖然表面上看來它只用來完成本文第一部分中提到的關(guān)系代數(shù)運算“選擇”(或稱“限制”),但實際上它也可以完成其他兩種關(guān)系運算一“投影”和“連接”,SELECT語句還可以完成聚合計算并對數(shù)據(jù)進行排序。SELECT語句最簡單的語法如下:SELECTcolumnsFROMtables;當我們以這種形式執(zhí)行一條SELECT語句時,系統(tǒng)返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結(jié)果表。這就是實現(xiàn)關(guān)系投影運算的一個形式。讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個表是我們以后所有SELECT語句實例都要使用的。而我們在圖2和圖3中給出了查詢的實際結(jié)果。我們將在其他的例子中使用這些結(jié)果)。假設(shè)你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:SELECTBRANCH_OFFICEFROMEMPLOYEES;以上SELECT語句的執(zhí)行將產(chǎn)生如圖2中表2所示的結(jié)果。由于我們在SELECT語句中只指定了一個列,所以我們的結(jié)果表中也只有一個列。注意結(jié)果表中具有重復(fù)的行,這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結(jié)果中的重復(fù)行,只要在SELECT語句中加上DISTINCT子句:SELECTDISTINCTBRANCH_OFFICEFROMEMPLOYEES;這次查詢的結(jié)果如表3所示。現(xiàn)在已經(jīng)消除了重復(fù)的行,但結(jié)果并不是按照順序排列的。如果你希望以字母表順序?qū)⒔Y(jié)果列出又該怎么做呢?只要使用ORDERBY子句就可以按照升序或降序來排列結(jié)果:SELECTDISTINCTBRANCH_OFFICEFROMEMPLOYEESORDERBYBRANCH_OFFICEASC;這一查詢的結(jié)果如表4所示。請注意在ORDERBY之后是如何放置列名BRANCH_OFFICE的,這就是我們想要對其進行排序的列。為什么即使是結(jié)果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序,即使它們并不顯示出來。列名BRANCH_OFFICE之后的關(guān)鍵字ASC表示按照升序排列。如果你希望以降序排列,那么可以用關(guān)鍵字DESC。同樣我們應(yīng)該指出ORDERBY子句只將臨時表中的結(jié)果進行排序;并不影響原來的表。假設(shè)我們希望得到按部門排序并從工資最高的雇員到工資最低的雇員排列的列表。除了工資括號中的內(nèi)容,我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:SELECTBRANCH_OFFICE,FIRST_NAME,LAST_NAME,SALARYHIRE_DATEFROMEMPLOYEESORDERBYSALARYDESC,HIRE_DATEDESC;這里我們進行了多列的選擇和排序。排序的優(yōu)先級由語句中的列名順序所決定。SQL將先對列出的第一個列進行排序。如果在第一個列中出現(xiàn)了重復(fù)的行時,這些行將被按照第二列進行排序,如果在第二列中又出現(xiàn)了重復(fù)的行時,這些行又將被按照第三列進行排序……如此類推。這次查詢的結(jié)果如表5所示。將一個很長的表中的所有列名寫出來是一件相當麻煩的事,所以SQL允許在選擇表中所有的列時使用*號:SELECT*FROMEMPLOYEES;這次查詢返回整個EMPLOYEES表,如表1所示。下面我們對開始時給出的SELECT語句的語法進行一下更新(豎直線表示一個可選項,允許在其中選擇一項。):SELECT[DISTINCT](column[{,columns}])!*FROMtable[{,table}][ORDERBYcolumn[ASC]IDESC[{,column[ASC]IDESC}]];定義選擇標準在我們目前所介紹的SELECT語句中,我們對結(jié)果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對SELECT語句進行限制使得它只返回希望得到的行:SELECTcolumnsFROMtables[WHEREpredicates];WHERE子句對條件進行了設(shè)置,只有滿足條件的行才被包括到結(jié)果表中。這些條件由斷言(predicate)進行指定(斷言指出了關(guān)于某件事情的一種可能的事實)。如果該斷言對于某個給定的行成立,該行將被包括到結(jié)果表中,否則該行被忽略。在SQL語句中斷言通常通過比較來表示。例如,假如你需要查詢所有姓為Jones的職員,則可以使用以下SELECT語句:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones';LAST_NAME='Jones部分就是斷言。在執(zhí)行該語句時,SQL將每一行的LAST_NAME列與“Jones”進行比較。如果某一職員的姓為Jones”,即斷言成立,該職員的信息將被包括到結(jié)果表中(見表6)。使用最多的六種比較我們上例中的斷言包括一種基于“等值”的比較(LAST_NAME='Jones'),但是SQL斷言還可以包含其他幾種類型的比較。其中最常用的為:格工等于=不等于<>小于<大于>小于或等于<=大于或等于>=下面給出了不是基于等值比較的一個例子:SELECT*FROMEMPLOYEESWHERESALARY>50000;這一查詢將返回年薪高于$50,000.00的職員(參見表7)。邏輯連接符有時我們需要定義一條不止一種斷言的SELECT語句。舉例來說,如果你僅僅想查看DavyJones的信息的話,表6中的結(jié)果將是不正確的。為了進一步定義一個WHERE子句,用戶可以使用邏輯連接符AND,OR和NOT。為了只得到職員DavyJones的記錄,用戶可以輸入如下語句:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones'ANDFIRST_NAME='Davy';在本例中,我們通過邏輯連接符AND將兩個斷言連接起來。只有兩個斷言都滿足時整個表達式才會滿足。如果用戶需要定義一個SELECT語句來使得當其中任何一項成立就滿足條件時,可以使用OR連接符:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones'ORLAST_NAME='Smith';有時定義一個斷言的最好方法是通過相反的描述來說明。如果你想要查看除了Boston辦事處的職員以外的其他所有職員的信息時,你可以進行如下的查詢:SELECT*FROMEMPLOYEESWHERENOT(BRANCH_OFFICE='Boston');關(guān)鍵字NOT后面跟著用圓括號括起來的比較表達式。其結(jié)果是對結(jié)果取否定。如果某一職員所在部門的辦事處在Boston,括號內(nèi)的表達式返回true,但是NOT操作符將該值取反,所以該行將不被選中。斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進行求值,可以用括號將它們括起來:SELECT*FROMEMPLOYEESWHERE(LAST_NAME='Jones'ANDFIRST_NAME='Indiana')OR(LAST_NAME='Smith'ANDFIRST_NAME='Bessie');SQL沿用數(shù)學(xué)上標準的表達式求值的約定一圓括號內(nèi)的表達式將最先進行求值,其他表達式將從左到右進行求值。以上對邏輯連接符進行了說明,在對下面的內(nèi)容進行說明之前,我們再一次對SELECT語句的語法進行更新:SELECT[DISTINCT](column[{,column}])|*FROMtable[{,table}][ORDERBYcolumn[ASC]|[DESC[{,column[ASC]|[DESC}]]WHEREpredicate[{logical-connectorpredicate}];NULL和三值邏輯在SQL中NULL是一個復(fù)雜的話題,關(guān)于NULL的詳細描述更適合于在SQL的高級教程而不是現(xiàn)在的入門教程中進行介紹。但由于NULL需要進行特殊處理,并且你也很可能會遇到它,所以我們還是簡略地進行一下說明。首先,在斷言中進行NULL判斷時需要特殊的語法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語句:SELECT*FROMEMPLOYEESWHERESALARYISNULL;相反,如果用戶需要所有已知年薪數(shù)據(jù)的職員的信息,你可以使用以下語句:SELECT*FROMEMPLOYEESWHERESALARYISNOTNULL;請注意我們在列名之后使用了關(guān)鍵字ISNULL或ISNOTNULL,而不是標準的比較形式:COLUMN=NULL、COLUMN<>NULL或是邏輯操作符NOT(NULL)。這種形式相當簡單。但當你不明確地測試NULL(而它們確實存在)時,事情會變得很混亂。例如,回過頭來看我
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 熱射病護理病例討論模板
- 春季農(nóng)藥采購合同范本
- 音響燈光購買合同范本
- 蔬菜購銷合同范本模板
- 離婚協(xié)議書探視權(quán)范例
- 二零二五版環(huán)境保護技術(shù)咨詢合同
- 同股不同權(quán)創(chuàng)始股東協(xié)議書
- 二零二五合作養(yǎng)雞合同范例
- 期貨交易合同
- 二零二五房貸離婚協(xié)議書
- 認知行為療法講解
- 【課件】文明的瑰寶(藝術(shù)色彩)課件高中美術(shù)人教版(2019)選擇性必修1+繪畫
- 史丹利行業(yè)分析
- H3C全系列產(chǎn)品visio圖標庫
- 恩賜測試完整版本
- “科學(xué)與文化論著研習(xí)”任務(wù)群教學(xué):以《改造我們的學(xué)習(xí)》為例
- canva可畫行業(yè)分析
- 《安徽大學(xué)簡介》課件
- 《神經(jīng)介入治療》課件
- 護士如何應(yīng)對患者和家屬的抱怨和不滿
- 電動汽車底盤的維護與保養(yǎng)
評論
0/150
提交評論