net面試題目匯總_第1頁
net面試題目匯總_第2頁
net面試題目匯總_第3頁
net面試題目匯總_第4頁
net面試題目匯總_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

.net面試題目匯總Abstructclass與Interface的區別相同點:1)都不能被初始化;2)都支持抽象方法;不同點:1)abstractclass的成員函數允許有函數體,interface不能2)abstractclass允許有成員變量,interface不能(interface只能含有事件,委托,函數,屬性,索引器);3)abstractclass的方法允許含有可見性修飾符,interface不能(默認為public)4)abstractclass不能被多重繼承,interface可以被多重繼承(實現)5)abstractclass可以擁有構造函數/靜態構造函數,interface不可以class與Struct的區別相同點:1)它們都是創建對象的模板,用以抽象某類具有統統特征的對象;他們都包含數據和方法;2)它們在使用上沒有太大的區別,除了關鍵字class和struct不同;不同點:1)Struct是值類型,它在內存中的存儲方式是存儲于堆(heap)上2)Class是引用類型,它在內存中的存儲方式是存儲于棧(stack)上Ref,Out,Params的區別params關鍵字可以指定在參數數目可變處采用參數的方法參數。在方法聲明中的params關鍵字之后不允許任何其他參數,并且在方法聲明中只允許一個params關鍵字。Out這是一個引用傳遞L。原則一:當一個方法(函數)在使用out作為參數時,在方法中(函數)對out參數所做的任何更改都將反映在該變量中。原則二:當希望方法返回多個值時,聲明out方法非常有用。使用out參數的方法仍然可以返回一個值。一個方法可以有一個以上的out參數。原則三:若要使用out參數,必須將參數作為out參數顯式傳遞到方法。out參數的值不會傳遞到out參數。原則四:不必初始化作為out參數傳遞的變量,因為out參數在進入方法(函數)時后清空自己,使自己變成一個干凈的參數,也因為這個原因必須在方法返回之前為out參數賦值(只有地址沒有值的參數是不能被.net接受的)。原則五:屬性不是變量,不能作為out參數傳遞。原則六:如果兩個方法的聲明僅在out的使用方面不同,則會發生重載。不過,無法定義僅在ref和out方面不同的重載。ref僅僅是一個地址!!!原則一:當一個方法(函數)在使用ref作為參數時,在方法中(函數)對ref參數所做的任何更改都將反映在該變量中。原則二:調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。原則三:若要使用ref參數,必須將參數作為ref參數顯式傳遞到方法。ref參數的值可以被傳遞到ref參數。原則四:ref參數傳遞的變量必須初始化,因為ref參數在進入方法(函數)時后還是它自己,它這個地址指向的還是原來的值,也因為這個原因ref參數也可以在使用它的方法內部不操作。原則六:如果兩種方法的聲明僅在它們對ref的使用方面不同,則將出現重載。但是,無法定義僅在ref和out方面不同的重載。經常會被問到的二個算法:冒泡排序和二分法。以下是兩個比較經典的實現。冒泡排序算法: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;面試時有相當大的可能會被問到面向對像的特點:繼承,封裝,多態。封裝:每個對象都包含它能進行操作所需要的所有信息,這個特性稱為封裝,因此對象不必依賴其他對象來完成自己的操作。繼承:對象的繼承代表了一種“is-a”的關系,如果兩個對象A和B,可以描述為“B是A”,則表明B可以繼承A。多態:表示不同的對象可以執行相同的動作,但要通過它們自己的實現代碼來執行。集合ArrayList是命名空間System.Collections下的一部分,它是使用大小可以按需要動態增加的數組實現IList接口。泛型泛型是具有占位符(類型參數)的類、結構、接口和方法,這些占位符是類、結構、接口和方法所存儲或使用的一個或多個類型的占位符。泛型集合類可以將類型參數用作它所存儲的對象的類型占位符;類型參數作為其字段的類型和其方法的參數類型出現。IList<A>arrA=newList<A>();通常情況下,都建議使用泛型集合,因為這樣可以獲得得類型安全的直接優點而不需要從基集合類型派生并實現類型的特定成員。此外,如果集合元素為值類型,泛型集合的性能通常優于對應的非泛型集合類型(并優于從非泛基集合型類型派生的類型),因為使用泛型時不必對元素進行裝箱。委托和事件委托是對函數的封裝,可以當作給方法的特征指定一個名稱。而事件則是委托的一種特殊形式,當發生有意義的事情時,事件對象處理通知過程。委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為。事件是在發生其他類或對象關注的事情時,類或對象可通過事件通知它們。publicdelegatevoidCatShoutEventHandler();publiceventCatShoutEventHandlerCatShout;EventArges是包含事件數據的類的基類。一、Remoting和WebService面試的時候有時候會被問到Remoting和Webservice技術的區別:1.Remoting是MarshByReference的,可以傳變量的引用,直接對服務器對象操作。速度快,適合intranet(企業內部互聯網)。Webservice是MarshByValue的,必須傳對象的值。速度慢,可以過FIREWALL配置比較簡單,適合internet(因特網)。一般來說,Remoting是和平臺相關的,需要客戶和服務器都是.NET,但可配置特性比較好,可以自定義協議,可以使用Http或Tcp協議。Webservice可以做到跨平臺通信,但必須采用SOAP協議。soap消息有rpc和文檔兩種樣式。文檔樣式的body元素中包含一個或多個元素,可以是任何內容,只要接受者理解就行了。rpc樣式的的body元素中包含調用的方法或遠程過程的名稱,以及代表方法參數的元素。.net對這兩種樣式的實現就是Webservice和RemotingRemoting不僅能傳輸XML格式的SOAP包(HTTP),還能傳輸二進制的數據流(TCP)。Webservice只能傳輸SOAP包。Remoting可以用于有狀態的情況,Webservice是基于Http無狀態的。在Windows操作系統中,Webservice是基于.netframework和IIS框架之上的,而Remoting則是不依賴于IIS的,使用者可以開發和部署自己的宿主服務器。這里還有兩個重點:1.Remoting的SingleTon和SingleCall模式SingleTon模式:此為有狀態模式。如果設置為SingleTon激活方式,則Remoting將為所有客戶端建立同一個對象實例。當對象處于活動狀態時,SingleTon實例會處理所有后來的客戶端訪問請求,而不管它們是同一個客戶端,還是其他客戶端。SingleTon實例將在方法調用中一直維持其狀態。舉例來說,如果一個遠程對象有一個累加方法(i=0;++i),被多個客戶端(例如兩個)調用。如果設置為SingleTon方式,則第一個客戶獲得值為1,第二個客戶獲得值為2,因為他們獲得的對象實例是相同的。如果熟悉Asp.Net的狀態管理,我們可以認為它是一種Application狀態。SingleCall模式:SingleCall是一種無狀態模式。一旦設置為SingleCall模式,則當客戶端調用遠程對象的方法時,Remoting會為每一個客戶端建立一個遠程對象實例,至于對象實例的銷毀則是由GC自動管理的。同上一個例子而言,則訪問遠程對象的兩個客戶獲得的都是1。我們仍然可以借鑒Asp.Net的狀態管理,認為它是一種Session狀態。WebService和SOAP支持處理的數據類型不知道大家有沒有遇到這種情況:在調用WebService并給一個方法傳遞了一個DataRow參數時,運行時會拋出異常:”沒法將參數序列化!”,如果把DataRow加入到DataSet中,并將DataSet作為參數傳遞再運行就OK了。這是因為:XMLWebService只能對數據集DataSet對象類型進行XML序列化,不能對DataRow對象類型進行XML序列化造成的錯誤.所以了解一下XMLWebService支持序列化的基本數據類型是比較重要的.它支持的數據類型如下:1).基本數據類型.標準類型,如:intfloatboolDateTimestring等基本數據類型2).枚舉.支持枚舉Enum定義的類型3).自定義對象.可以傳遞任意基于自定義類或結構創建的對象。但要注意一點:它只能傳輸數據成員(變量和屬性).如果定義了方法,則方法不能進行序列化傳輸,序列化后只剩下數據成員..DataSet對象支持DataSet,切記:不支持DataTable和DataRow,DataSet已經是Webservice能夠支持的最小的可序列化對象..XmlNode對象基于XmlNode的對象可以表示XML文檔的一部分..數組和集合可以使用任何被支持的類型的數組和簡單集合,包括:DataSet對象/XmlNode對象和自定義對象.順便說明一下序列化的概念:序列化是指將對象實例的狀態存儲到存儲媒體的過程。在此過程中,先將對象的公共字段和私有字段以及類的名稱轉換為字節流,然后再把字節流寫入數據流。在隨后對對象進行反序列化時,將創建出與原對象完全相同的副本。要使一個類可序列化,最簡單的方法是使用Serializable屬性對它進行標記。給個例子:[Serializable]classMyUser{publicstringsUserName;publicintiAage;publicoverridestringToString(){returnstring.Format("姓名:{0},年齡:{1}”,sUserName,iAage);}}///////1、CTS、CLS和CLR分別是什么意思?什么是裝箱和拆箱?答:CTS是公共類型系統,CLS是公共語言規范,CLR公共語言運行庫。裝箱和拆箱:是把值類型轉換為引用類型的過程,是隱式的,相反的過程就是拆箱,是顯式的。2、C#、JavaC++特點,有什么相同地方,不同的。C#從C++和Java吸取了什么優點?答:C#大部分的特性來源于Java,例如編譯機制,運行機制,中間語言,虛擬機等等。但是C#拓展了Java,支持了更多優良的語法,比如事件編程機制。并且dotnetframework的支持多種編程語言(java,C#,C++,VB.NET等),不同于java虛擬機單一的支持java語言。C#繼承于C++的特性是指針,通過unsafe關鍵字,C#可以使用底層的指針直接操作內存,但是一個有爭議的特性。3、C#可否對內存直接操作。答:可以,通過unsafe語法,C#可以使用類似于C++的指針,直接操作內存。但是最好不要使用!4、維護數據庫的完整性,你喜歡用觸發器還是自寫業務邏輯?為什么?答:盡可能用約束(包括CHECK、主鍵、唯一鍵、外鍵、非空字段)實現,這種方式的效率最好;其次用觸發器,這種方式可以保證無論何種業務系統訪問數據庫都能維持數據庫的完整性、一致性;最后再考慮用自寫業務邏輯實現,但這種方式效率最低、編程最復雜,當為下下之策5、C#中的委托是什么?事件是不是委托?答:1,委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為。委托方法的使用可以像其他任何方法一樣,具有參數和返回值。例子:publicdelegateintPerformCalculation(intx,inty);2,事件不是委托,但是事件的底層實確實是基于委托的。所以某種意義上可以把事件理解為加上的event關鍵字的委托變量。6、簡述以下你對分布式程序設計的理解,你對COM、DCOM、remoting、webservice了解嗎?簡單描述其特點作用7、自定義控件和一般控件的異同。如果用過兩者之一你選什么?為什么?答:自定控件可以加到VS工具欄里用,一般控件做不到,自定義控件可以繼承其它控件,也可以被繼承.8、大概描述一下ASP.NET服務器控件的生命周期?答:初始化---加載視圖狀態---處理回發數據---加載---發送回發更改通知---處理同發事件---預呈現---保存狀態---呈現---處置---卸載9、colloction和collections區別?答:Collection是集合類的上級接口,Collections是針對集合類的一個幫助類,它提供一系列靜態方法來實現對各種集合的搜索,排序,線程安全化操作。10、ASP、ASP.NET實現報表顯示打印的方案?答:應用XML技術實現報表打印的方案。11、math.roand(11.5)等于多少?,mathround(-11.5)等于多少?答:12、-1112、overload和override區別overloaded的方法是否可以改變返回值、類型?答:Override是重寫的意思,它表示重寫基類的方法,而且方法的名稱,返回類型,參數類型,參數個數要與基類相同。Overload是重載是意思,它也表示重寫基類的方法,但是只要方法名相同,別的可以不同。是可以改變返回值、類型13、set里的元素是不能重復的,那么用什么方法區分復與否呢?用==還是equas(),他們有什么區別?答:Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值14、List、Set、Map是否繼承自colloction接口?答:List,Set是Map不是15、兩個對象值相同((X?EAUSCY)==TURE)fi卻可有不同的hashcode這句話對嗎?答:不對,有相同的hashcode。16.SonSurtion能不能作用在byte.string.long上?不能存儲過程和函數區別?答:函數有且只有一個返回值,就像普通的函數一樣,可以直接在表達式中嵌入調用存儲過程可以沒有返回值,也可以有任意個輸出參數,必須單獨調用事務是什么?答:事務是指一個工作單元,它包含了一組數據操作命令,并且所有的命令作為一個整體一起向系統提交或撤消請求操作,這組命令要么都執行,要么都不執行。游標作用,如何知道游標已到了最后?答:游標用于定位結果集的行,通過判斷全局變量@@fetch_status砍斷是否到了最后,通常變量不等于0表示出錯或到了最后觸發器分事前觸發的事后觸發區別是什么?語句級觸發和行級觸發區別?事前觸發器運行于觸發事件發生之前,而事后觸發器運行于觸發事件發生之后。通常事前觸發器可以獲取事件之前和新的字段值。語句級觸發器可以在語句執行前或后執行,而行級觸發在觸發器所影響的每一行觸發一次。分析下SQLServer,Excharge.Server.Share,Porint,PortfalServerBiaTalkserve各自的功能及其作用?ApplicafionBlock說明其作用?ApplicationBlock將工作流代碼從用戶界面層抽象出來放到用戶界面處理層。UIPApplicationBlock將UIP狀態從用戶界面中抽象出來并且存儲在一個通用狀態對象中,這個對象通過block類來訪問ASP中怎么連接數據庫?用javascript連接什么是AppheafionPool?應用程序池是將一個或多個應用程序鏈接到一個或多個工作進程集合的配置。因為應用程序池中的應用程序與其他應用程序被工作進程邊界分隔,所以某個應用程序池中的應用程序不會受到其他應用程序池中應用程序所產生的問題的影響。Remoting在客戶端服務怎么實現?COM、DCOM、REMOTING、WEBSERVICE了解多少?com是一個很好的組鍵說說你的項目經驗及心得?你在三年內的職業規劃是什么?swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?答:switch(exprl)中,exprl是一個整數表達式。因此傳遞給switch和case語句的參數應該是int、short、char或者byte。long,string都不能作用于swtich。ADO.NET的對象分別有什么?答:1,Connection//標識一個數據庫的連接2,Command//可以通過該對象向數據庫服務器發送Sql命令,并且得到返回結果。3,Transaction//表示一個數據庫的事務,通過SqlConnection的BeginTransaction方法啟動事務,它包含Commit提交和Rollback回滾兩個操作。4,DataReader//返回游標讀取類5,DataAdapter//數據配置器,配合DataSet使用,提供離線的數據集合訪問支持。6,SqlCommandBuilder//SqlDataAdapter類的輔助類,可以通過查詢命令生成增,刪,改的命令。什么時候用到虛方法?虛方法和接口有什么區別?什么是“虛方法"?當實例方法聲明包含virtual修飾符時,稱該方法為虛擬方法。不存在virtual修飾符時,稱該方法為非虛擬方法。非虛擬方法的實現是不變的:無論是在聲明它的類的實例上調用該方法還是在派生類的實例上調用,實現都是相同的。與此相反,虛擬方法的實現可以由派生類取代。取代所繼承的虛擬方法之實現的過程稱為重寫方法在虛擬方法調用中,為其進行調用的實例的運行時類型確定要調用的實際方法實現。在非虛擬方法調用中,實例的編譯時類型是決定性因素。準確地說,當在具有編譯時類型C和運行時類型R的實例(其中R為C或者從C派生的類)上用參數列表A調用名為N的方法時,調用按下面這樣處理:首先,將重載決策應用于C、N和A,以從在C中聲明和由C繼承的方法集中選擇一個特定方法M。然后,如果M為非虛擬方法,則調用M。否則,M為虛擬方法,調用就R而言M的派生程度最大的實現。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。由于這是大多數SQL用戶經常用到的,我們有必要在此對它們進行一一說明。在圖1中我們給出了一個名為EMPLOYEES的表。其中的每一行對應一個特定的雇員記錄。請熟悉這張表,我們在后面的例子中將要用到它。INSERT語句用戶可以用INSERT語句將一行記錄插入到指定的一個表中。例如,要將雇員JohnSmith的記錄插入到本例的表中,可以使用如下語句:INSERTINTOEMPLOYEESVALUES('Smith','John','1980-06-10','LosAngles',16,45000);通過這樣的INSERT語句,系統將試著將這些值填入到相應的列中。這些列按照我們創建表時定義的順序排列。在本例中,第一個值“Smith”將填到第一個列LAST_NAME中;第二個值“John”將填到第二列FIRST_NAME中……以此類推。我們說過系統會“試著”將值填入,除了執行規則之外它還要進行類型檢查。如果類型不符(如將一個字符串填入到類型為數字的列中),系統將拒絕這一次操作并返回一個錯誤信息。如果SQL拒絕了你所填入的一列值,語句中其他各列的值也不會填入。這是因為SQL提供對事務的支持。一次事務將數據庫從一種一致性轉移到另一種一致性。如果事務的某一部分失敗,則整個事務都會失敗,系統將會被恢復(或稱之為回退)到此事務之前的狀態。回到原來的INSERT的例子,請注意所有的整形十進制數都不需要用單引號引起來,而字符串和日期類型的值都要用單引號來區別。為了增加可讀性而在數字間插入逗號將會引起錯誤。記住,在SQL中逗號是元素的分隔符。同樣要注意輸入文字值時要使用單引號。雙引號用來封裝限界標識符。對于日期類型,我們必須使用SQL標準日期格式(yyyy-mm-dd),但是在系統中可以進行定義,以接受其他的格式。當然,2000年臨近,請你最好還是使用四位來表示年份。既然你已經理解了INSERT語句是怎樣工作的了,讓我們轉到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中的一種特殊情況,我們以后將進行詳細的討論。現在我們只需認為NULL表示一種未知的值。有時,像我們剛才所討論的情況,我們可能希望對某一些而不是全部的列進行賦值。除了對要省略的列輸入NULL外,還可以采用另外一種INSERT語句,如下:INSERTINTOEMPLOYEES(FIRST_NAME,LAST_NAME,HIRE_DATE,BRANCH_OFFICE)VALUE('Indiana','Jones','1992-02-01','Indianapolis');這樣,我們先在表名之后列出一系列列名。未列出的列中將自動填入缺省值,如果沒有設置缺省值則填入NULL。請注意我們改變了列的順序,而值的順序要對應新的列的順序。如果該語句中省略了FIRST_NAME和LAST_NAME項(這兩項規定不能為空),SQL操作將失敗。讓我們來看一看上述INSERT語句的語法圖:INSERTINTOtable[(column{,column})]VALUES(columnvalue[{,columnvalue}]);和前一篇文章中一樣,我們用方括號來表示可選項,大括號表示可以重復任意次數的項(不能在實際的SQL語句中使用這些特殊字符)。VALUE子句和可選的列名列表中必須使用圓括號。SELECT語句SELECT語句可以從一個或多個表中選取特定的行和列。因為查詢和檢索數據是數據庫管理中最重要的功能,所以SELECT語句在SQL中是工作量最大的部分。實際上,僅僅是訪問數據庫來分析數據并生成報表的人可以對其他SQL語句一竅不通。SELECT語句的結果通常是生成另外一個表。在執行過程中系統根據用戶的標準從數據庫中選出匹配的行和列,并將結果放到臨時的表中。在直接SQL(directSQL)中,它將結果顯示在終端的顯示屏上,或者將結果送到打印機或文件中。也可以結合其他SQL語句來將結果放到一個已知名稱的表中。SELECT語句功能強大。雖然表面上看來它只用來完成本文第一部分中提到的關系代數運算“選擇”(或稱“限制”),但實際上它也可以完成其他兩種關系運算一“投影”和“連接”,SELECT語句還可以完成聚合計算并對數據進行排序。SELECT語句最簡單的語法如下:SELECTcolumnsFROMtables;當我們以這種形式執行一條SELECT語句時,系統返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結果表。這就是實現關系投影運算的一個形式。讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個表是我們以后所有SELECT語句實例都要使用的。而我們在圖2和圖3中給出了查詢的實際結果。我們將在其他的例子中使用這些結果)。假設你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:SELECTBRANCH_OFFICEFROMEMPLOYEES;以上SELECT語句的執行將產生如圖2中表2所示的結果。由于我們在SELECT語句中只指定了一個列,所以我們的結果表中也只有一個列。注意結果表中具有重復的行,這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結果中的重復行,只要在SELECT語句中加上DISTINCT子句:SELECTDISTINCTBRANCH_OFFICEFROMEMPLOYEES;這次查詢的結果如表3所示。現在已經消除了重復的行,但結果并不是按照順序排列的。如果你希望以字母表順序將結果列出又該怎么做呢?只要使用ORDERBY子句就可以按照升序或降序來排列結果:SELECTDISTINCTBRANCH_OFFICEFROMEMPLOYEESORDERBYBRANCH_OFFICEASC;這一查詢的結果如表4所示。請注意在ORDERBY之后是如何放置列名BRANCH_OFFICE的,這就是我們想要對其進行排序的列。為什么即使是結果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序,即使它們并不顯示出來。列名BRANCH_OFFICE之后的關鍵字ASC表示按照升序排列。如果你希望以降序排列,那么可以用關鍵字DESC。同樣我們應該指出ORDERBY子句只將臨時表中的結果進行排序;并不影響原來的表。假設我們希望得到按部門排序并從工資最高的雇員到工資最低的雇員排列的列表。除了工資括號中的內容,我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:SELECTBRANCH_OFFICE,FIRST_NAME,LAST_NAME,SALARYHIRE_DATEFROMEMPLOYEESORDERBYSALARYDESC,HIRE_DATEDESC;這里我們進行了多列的選擇和排序。排序的優先級由語句中的列名順序所決定。SQL將先對列出的第一個列進行排序。如果在第一個列中出現了重復的行時,這些行將被按照第二列進行排序,如果在第二列中又出現了重復的行時,這些行又將被按照第三列進行排序……如此類推。這次查詢的結果如表5所示。將一個很長的表中的所有列名寫出來是一件相當麻煩的事,所以SQL允許在選擇表中所有的列時使用*號:SELECT*FROMEMPLOYEES;這次查詢返回整個EMPLOYEES表,如表1所示。下面我們對開始時給出的SELECT語句的語法進行一下更新(豎直線表示一個可選項,允許在其中選擇一項。):SELECT[DISTINCT](column[{,columns}])!*FROMtable[{,table}][ORDERBYcolumn[ASC]IDESC[{,column[ASC]IDESC}]];定義選擇標準在我們目前所介紹的SELECT語句中,我們對結果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對SELECT語句進行限制使得它只返回希望得到的行:SELECTcolumnsFROMtables[WHEREpredicates];WHERE子句對條件進行了設置,只有滿足條件的行才被包括到結果表中。這些條件由斷言(predicate)進行指定(斷言指出了關于某件事情的一種可能的事實)。如果該斷言對于某個給定的行成立,該行將被包括到結果表中,否則該行被忽略。在SQL語句中斷言通常通過比較來表示。例如,假如你需要查詢所有姓為Jones的職員,則可以使用以下SELECT語句:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones';LAST_NAME='Jones部分就是斷言。在執行該語句時,SQL將每一行的LAST_NAME列與“Jones”進行比較。如果某一職員的姓為Jones”,即斷言成立,該職員的信息將被包括到結果表中(見表6)。使用最多的六種比較我們上例中的斷言包括一種基于“等值”的比較(LAST_NAME='Jones'),但是SQL斷言還可以包含其他幾種類型的比較。其中最常用的為:格工等于=不等于<>小于<大于>小于或等于<=大于或等于>=下面給出了不是基于等值比較的一個例子:SELECT*FROMEMPLOYEESWHERESALARY>50000;這一查詢將返回年薪高于$50,000.00的職員(參見表7)。邏輯連接符有時我們需要定義一條不止一種斷言的SELECT語句。舉例來說,如果你僅僅想查看DavyJones的信息的話,表6中的結果將是不正確的。為了進一步定義一個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');關鍵字NOT后面跟著用圓括號括起來的比較表達式。其結果是對結果取否定。如果某一職員所在部門的辦事處在Boston,括號內的表達式返回true,但是NOT操作符將該值取反,所以該行將不被選中。斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進行求值,可以用括號將它們括起來:SELECT*FROMEMPLOYEESWHERE(LAST_NAME='Jones'ANDFIRST_NAME='Indiana')OR(LAST_NAME='Smith'ANDFIRST_NAME='Bessie');SQL沿用數學上標準的表達式求值的約定一圓括號內的表達式將最先進行求值,其他表達式將從左到右進行求值。以上對邏輯連接符進行了說明,在對下面的內容進行說明之前,我們再一次對SELECT語句的語法進行更新:SELECT[DISTINCT](column[{,column}])|*FROMtable[{,table}][ORDERBYcolumn[ASC]|[DESC[{,column[ASC]|[DESC}]]WHEREpredicate[{logical-connectorpredicate}];NULL和三值邏輯在SQL中NULL是一個復雜的話題,關于NULL的詳細描述更適合于在SQL的高級教程而不是現在的入門教程中進行介紹。但由于NULL需要進行特殊處理,并且你也很可能會遇到它,所以我們還是簡略地進行一下說明。首先,在斷言中進行NULL判斷時需要特殊的語法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語句:SELECT*FROMEMPLOYEESWHERESALARYISNULL;相反,如果用戶需要所有已知年薪數據的職員的信息,你可以使用以下語句:SELECT*FROMEMPLOYEESWHERESALARYISNOTNULL;請注意我們在列名之后使用了關鍵字ISNULL或ISNOTNULL,而不是標準的比較形式:COLUMN=NULL、COLUMN<>NULL或是邏輯操作符NOT(NULL)。這種形式相當簡單。但當你不明確地測試NULL(而它們確實存在)時,事情會變得很混亂。例如,回過頭來看我

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論