版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
掌握SQL四條最基本的數(shù)據(jù)操作語句:Insert,Select,Update和Delete。練掌握SQL是數(shù)據(jù)庫用戶的寶貴財(cái)富。在本文中,我們將引導(dǎo)你掌握四條最基本的數(shù)據(jù)操作語句一SQL的核心功能一來依次介紹比較操作符、選擇斷言以及三值邏輯。當(dāng)你完成這些學(xué)習(xí)后,顯然你已經(jīng)開始算是精通SQL了。在我們開始之前,先使用CREATETABLE語句來創(chuàng)建一個(gè)表(如圖1所示)。DDL語句對(duì)數(shù)據(jù)庫對(duì)象如表、列和視進(jìn)行定義。它們并不對(duì)表中的行進(jìn)行處理,這是因?yàn)镈DL語句并不處理數(shù)據(jù)庫中實(shí)際的數(shù)據(jù)。這些工作由另一類SQL語句一數(shù)據(jù)操作語言(DML)語句進(jìn)行處理。SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于這是大多數(shù)SQL用戶經(jīng)常用到的,我們有必要在此對(duì)它們進(jìn)行一一說明。在圖1中我們給出了一個(gè)名為EMPLOYEES的表。其中的每一行對(duì)應(yīng)一個(gè)特定的雇員記錄。請(qǐng)熟悉這張表,我們?cè)诤竺娴睦又袑⒁玫剿?。INSERT語句用戶可以用INSERT語句將一行記錄插入到指定的一個(gè)表中。例如,要將雇員JohnSmith的記錄插入到本例的表中,可以使用如下語句:INSERTINTOEMPLOYEESVALUES('Smith','John','1980-06-10','LosAngles',16,45000);通過這樣的INSERT語句,系統(tǒng)將試著將這些值填入到相應(yīng)的列中。這些列按照我們創(chuàng)建表時(shí)定義的順序排列。在本例中,第一個(gè)值Smith”將填到第一個(gè)列LAST_NAME中;第二個(gè)值“John”將填到第二列FIRST_NAME中......以此類推。我們說過系統(tǒng)會(huì)“試著”將值填入,除了執(zhí)行規(guī)則之外它還要進(jìn)行類型檢查。如果類型不符(如將一個(gè)字符串填入到類型為數(shù)字的列中),系統(tǒng)將拒絕這一次操作并返回一個(gè)錯(cuò)誤信息。如果SQL拒絕了你所填入的一列值,語句中其他各列的值也不會(huì)填入。這是因?yàn)镾QL提供對(duì)事務(wù)的支持。一次事務(wù)將數(shù)據(jù)庫從一種一致性轉(zhuǎn)移到另一種一致性。如果事務(wù)的某一部分失敗,則整個(gè)事務(wù)都會(huì)失敗,系統(tǒng)將會(huì)被恢復(fù)(或稱之為回退)到此事務(wù)之前的狀態(tài)?;氐皆瓉淼腎NSERT的例子,請(qǐng)注意所有的整形十進(jìn)制數(shù)都不需要用單引號(hào)引起來,而字符串和日期類型的值都要用單引號(hào)來區(qū)別。為了增加可讀性而在數(shù)字間插入逗號(hào)將會(huì)引起錯(cuò)誤。記住,在SQL中逗號(hào)是元素的分隔符。同樣要注意輸入文字值時(shí)要使用單引號(hào)。雙引號(hào)用來封裝限界標(biāo)識(shí)符。對(duì)于日期類型,我們必須使用SQL標(biāo)準(zhǔn)日期格式(yyyy-mm-dd),但是在系統(tǒng)中可以進(jìn)行定義,以接受其他的格式。當(dāng)然,2000年臨近,請(qǐng)你最好還是使用四位來表示年份。既然你已經(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);在最后一項(xiàng)中,我們不知道Jones先生的工薪級(jí)別和年薪,所以我們輸入NULL(不要引號(hào))。NULL是SQL中的一種特殊情況,我們以后將進(jìn)行詳細(xì)的討論。現(xiàn)在我們只需認(rèn)為NULL表示一種未知的值。有時(shí),像我們剛才所討論的情況,我們可能希望對(duì)某一些而不是全部的列進(jìn)行賦值。除了對(duì)要省略的列輸入NULL外,還可以采用另外一種INSERT語句,如下:INSERTINTOEMPLOYEES(FIRST_NAME,LAST_NAME,HIRE_DATE,BRANCH_OFFICE)VALUE('Indiana','Jones','1992-02-01','Indianapolis');這樣,我們先在表名之后列出一系列列名。未列出的列中將自動(dòng)填入缺省值,如果沒有設(shè)置缺省值則填入NULL。請(qǐng)注意我們改變了列的順序,而值的順序要對(duì)應(yīng)新的列的順序。如果該語句中省略了FIRST_NAME和LAST_NAME項(xiàng)(這兩項(xiàng)規(guī)定不能為空),SQL操作將失敗。讓我們來看一看上述INSERT語句的語法圖:INSERTINTOtable[(column{,column})]VALUES(columnvalue[{,columnvalue}]);和前一篇文章中一樣,我們用方括號(hào)來表示可選項(xiàng),大括號(hào)表示可以重復(fù)任意次數(shù)的項(xiàng)(不能在實(shí)際的SQL語句中使用這些特殊字符)。VALUE子句和可選的列名列表中必須使用圓括號(hào)。SELECT語句SELECT語句可以從一個(gè)或多個(gè)表中選取特定的行和列。因?yàn)椴樵兒蜋z索數(shù)據(jù)是數(shù)據(jù)庫管理中最重要的功能,所以SELECT語句在SQL中是工作量最大的部分。實(shí)際上,僅僅是訪問數(shù)據(jù)庫來分析數(shù)據(jù)并生成報(bào)表的人可以對(duì)其他SQL語句一竅不通。SELECT語句的結(jié)果通常是生成另外一個(gè)表。在執(zhí)行過程中系統(tǒng)根據(jù)用戶的標(biāo)準(zhǔn)從數(shù)據(jù)庫中選出匹配的行和列,并將結(jié)果放到臨時(shí)的表中。在直接SQL(directSQL)中,它將結(jié)果顯示在終端的顯示屏上,或者將結(jié)果送到打印機(jī)或文件中。也可以結(jié)合其他SQL語句來將結(jié)果放到一個(gè)已知名稱的表中。SELECT語句功能強(qiáng)大。雖然表面上看來它只用來完成本文第一部分中提到的關(guān)系代數(shù)運(yùn)算“選擇”(或稱“限制”),但實(shí)際上它也可以完成其他兩種關(guān)系運(yùn)算一“投影”和“連接”,SELECT語句還可以完成聚合計(jì)算并對(duì)數(shù)據(jù)進(jìn)行排序。SELECT語句最簡單的語法如下:SELECTcolumnsFROMtables;當(dāng)我們以這種形式執(zhí)行一條SELECT語句時(shí),系統(tǒng)返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個(gè)結(jié)果表。這就是實(shí)現(xiàn)關(guān)系投影運(yùn)算的一個(gè)形式。讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個(gè)表是我們以后所有SELECT語句實(shí)例都要使用的。而我們?cè)趫D2和圖3中給出了查詢的實(shí)際結(jié)果。我們將在其他的例子中使用這些結(jié)果)。假設(shè)你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:SELECTBRANCH_OFFICEFROMEMPLOYEES;以上SELECT語句的執(zhí)行將產(chǎn)生如圖2中表2所示的結(jié)果。由于我們?cè)赟ELECT語句中只指定了一個(gè)列,所以我們的結(jié)果表中也只有一個(gè)列。注意結(jié)果表中具有重復(fù)的行,這是因?yàn)橛卸鄠€(gè)雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結(jié)果中的重復(fù)行,只要在SELECT語句中加上DISTINCT子句:SELECTDISTINCTBRANCH_OFFICEFROMEMPLOYEES;這次查詢的結(jié)果如表3所示?,F(xiàn)在已經(jīng)消除了重復(fù)的行,但結(jié)果并不是按照順序排列的。如果你希望以字母表順序?qū)⒔Y(jié)果列出又該怎么做呢?只要使用ORDERBY子句就可以按照升序或降序來排列結(jié)果:SELECTDISTINCTBRANCH_OFFICEFROMEMPLOYEESORDERBYBRANCH_OFFICEASC;這一查詢的結(jié)果如表4所示。請(qǐng)注意在ORDERBY之后是如何放置列名BRANCH_OFFICE的,這就是我們想要對(duì)其進(jìn)行排序的列。為什么即使是結(jié)果表中只有一個(gè)列時(shí)我們也必須指出列名呢?這是因?yàn)槲覀冞€能夠按照表中其他列進(jìn)行排序,即使它們并不顯示出來。列名BRANCH_OFFICE之后的關(guān)鍵字ASC表示按照升序排列。如果你希望以降序排列,那么可以用關(guān)鍵字DESC。同樣我們應(yīng)該指出ORDERBY子句只將臨時(shí)表中的結(jié)果進(jìn)行排序;并不影響原來的表。假設(shè)我們希望得到按部門排序并從工資最高的雇員到工資最低的雇員排列的列表。除了工資括號(hào)中的內(nèi)容,我們還希望看到按照聘用時(shí)間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:SELECTBRANCH_OFFICE,FIRST_NAME,LAST_NAME,SALARYHIRE_DATEFROMEMPLOYEESORDERBYSALARYDESC,HIRE_DATEDESC;這里我們進(jìn)行了多列的選擇和排序。排序的優(yōu)先級(jí)由語句中的列名順序所決定。SQL將先對(duì)列出的第一個(gè)列進(jìn)行排序。如果在第一個(gè)列中出現(xiàn)了重復(fù)的行時(shí),這些行將被按照第二列進(jìn)行排序,如果在第二列中又出現(xiàn)了重復(fù)的行時(shí),這些行又將被按照第三列進(jìn)行排序……如此類推。這次查詢的結(jié)果如表5所示。將一個(gè)很長的表中的所有列名寫出來是一件相當(dāng)麻煩的事,所以SQL允許在選擇表中所有的列時(shí)使用*號(hào):SELECT*FROMEMPLOYEES;這次查詢返回整個(gè)EMPLOYEES表,如表1所示。下面我們對(duì)開始時(shí)給出的SELECT語句的語法進(jìn)行一下更新(豎直線表示一個(gè)可選項(xiàng),允許在其中選擇一項(xiàng)。):SELECT[DISTINCT](column[{,columns}])!*FROMtable[{,table}][ORDERBYcolumn[ASC]IDESC[{,column[ASC]IDESC}]];定義選擇標(biāo)準(zhǔn)在我們目前所介紹的SELECT語句中,我們對(duì)結(jié)果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對(duì)SELECT語句進(jìn)行限制使得它只返回希望得到的行:SELECTcolumnsFROMtables[WHEREpredicates];WHERE子句對(duì)條件進(jìn)行了設(shè)置,只有滿足條件的行才被包括到結(jié)果表中。這些條件由斷言(predicate)進(jìn)行指定(斷言指出了關(guān)于某件事情的一種可能的事實(shí))。如果該斷言對(duì)于某個(gè)給定的行成立,該行將被包括到結(jié)果表中,否則該行被忽略。在SQL語句中斷言通常通過比較來表示。例如,假如你需要查詢所有姓為Jones的職員,則可以使用以下SELECT語句:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones';LAST_NAME='Jones'部分就是斷言。在執(zhí)行該語句時(shí),SQL將每一行的LAST_NAME列與“Jones”進(jìn)行比較。如果某一職員的姓為Jones”,即斷言成立,該職員的信息將被包括到結(jié)果表中(見表6)。使用最多的六種比較我們上例中的斷言包括一種基于“等值”的比較(LAST_NAME='Jones'),但是SQL斷言還可以包含其他幾種類型的比較。其中最常用的為:等于=不等于<>小于<大于>小于或等于<=大于或等于>=下面給出了不是基于等值比較的一個(gè)例子:SELECT*FROMEMPLOYEESWHERESALARY>50000;這一查詢將返回年薪高于$50,000.00的職員(參見表7)。邏輯連接符有時(shí)我們需要定義一條不止一種斷言的SELECT語句。舉例來說,如果你僅僅想查看DavyJones的信息的話,表6中的結(jié)果將是不正確的。為了進(jìn)一步定義一個(gè)WHERE子句,用戶可以使用邏輯連接符AND,OR和NOT。為了只得到職員DavyJones的記錄,用戶可以輸入如下語句:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones'ANDFIRST_NAME='Davy';在本例中,我們通過邏輯連接符AND將兩個(gè)斷言連接起來。只有兩個(gè)斷言都滿足時(shí)整個(gè)表達(dá)式才會(huì)滿足。如果用戶需要定義一個(gè)SELECT語句來使得當(dāng)其中任何一項(xiàng)成立就滿足條件時(shí),可以使用OR連接符:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones'ORLAST_NAME='Smith';有時(shí)定義一個(gè)斷言的最好方法是通過相反的描述來說明。如果你想要查看除了Boston辦事處的職員以外的其他所有職員的信息時(shí),你可以進(jìn)行如下的查詢:SELECT*FROMEMPLOYEESWHERENOT(BRANCH_OFFICE='Boston');關(guān)鍵字NOT后面跟著用圓括號(hào)括起來的比較表達(dá)式。其結(jié)果是對(duì)結(jié)果取否定。如果某一職員所在部門的辦事處在Boston,括號(hào)內(nèi)的表達(dá)式返回true,但是NOT操作符將該值取反,所以該行將不被選中。斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進(jìn)行求值,可以用括號(hào)將它們括起來:SELECT*FROMEMPLOYEESWHERE(LAST_NAME='Jones'ANDFIRST_NAME='Indiana')OR(LAST_NAME='Smith'ANDFIRST_NAME='Bessie');SQL沿用數(shù)學(xué)上標(biāo)準(zhǔn)的表達(dá)式求值的約定一圓括號(hào)內(nèi)的表達(dá)式將最先進(jìn)行求值,其他表達(dá)式將從左到右進(jìn)行求值。以上對(duì)邏輯連接符進(jìn)行了說明,在對(duì)下面的內(nèi)容進(jìn)行說明之前,我們?cè)僖淮螌?duì)SELECT語句的語法進(jìn)行更新:SELECT[DISTINCT](column[{,column}])|*FROMtable[{,table}][ORDERBYcolumn[ASC]|[DESC[{,column[ASC]|[DESC}]]WHEREpredicate[{logical-connectorpredicate}];NULL和三值邏輯在SQL中NULL是一個(gè)復(fù)雜的話題,關(guān)于NULL的詳細(xì)描述更適合于在SQL的高級(jí)教程而不是現(xiàn)在的入門教程中進(jìn)行介紹。但由于NULL需要進(jìn)行特殊處理,并且你也很可能會(huì)遇到它,所以我們還是簡略地進(jìn)行一下說明。首先,在斷言中進(jìn)行NULL判斷時(shí)需要特殊的語法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語句:SELECT*FROMEMPLOYEESWHERESALARYISNULL;相反,如果用戶需要所有已知年薪數(shù)據(jù)的職員的信息,你可以使用以下語句:SELECT*FROMEMPLOYEESWHERESALARYISNOTNULL;請(qǐng)注意我們?cè)诹忻笫褂昧岁P(guān)鍵字ISNULL或ISNOTNULL,而不是標(biāo)準(zhǔn)的比較形式:COLUMN=NULL、COLUMN<>NULL或是邏輯操作符NOT(NULL)。這種形式相當(dāng)簡單。但當(dāng)你不明確地測(cè)試NULL(而它們確實(shí)存在)時(shí),事情會(huì)變得很混亂。例如,回過頭來看我們圖1中的EM-PLOYEES表,可以看到IndianaJones的工薪等級(jí)或年薪值都是未知的。這兩個(gè)列都包含NULL??梢韵胂筮\(yùn)行如下的查詢:SELECT*FROMEMPLOYEESWHEREGRADE<=SALARY;此時(shí),IndianaJones應(yīng)該出現(xiàn)在結(jié)果表中。因?yàn)镹ULL都是相等的,所以可以想象它們是能夠通過GRADE小于等于SALARY的檢查的。這其實(shí)是一個(gè)毫無疑義的查詢,但是并沒有關(guān)系。SQL允許進(jìn)行這樣的比較,只要兩個(gè)列都是數(shù)字類型的。然而,IndianaJones并沒有出現(xiàn)在查詢的結(jié)果中,為什么?正如我們?cè)缦忍岬竭^的,NULL表示未知的值(而不是象某些人所想象的那樣表示一個(gè)為NULL的值)。對(duì)于SQL來說意味著這個(gè)值是未知的,而只要這個(gè)值為未知,就不能將其與其他值比較(即使其他值也是NULL)。所以SQL允許除了在true和false之外還有第三種類型的真值,稱之為“非確定”(unknown)值。如果比較的兩邊都是NULL,整個(gè)斷言就被認(rèn)為是非確定的。將一個(gè)非確定斷言取反或使用AND或OR與其他斷言進(jìn)行合并之后,其結(jié)果仍是非確定的。由于結(jié)果表中只包括斷言值為“真”的行,所以NULL不可能滿足該檢查。從而需要使用特殊的操作符ISNULL和ISNOTNULLoUPDATE語句UPDATE語句允許用戶在已知的表中對(duì)現(xiàn)有的行進(jìn)行修改。例如,我們剛剛發(fā)現(xiàn)IndianaJones的等級(jí)為16,工資為$40,000.00,我們可以通過下面的SQL語句對(duì)數(shù)據(jù)庫進(jìn)行更新(并清除那些煩人的NULL)oUPDATEEMPLOYEESSETGRADE=16,SALARY=40000WHEREFIRST_NAME='Indiana'ANDLAST_NAME='Jones';上面的例子說明了一個(gè)單行更新,但是UPDATE語句可以對(duì)多行進(jìn)行操作。滿足WHERE條件的所有行都將被更新。如果,你想讓Boston辦事處中的所有職員搬到NewYork,你可以使用如下語句:UPDATEEMPLOYEESSETBRANCH_OFFICE='NewYork'WHEREBRANCH_OFFICE='Boston';如果忽略WHERE子句,表中所有行中的部門值都將被更新為'NewYork'。UPDATE語句的語法流圖如下面所示:UPDATEtableSETcolumn=value[{,column=value}][WHEREpredicate[{logical-connectorpredicate}]];DELETE語句DELETE語句用來刪除已知表中的行。如同UPDATE語句中一樣,所有滿足WHERE子句中條件的行都將被刪除。由于SQL中沒有UNDO語句或是“你確認(rèn)刪除嗎?”之類的警告,在執(zhí)行這條語句時(shí)千萬要小心。如果決定取消LosAngeles辦事處并解雇辦事處的所有職員,這一卑鄙的工作可以由以下這條語句來實(shí)現(xiàn):DELETEFROMEMPLOYEESWHEREBRANCH_OFFICE='LosAngeles';如同UPDATE語句中一樣,省略WHERE子句將使得操作施加到表中所有的行。DELETE語句的語法流圖如下面所示:DELETEFROMtable[WHEREpredicate[{logical-connectorpredicate}]];
SQL語句集錦--語句功能--數(shù)據(jù)操作SELECT--從數(shù)據(jù)庫表中檢索數(shù)據(jù)行和列INSERT--向數(shù)據(jù)庫表添加新數(shù)據(jù)行DELETE--從數(shù)據(jù)庫表中刪除數(shù)據(jù)行UPDATE--更新數(shù)據(jù)庫表中的數(shù)據(jù)--數(shù)據(jù)定義CREATETABLE--創(chuàng)建一個(gè)數(shù)據(jù)庫表DROPTABLE--從數(shù)據(jù)庫中刪除表ALTERTABLE--修改數(shù)據(jù)庫表結(jié)構(gòu)CREATEVIEW--創(chuàng)建一個(gè)視圖DROPVIEW--從數(shù)據(jù)庫中刪除視圖CREATEINDEX--為數(shù)據(jù)庫表創(chuàng)建一個(gè)索引DROPINDEX--從數(shù)據(jù)庫中刪除索引CREATEPROCEDURE--創(chuàng)建一個(gè)存儲(chǔ)過程DROPPROCEDURE--從數(shù)據(jù)庫中刪除存儲(chǔ)過程CREATETRIGGER--創(chuàng)建一個(gè)觸發(fā)器select@id='10010001'DROPTRIGGER--從數(shù)據(jù)庫中刪除觸發(fā)器CREATESCHEMADROPSCHEMA--向數(shù)據(jù)庫添加一個(gè)新模式--從數(shù)據(jù)庫中刪除一個(gè)模式CREATEDOMAINALTERDOMAIN--創(chuàng)建一個(gè)數(shù)據(jù)值域--改變域定義DROPDOMAIN--從數(shù)據(jù)庫中刪除一個(gè)域--數(shù)據(jù)控制GRANT--授予用戶訪問權(quán)限D(zhuǎn)ENY--拒絕用戶訪問REVOKE--解除用戶訪問權(quán)限--事務(wù)控制COMMIT--結(jié)束當(dāng)前事務(wù)ROLLBACKDROPTRIGGER--從數(shù)據(jù)庫中刪除觸發(fā)器CREATESCHEMADROPSCHEMA--向數(shù)據(jù)庫添加一個(gè)新模式--從數(shù)據(jù)庫中刪除一個(gè)模式CREATEDOMAINALTERDOMAIN--創(chuàng)建一個(gè)數(shù)據(jù)值域--改變域定義DROPDOMAIN--從數(shù)據(jù)庫中刪除一個(gè)域--數(shù)據(jù)控制GRANT--授予用戶訪問權(quán)限D(zhuǎn)ENY--拒絕用戶訪問REVOKE--解除用戶訪問權(quán)限--事務(wù)控制COMMIT--結(jié)束當(dāng)前事務(wù)ROLLBACK--中止當(dāng)前事務(wù)SETTRANSACTION--定義當(dāng)前事務(wù)數(shù)據(jù)訪問特征--程序化SQLDECLARE--為查詢?cè)O(shè)定游標(biāo)EXPLAN--為查詢描述數(shù)據(jù)訪問計(jì)劃OPEN--檢索查詢結(jié)果打開一個(gè)游標(biāo)FETCH--檢索一行查詢結(jié)果CLOSE--關(guān)閉游標(biāo)PREPARE--為動(dòng)態(tài)執(zhí)行準(zhǔn)備SQL語句EXECUTE--動(dòng)態(tài)地執(zhí)行SQL語句DESCRIBE--描述準(zhǔn)備好的查詢---局部變量declare@idchar(10)--set@id='10010001'print'x>y'--打印字符串'x>y'elseif@y>@zprint'y>z'elseprint'z>y'--CASEusepanguupdateemployeesete_wage=casewhenjob_level=’1’thene_wage*1.08whenjob_level=’2’thene_wage*1.07whenjob_level=’3’thene_wage*1.06elsee_wage*1.05end--WHILECONTINUEBREAKdeclare@xint@yint@cintselect@x=1@y=1while@x<3beginprint@x--打印變量x的值while@y<3beginselect@c=100*@x+@yprint@c--打印變量c的值select@y=@y+1endselect@x=@x+1select@y=1end--WAITFOR--例等待1小時(shí)2分零3秒后才執(zhí)行SELECT語句waitfordelay’01:02:03’select*fromemployee--例等到晚上11點(diǎn)零8分后才執(zhí)行SELECT語句waitfortime’23:08:00’select*fromemployee***SELECT***select*(列名)fromtable_name(表名)wherecolumn_nameoperatorvalueex:(宿主)select*fromstock_informationwherestockid=str(nid)stockname='str_name'stocknamelike'%findthis%'stocknamelike'[a-zA-Z]%'([]指定值的范圍)stocknamelike'[AF-M]%'(人排除指定范圍)只能在使用like關(guān)鍵字的where子句中使用通配符)orstockpath='stock_path'orstocknumber<1000andstockindex=24notstocksex='man'stocknumberbetween20and100stocknumberin(10,20,30)orderbystockiddesc(asc)排序,desc-降序,asc-升序orderby1,2by列號(hào)stockname=(selectstocknamefromstock_informationwherestockid=4)子查詢除非能確保內(nèi)層select只返回一個(gè)行的值,否則應(yīng)在外層where子句中用一個(gè)in限定符selectdistinctcolumn_nameformtable_namedistinct指定檢索獨(dú)有的列值,不重復(fù)selectstocknumber,"stocknumber+10"=stocknumber+10fromtable_nameselectstockname,"stocknumber"=count(*)fromtable_namegroupbystocknamegroupby將表按行分組,指定列中有相同的值havingcount(*)=2having選定指定的組select*fromtable1,table2wheretable1.id*=table2.id左外部連接,table1中有的而table2中沒有得以null表示table1.id=*table2.id右外部連接selectstocknamefromtable1union[all]union合并查詢結(jié)果集,all-保留重復(fù)行selectstocknamefromtable2***insert***insertintotable_name(Stock_name,Stock_number)value("xxx","xxxx")value(selectStockname,StocknumberfromStock_table2)---value為select語句***update***updatetable_namesetStockname="xxx"[whereStockid=3]Stockname=defaultStockname=nullStocknumber=Stockname+4***delete***deletefromtable_namewhereStockid=3truncatetable_name刪除表中所有行,仍保持表的完整性droptabletable_name完全刪除表***altertable***---修改數(shù)據(jù)庫表結(jié)構(gòu)altertabledatabase.owner.table_nameaddcolumn_namechar(2)null.....sp_helptable_name——顯示表已有特征createtabletable_name(namechar(20),agesmallint,lnamevarchar(30))insertintotable_nameselect實(shí)現(xiàn)刪除列的方法(創(chuàng)建新表)altertabletable_namedropconstraintStockname_default——?jiǎng)h除Stockname的default約束***function(/*常用函數(shù)*/)***----統(tǒng)計(jì)函數(shù)----AVG--求平均值COUNT--統(tǒng)計(jì)數(shù)目MAX--求最大值MIN--求最小值SUM--求和--AVGusepanguselectavg(e_wage)asdept_avgWagefromemployeegroupbydept_id--MAX--求工資最高的員工姓名usepanguselecte_namefromemployeewheree_wage=(selectmax(e_wage)fromemployee)--STDEV()--STDEV()函數(shù)返回表達(dá)式中所有數(shù)據(jù)的標(biāo)準(zhǔn)差--STDEVP()--STDEVP()函數(shù)返回總體標(biāo)準(zhǔn)差--VAR()--VAR()函數(shù)返回表達(dá)式中所有值的統(tǒng)計(jì)變異數(shù)--VARP()--VARP()函數(shù)返回總體變異數(shù)----算術(shù)函數(shù)----/***三角函數(shù)***/SIN(float_expression)--返回以弧度表示的角的正弦COS(float_expression)--返回以弧度表示的角的余弦TAN(float_expression)--返回以弧度表示的角的正切COT(float_expression)--返回以弧度表示的角的余切/***反三角函數(shù)***/ASIN(float_expression)--返回正弦是FLOAT值的以弧度表示的角ACOS(float_expression)--返回余弦是FLOAT值的以弧度表示的角ATAN(float_expression)-返回正切是FLOAT值的以弧度表示的角ATAN2(float_expression1,float_expression2)--返回正切是float_expression1/float_expres-sion2的以弧度表示的角DEGREES(numeric_expression)--把弧度轉(zhuǎn)換為角度返回與表達(dá)式相同的數(shù)據(jù)類型可為--INTEGER/MONEY/REAL/FLOAT類型RADIANS(numeric_expression)--把角度轉(zhuǎn)換為弧度返回與表達(dá)式相同的數(shù)據(jù)類型可為--INTEGER/MONEY/REAL/FLOAT類型EXP(float_expression)--返回表達(dá)式的指數(shù)值LOG(float_expression)--返回表達(dá)式的自然對(duì)數(shù)值LOG10(float_expression)--返回表達(dá)式的以10為底的對(duì)數(shù)值SQRT(float_expression)--返回表達(dá)式的平方根/***取近似值函數(shù)***/CEILING(numeric_expression)--返回>=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為--INTEGER/MONEY/REAL/FLOAT類型FLOOR(numeric_expression)--返回<=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為--INTEGER/MONEY/REAL/FLOAT類型ROUND(numeric_expression)--返回以integer_expression為精度的四舍五入值返回的數(shù)據(jù)--類型與表達(dá)式相同可為INTEGER/MONEY/REAL/FLOAT類型ABS(numeric_expression)--返回表達(dá)式的絕對(duì)值返回的數(shù)據(jù)類型與表達(dá)式相同可為--INTEGER/MONEY/REAL/FLOAT類型SIGN(numeric_expression)--測(cè)試參數(shù)的正負(fù)號(hào)返回0零值1正數(shù)或-1負(fù)數(shù)返回的數(shù)據(jù)類型--與表達(dá)式相同可為INTEGER/MONEY/REAL/FLOAT類型PI()--返回值為n即3.1415926535897936RAND([integer_expression])--用任選的[integer_expression]做種子值得出0-1間的隨機(jī)浮點(diǎn)數(shù)----字符串函數(shù)----ASCII()--函數(shù)返回字符表達(dá)式最左端字符的ASCII碼值CHAR()--函數(shù)用于將ASCII碼轉(zhuǎn)換為字符--如果沒有輸入0?255之間的ASCII碼值CHAR函數(shù)會(huì)返回一個(gè)NULL值LOWER()--函數(shù)把字符串全部轉(zhuǎn)換為小寫UPPER()--函數(shù)把字符串全部轉(zhuǎn)換為大寫STR()--函數(shù)把數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù)LTRIM()--函數(shù)把字符串頭部的空格去掉RTRIM()--函數(shù)把字符串尾部的空格去掉LEFT(),RIGHT(),SUBSTRING()--函數(shù)返回部分字符串CHARINDEX(),PATINDEX()--函數(shù)返回字符串中某個(gè)指定的子串出現(xiàn)的開始位置SOUNDEX()--函數(shù)返回一個(gè)四位字符碼--SOUNDEX函數(shù)可用來查找聲音相似的字符串但SOUNDEX函數(shù)對(duì)數(shù)字和漢字均只返回0值DIFFERENCE。--函數(shù)返回由SOUNDEX函數(shù)返回的兩個(gè)字符表達(dá)式的值的差異--0兩個(gè)SOUNDEX函數(shù)返回值的第一個(gè)字符不同--1兩個(gè)SOUNDEX函數(shù)返回值的第一個(gè)字符相同--2兩個(gè)SOUNDEX函數(shù)返回值的第一二個(gè)字符相同--3兩個(gè)SOUNDEX函數(shù)返回值的第一二三個(gè)字符相同--4兩個(gè)SOUNDEX函數(shù)返回值完全相同QUOTENAME()--函數(shù)返回被特定字符括起來的字符串/*selectquotename('abc','(')quotename('abc')運(yùn)行結(jié)果如下{{abc}[abc]*/REPLICATE()--函數(shù)返回一個(gè)重復(fù)character_expression指定次數(shù)的字符串/*selectreplicate('abc',3)replicate('abc',-2)運(yùn)行結(jié)果如下abcabcabcNULL*/REVERSE()--函數(shù)將指定的字符串的字符排列順序顛倒REPLACE()--函數(shù)返回被替換了指定子串的字符串/*selectreplace('abc123g','123','def)運(yùn)行結(jié)果如下abcdefg*/SPACE()--函數(shù)返回一個(gè)有指定長度的空白字符串STUFF()--函數(shù)用另一子串替換字符串指定位置長度的子串----數(shù)據(jù)類型轉(zhuǎn)換函數(shù)----CAST()函數(shù)語法如下CAST()(<expression>AS<data_type>[length])CONVERT()函數(shù)語法如下CONVERT()(<data_type>[length],<expression>[,style])selectcast(100+99aschar)convert(varchar(12),getdate())運(yùn)行結(jié)果如下199Jan152000----日期函數(shù)----DAY()--函數(shù)返回date_expression中的日期值MONTH()--函數(shù)返回date_expression中的月份值YEAR()--函數(shù)返回date_expression中的年份值DATEADD(<datepart>,<number>,<date>)--函數(shù)返回指定日期date加上指定的額外日期間隔number產(chǎn)生的新日期DATEDIFF(<datepart>,<number>,<date>)--函數(shù)返回兩個(gè)指定日期在datepart方面的不同之處DATENAME(<datepart>,<date>)--函數(shù)以字符串的形式返回日期的指定部分DATEPART(<datepart>,<date>)--函數(shù)以整數(shù)值的形式返回日期的指定部分GETDATE()--函數(shù)以DATETIME的缺省格式返回系統(tǒng)當(dāng)前的日期和時(shí)間----系統(tǒng)函數(shù)----APP_NAME()--函數(shù)返回當(dāng)前執(zhí)行的應(yīng)用程序的名稱COALESCE()--函數(shù)返回眾多表達(dá)式中第一個(gè)非NULL表達(dá)式的值COL_LENGTH(<'table_name'>,<'column_name'>)--函數(shù)返回表中指定字段的長度值COL_NAME(<table_id>,<column_id>)--函數(shù)返回表中指定字段的名稱即列名DATALENGTH()--函數(shù)返回?cái)?shù)據(jù)表達(dá)式的數(shù)據(jù)的實(shí)際長度DB_ID(['database_name'])--函數(shù)返回?cái)?shù)據(jù)庫的編號(hào)DB_NAME(database_id)--函數(shù)返回?cái)?shù)據(jù)庫的名稱HOST_ID()--函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱HOST_NAME()--函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱IDENTITY(<data_type>[,seedincrement])[AScolumn_name])--IDENTITY()函數(shù)只在SELECTINTO語句中使用用于插入一個(gè)identitycolumn列到新表中/*selectidentity(int,1,1)ascolumn_nameintonewtablefromoldtable*/ISDATE()--函數(shù)判斷所給定的表達(dá)式是否為合理日期ISNULL(<check_expression>,<replacement_value>)--函數(shù)將表達(dá)式中的NULL值用指定值替換ISNUMERIC()--函數(shù)判斷所給定的表達(dá)式是否為合理的數(shù)值NEWID()--函數(shù)返回一個(gè)UNIQUEIDENTIFIER類型的數(shù)值NULLIF(<expression1>,<expression2>)--NULLIF函數(shù)在expression]與expression2相等時(shí)返回NULL值若不相等時(shí)則返回expression1的值主要SQL語句詳解CREATEDATABASEdatabase_name[WITHLOGIN“pathname”]創(chuàng)建數(shù)據(jù)庫。database_name:數(shù)據(jù)庫名稱?!皃athname”:事務(wù)處理日志文件。創(chuàng)建一database_name.dbs目錄,存取權(quán)限由GRANT設(shè)定,無日志文件就不能使用BEGINWORK等事務(wù)語句(可用STARTDATABASE語句來改變)??蛇x定當(dāng)前數(shù)據(jù)庫的日志文件。如:selectdirpathformsystableswheretabtype="L”;例:createdatabsecustomerdbwithlogin"/usr/john/log/customer.log”;DATABASEdatabse-name[EXCLUSIVE]選擇數(shù)據(jù)庫。database_name:數(shù)據(jù)庫名稱。EXCLUSIVE:獨(dú)占狀態(tài)。存取當(dāng)前目錄和DBPATH中指定的目錄下的數(shù)據(jù)庫,事務(wù)中處理過程中不要使用此語句。例:dtabasecustomerdb;CLOSEDATABASE關(guān)閉當(dāng)前數(shù)據(jù)庫。database_name:數(shù)據(jù)庫名稱。此語句之后,只有下列語句合法:CREATEDATABASEDATABASEDROPDATABSE;ROLLFORWARDDATABASE刪除數(shù)據(jù)庫前必須使用此語句。例:closedatabase;DROPDATABASEdat<base_name刪除指定數(shù)據(jù)庫。database_name:數(shù)據(jù)庫名稱。用戶是DBA或所有表的擁有者;刪除所有文件,但不包括數(shù)據(jù)庫目錄;不允許刪除當(dāng)前數(shù)據(jù)庫(須先關(guān)閉當(dāng)前數(shù)據(jù)庫);事務(wù)中處理過程中不能使用此語句,通過ROLLBACKWORK也不可將數(shù)據(jù)庫恢復(fù)。例:dropdatabsecustomerdb;CREATE[TEMP]TABLEtable-name(column_namedatatype[NOTNULL],...)[IN"pathname”]創(chuàng)建表或臨時(shí)表。table-name:表名稱。column_name:字段名稱。data-type:字段數(shù)據(jù)類型。path-name:指定表的存放位置TEMP用于指定建立臨時(shí)表;表名要唯一,字段要唯一;有CONNECT權(quán)限的用戶可建立臨時(shí)表;創(chuàng)建的表缺省允許CONNECT用戶存取,但不可以ALTERo例:createtableuser(c0serialnotnull,c1char(10),c2char(2),c3smallint,c4decimal(6,3),c5date)in“usr/john/customer.dbs/user;ALTERTABLEALTERTABLEtable-name(ADD(newcol_namenewcol_type[BEFOREoldcol_name],...)|DROP(oldcol_name,...)|MODIFY(oldcol_namenewcol_type[NOTNULL],...)},...修改表結(jié)構(gòu)。table-name:表名稱。newcol_name:新字段名稱newcol_type:新字段類型oldcol_name:老字段名稱可以使用單個(gè)或多個(gè)ADD子句、DROP子句、MODIFY子句,但某個(gè)字句失敗,操作即中止;原字段是NULL,不允許MODIFY為NOTNULL,除非所有NULL字段中均非空,反之可以;ALTER使用者是表的擁有者或擁有DBA權(quán)限,或被授權(quán);事務(wù)中處理過程中不要使用此語句。例:altertableuseradd(c6char(20)beforec5);RENAMETABLEoldnameTOnewname修改表名。oldname:原名稱。newname:新名稱。RENAME使用者是表的擁有者或擁有DBA權(quán)限,或被授權(quán);事務(wù)中處理過程中不要使用此語句。例:renameusertobbb;DROPTABLEtable-name刪除表。table-name:表名稱。刪除表意味著刪除其中所有數(shù)據(jù)、各字段上的索引及對(duì)表的賦權(quán)、視圖等;用戶不能刪除任何系統(tǒng)目錄表;語句使用者是表擁有者或擁有DBA權(quán)限,事務(wù)中處理過程中不要使用此語句。RENAMECOLUMNtable.oldcolumn,TOnewcolumn修改字段名。table.oldcolumn:表名及原字段名稱newcolumn:新字段名稱。語句使用者是表的擁有者或擁有DBA權(quán)限或有ALTER權(quán)限的用戶,事務(wù)中處理過程中不要使用此語句。例:renamecolumnuser.c6toc7;CREATEVIEWview-namecolumn-listCREATEVIEWview-namecolumn-listASselect_statement[WITHCHECKOPTION]創(chuàng)建視圖。view-name:視圖名稱。column-list:字段列表。select_statement:SELECT語句。以下語句不使用視圖:ALTERTABLEDROPINDEX,ALTERINDEX,LOCKTABLE,CREATEINDEX,RENAMETABLE;視圖將延用基表的字段名,對(duì)表達(dá)式等虛字段和多表間字段重名必須指明標(biāo)識(shí)其字段名;若對(duì)視圖中某些字段命名,則所有字段都必須命名;視圖中數(shù)據(jù)類型延用基表中的數(shù)據(jù)類型,虛字段起訣于表達(dá)式;不能使用ORDERBY和UNION子句;對(duì)視圖中所有的字段要有SELECT權(quán)限;事務(wù)中處理過程中使用此語句,即使事務(wù)回滾,視圖也將建立,不能恢復(fù)。例:createviewv_userasselect*fromuserwherec1=“B1”;DROPVIEWview-name刪除視圖。view-name:視圖名稱。用戶可刪除自己建立的視圖;視圖的后代視圖也被刪除;事務(wù)中處理中不要使用此語句。例:dropviewv_user;CREATEINDEXCREATE[UNIQUE/DISTINCT][CLUSTER]INDEXindex_nameONtable_name([column_nameASC/DESC],...)創(chuàng)建索引。index_name:索引名稱。table_name:表名稱。column_name:字段名稱。UNIQUE/DISTINCT:唯一索引。CLUSTER:使表的物理存放順序按索引排列。ASC/DESC:升序或降序,缺省升序。語句執(zhí)行時(shí),將表的狀態(tài)置為EXCLUSIVE;復(fù)合索引最多包含8個(gè)字段,所有字段長度和不得大于120字節(jié);事務(wù)中處理過程中使用此語句,即使事務(wù)回滾,索引將建立,不能恢復(fù)。例:createclusterindexix_useronuser(c5);-ALTERINDEXindex-nameTO[NOT]CLUSTER修改索引性質(zhì)。index-name:索引名稱。TO[NOT]CLUSTER:去掉或加上CLUSTER屬性。語句執(zhí)行時(shí),將表的狀態(tài)置為EXCLUSIVE;事務(wù)中處理過程中使用此語句,即使事務(wù)回滾,索引性質(zhì)將改變,不能恢復(fù)。例:alterindexix_usertonotcluster;-DROPINDEXindex-name刪除索引。index-name:索引名稱。語句使用者是索引的擁有者或擁有DBA權(quán)限,事務(wù)中處理過程中不要使用此語句,否則事務(wù)無法恢復(fù)。例:dropindexix_user;CREATESYNONYMsynonymFORtable-name創(chuàng)建同義名。synonym:同義名table-name:表名稱數(shù)據(jù)庫的創(chuàng)建者可以使用同義名;沒有賦予同義名權(quán)限的用戶不能使用同義名;同義名不能和表名相同;事務(wù)中處理過程中不要使用此語句。例:createsynonymuser_aliasforuser;DROPSYNONYMsynonym刪除同義名。synonym:同義名可以刪除自己建立的同義名;事務(wù)中處理過程中不要使用此語句,否則無法恢復(fù)。例:dropsynonymuser_alias;UPDATESTATISTICS[FORTABLEtablename]更新數(shù)據(jù)庫的統(tǒng)計(jì)數(shù)字。table-name:表名稱此語句僅作用于當(dāng)前數(shù)據(jù)庫;可提高查詢效率;只有執(zhí)行此語句,才改變統(tǒng)計(jì)數(shù)據(jù)。例:updatestatisticsfortableuser;GRANT{DBA|RESOURCE|CONNECT}TO{PUBLIC|user-list授權(quán)命令。PUBLIC|user-list:全部或指定的用戶。三種權(quán)限居且僅居其一,事務(wù)處理過程中不要執(zhí)行GRANT語句。例:grantresourcetopulbic;GRANTtab-privilegeONtable-nameTO{PUBLIC|user-list}[WITHGRANTOPTION]授表級(jí)權(quán)限。tab-privilege:表級(jí)權(quán)限。table-name:表名稱。PUBLIC|user-list:全部或指定的用戶。[WITHGRANTOPTION]:表示被授權(quán)用戶有否權(quán)限進(jìn)行二次授權(quán)。用戶可以在自己建立表達(dá)式或被[WITHGRANTOPTION]準(zhǔn)許的表中進(jìn)行賦權(quán);限定越多的權(quán)限優(yōu)先級(jí)越高。例:grantupdate(c1,c6)onusertodickwithgrantoption;附(INFORMIX的權(quán)限)數(shù)據(jù)庫的權(quán)限(控制對(duì)數(shù)據(jù)庫的訪問以及數(shù)據(jù)庫中表的創(chuàng)建和刪除)DBA權(quán)限:全部權(quán)利,修改系統(tǒng)表,建立和刪除表與索引、增加和恢復(fù)表數(shù)據(jù),以及授予其他用戶數(shù)據(jù)庫權(quán)限等;RESOURCE權(quán)限:允許對(duì)數(shù)據(jù)庫表中的數(shù)據(jù)進(jìn)行存取,建立永久性表以及索引。CONNECT權(quán)限:只允許對(duì)數(shù)據(jù)庫表中的數(shù)據(jù)進(jìn)行存取,建立和刪除視圖與臨時(shí)表。表級(jí)權(quán)限(對(duì)表的建立、修改、檢索和更新等權(quán)限)ALTER:更改權(quán)限D(zhuǎn)ELETE:刪除權(quán)限INDEX:索引權(quán)限INSERT:插入權(quán)限SELECT[(cols)]:指定字段或所有字段上的查詢權(quán)限,不指明字段缺省為所有字段。UPDATE[(cols)]:指定字段或所有字段上的更新權(quán)限,不指明字段缺省為所有字段。ALL[PRIVILEGES]:以上所有表級(jí)權(quán)限REVOKE{DBA|RESOURCE|CONNECT}FROM{PUBLIC|user-list}收權(quán)命令。PUBLIC|user-list:全部或指定的用戶。三種權(quán)限居且僅居其一,事務(wù)處理過程中不要執(zhí)行GRANT語句。例:revokeresourcefromjohn;REVOKEtab-privilegeONtable-nameFROM{PUBLIC|user-list}收表級(jí)權(quán)限。tab-privilege:表級(jí)權(quán)限。table-name:表名稱。PUBLIC|user-list:全部或指定的用戶。[WITHGRANTOPTION]:表示被授權(quán)用戶有否權(quán)限進(jìn)行二次授權(quán)。用戶只能取消由其本人賦予其他用戶的表級(jí)存取權(quán)限;不能取消自己的權(quán)限,對(duì)SELECT和UPDATE作取消時(shí),將取消所有表中字段的SELECT和UPDATE權(quán)限。例;revokeupdateonuserfromdick;?LOCKTABLEtable-nameIN{SHARE|EXCLUSIVE}MODE記錄級(jí)加鎖和表級(jí)加鎖或文件加鎖。table-name:表名稱。SHARE:允許讀表中數(shù)據(jù),但不允許作任何修改EXCLUSIVE:禁止其他任何形式訪問表每次只能對(duì)表瑣定一次;事務(wù)處理過程中,BEGINWORK后立即執(zhí)行LOCKTABLE以取代記錄級(jí)加鎖,COMMITWORK和ROLLBACKWORK語句取消所有對(duì)表的加鎖;若沒有事務(wù)處理,鎖將保持到用戶退出或執(zhí)行UNLOCK為止。例:locktableuserinexclusivemode;?UNLOCKTABLEtable-name取消記錄級(jí)加鎖和表級(jí)加鎖或文件加鎖。table-name:表名稱。例:unlockuser;-SETLOCKMODETO[NOT]WAIT改變鎖定狀態(tài)。TO[NOT]:等待解鎖,有可能被死鎖或不等待并提示錯(cuò)誤信息,表示此記錄被鎖,缺省值。訪問一個(gè)EXCLUSIVE狀態(tài)下的記錄,將返回一個(gè)錯(cuò)誤。-STARTDATABSEdb_name[WITHLOGIN“pathname”]啟動(dòng)事務(wù)處理。“pathname”:事務(wù)處理日志文件。執(zhí)行該語句前,需要先關(guān)閉當(dāng)前數(shù)據(jù)庫。例;clostdatabase;startdatabsecustomerwithlogin“/usr/john/log/customer.log”;-BEGINWORK開始事務(wù)。例:beginwork;-COMMITWORK提交(正常結(jié)束)事務(wù)。例:commitwork;-ROLLBACKWORK回滾(非正常結(jié)束)事務(wù)。例:rollbackwork;-SELECTSELECTselect_listFROMtab_name|view_nameWHEREconditionGROUPBYcolumn_nameHAVINGconditionORDERBYcolumn_listINTOTEMPtable_name查詢語句。select_list:選擇表或*tab_name:表名稱view_name:視圖名稱。condition:查詢條件,可使用BETWEEN、IN、LIKE、ISNULL、LIKE、MATCHES、NOT、AND、OR、=、!=或<>、>、>=、<=、<、ALL、ANY、SOMEcolumn_name:分組字段名稱condition:群聚條件column_list:排序字段列表,缺省ASC,可指定DSC;排序時(shí),NULL值小于非零值。table_name:臨時(shí)表名稱例:略附(常用函數(shù))(1)集合函數(shù):count(*)、sum(數(shù)據(jù)項(xiàng)/表達(dá)式)、avg(數(shù)據(jù)項(xiàng)/表達(dá)式)、max(數(shù)據(jù)項(xiàng)/表達(dá)式)、min(數(shù)據(jù)項(xiàng)/表達(dá)式)count(distinct數(shù)據(jù)項(xiàng)/表達(dá)式)、sum(distinct數(shù)據(jù)項(xiàng)/表達(dá)式)、avg(distinct數(shù)據(jù)項(xiàng)/表達(dá)式)(2)代數(shù)函數(shù)和三角函數(shù)HEX(數(shù)據(jù)項(xiàng)/表達(dá)式)、ROUND(數(shù)據(jù)項(xiàng)/表達(dá)式)、TRUNC(數(shù)據(jù)項(xiàng)/表達(dá)式)、TAN(數(shù)據(jù)項(xiàng)/表達(dá)式)、ABS(數(shù)據(jù)項(xiàng)/表達(dá)式)、MOD(被除數(shù),除數(shù))統(tǒng)計(jì)函數(shù)標(biāo)準(zhǔn)差,stdev()、方差,variance()、范圍,rang()時(shí)間函數(shù)DAY(日期/時(shí)間表達(dá)式):返回?cái)?shù)字型MONTH(日期/時(shí)間表達(dá)式):返回整數(shù)WEEKDAY^期/時(shí)間表達(dá)式):06,0星期天,1星期一;返回整數(shù)YEAR(日期/時(shí)間表達(dá)式)、返回整數(shù)DATE(非日期表達(dá)式):返回日期型EXTEND(日期/時(shí)間表達(dá)式,[第一個(gè)至最后一個(gè)]):返回指定的整數(shù)MDY(月,日,年):返回日期型CURRENT:返回日期型時(shí)間函數(shù)ROUND(),四舍五入。如:ROUND(10.95,position)position進(jìn)行四舍五入的前一位置TRUNC(),截取。如:TRUNC(10.95,0)position截取的位置INFORMIX臨時(shí)表在下列情況下自動(dòng)取消:人.退出數(shù)據(jù)庫訪問工具(如DBACCESS)SQL通話結(jié)束(DISCONNECT)發(fā)出取消表語句。.退出程序時(shí)INSERTINSERTINTOview_nameltable_name[(column_list)]VALUES(value_list)或INSERTINTOview_nameltable_name[(column_list)]select_statement插入數(shù)據(jù)view_nameltable_name:視圖名或表名稱column_list:數(shù)據(jù)項(xiàng)列表。value_list:值列表select_statement:查詢語句。例:略DELETEFROMview_nameltable_nameWHEREsearch-conditions刪除語句。view_nameltable_name:視圖名或表名稱search-conditions;刪除條件例:略UPDATEUPDATEview_nameltable_nameSETcolumn_1=value_1istWHEREsearch_conditions或UPDATEview_nameltable_nameSETcolumn_1l*=value_1istWHEREsearch_conditions更新數(shù)據(jù)語句。view_nameltable_name:表名稱或視圖表名稱value_1ist:字段值search_conditions:更新數(shù)據(jù)的條件例:略31.CHECKTABLEtable-name檢查索引語句。語句使用者是表的擁有者或擁有DBA權(quán)限;不能對(duì)systable使用此語句。例:略REPAIRTABLEtable-name修復(fù)索引。語句使用者是表的擁有者或擁有DBA權(quán)限;不能對(duì)systable使用此語句。例:略LOADFROM“file-name”INSERTINTOtable_name[(column_name[,...])]將文本數(shù)據(jù)栽入表中。例:loadfOrm“aa.txt''insertintouser;UNLOADTO“pathname”將表中數(shù)據(jù)卸為文本。例:unloadto“aa.txt”select*fromuser;INFO系統(tǒng)信息查詢。INFOTABLES:得到當(dāng)前數(shù)據(jù)庫上表的名字。INFOcolumnsFORtable_name:指定表上的字段信息。INFOINDEXESFORtable_name:指定表上的索引信息。INFO[ACCESS|PRIVILEGES]FORtable_name:指定表上的存取權(quán)限。INFOSTATUSFORtable_name指定表的狀態(tài)信息。例:infotables;SQL查詢語句使用一、簡單查詢簡單的Transact-SQL查詢只包括選擇列表、FROM子句和WHERE子句。它們分別說明所查詢列、查詢的表或視圖、以及搜索條件等。例如,下面的語句查詢testtable表中姓名為“張三”的nickname字段和email字段。SELECTnickname,emailFROMtesttableWHEREname=張三'選擇列表選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號(hào)、表達(dá)式、變量(包括局部變量和全局變量)等構(gòu)成。1、選擇所有列例如,下面語句顯示testtable表中所有列的數(shù)據(jù):SELECT*FROMtesttable2、選擇部分列并指定它們的顯示次序查詢結(jié)果集合中數(shù)據(jù)的排列順序與選擇列表中所指定的列名排列順序相同。例如:SELECTnickname,emailFROMtesttable3、更改列標(biāo)題在選擇列表中,可重新指定列標(biāo)題。定義格式為:列標(biāo)題=列名列名列標(biāo)題如果指定的列標(biāo)題不是標(biāo)準(zhǔn)的標(biāo)識(shí)符格式時(shí),應(yīng)使用引號(hào)定界符。例如,下列語句使用漢字顯示列標(biāo)題:SELECT昵稱=nickname,電子郵件=emailFROMtesttable4、刪除重復(fù)行SELECT語句中使用ALL或DISTINCT選項(xiàng)來顯示表中符合條件的所有行或刪除其中重復(fù)的數(shù)據(jù)行,默認(rèn)為ALL。使用DISTINCT選項(xiàng)時(shí),對(duì)于所有重復(fù)的數(shù)據(jù)行在SELECT返回的結(jié)果集合中只保留一行。5、限制返回的行數(shù)使用TOPn[PERCENT]選項(xiàng)限制返回的數(shù)據(jù)行數(shù),TOPn說明返回n行,而TOPnPERCENT時(shí),說明n是表示一百分?jǐn)?shù),指定返回的行數(shù)等于總行數(shù)的百分之幾。例如:SELECTTOP2*FROMtesttableSELECTTOP20PERCENT*FROMtesttable(二)FROM子句FROM子句指定SELECT語句查詢及與查詢相關(guān)的表或視圖。在FROM子句中最多可指定256個(gè)表或視圖,它們之間用逗號(hào)分隔。在FROM子句同時(shí)指定多個(gè)表或視圖時(shí),如果選擇列表中存在同名列,這時(shí)應(yīng)使用對(duì)象名限定這些列所屬的表或視圖。例如在usertable和citytable表中同時(shí)存在cityid列,在查詢兩個(gè)表中的cityid時(shí)應(yīng)使用下面語句格式加以限定:SELECTusername,citytable.cityidFROMusertable,citytableWHEREusertable.cityid=citytable.cityid在FROM子句中可用以下兩種格式為表或視圖指定別名:表名as別名表名別名例如上面語句可用表的別名格式表示為:SELECTusername,b.cityidFROMusertablea,citytablebWHEREa.cityid=b.cityidSELECT不僅能從表或視圖中檢索數(shù)據(jù),它還能夠從其它查詢語句所返回的結(jié)果集合中查詢數(shù)據(jù)。例如:SELECTa.au_fname+a.au_lnameFROMauthorsa,titleauthorta(SELECTtitle_id,titleFROMtitlesWHEREytd_sales>10000)AStWHEREa.au_id=ta.au_idANDta.title_id=t.title_id此例中,將SELECT返回的結(jié)果集合給予一別名t,然后再從中檢索數(shù)據(jù)。(三)使用WHERE子句設(shè)置查詢條件WHERE子句設(shè)置查詢條件,過濾掉不需要的數(shù)據(jù)行。例如下面語句查詢年齡大于20的數(shù)據(jù):SELECT*FROMusertableWHEREage>20WHERE子句可包括各種條件運(yùn)算符:比較運(yùn)算符(大小比較):>、>=、=、<、<=、<>、!>、!<范圍運(yùn)算符(表達(dá)式值是否在指定的范圍):BETWEEN...AND...NOTBETWEEN...AND...列表運(yùn)算符(判斷表達(dá)式是否為列表中的指定項(xiàng)):IN(項(xiàng)1,項(xiàng)2......)NOTIN(項(xiàng)1,項(xiàng)2)模式匹配符(判斷值是否與指定的字符通配格式相符):LIKE>NOTLIKE空值判斷符(判斷表達(dá)式是否為空):ISNULL、NOTISNULL邏輯運(yùn)算符(用于多條件的邏輯連接):NOT、AND、OR1、范圍運(yùn)算符例:ageBETWEEN10AND30相當(dāng)于age>=10ANDage<=302、列表運(yùn)算符例:countryIN('Germany','China')3、模式匹配符例:常用于模糊查找,它判斷列值是否與指定的字符串格式相匹配??捎糜赾har、varchar、text、ntext、datetime和smalldatetime等類型查詢。可使用以下通配字符:百分號(hào)%:可匹配任意類型和長度的字符,如果是中文,請(qǐng)使用兩個(gè)百分號(hào)即%%。下劃線_:匹配單個(gè)任意字符,它常用來限制表達(dá)式的字符長度。方括號(hào)[]:指定一個(gè)字符、字符串或范圍,要求所匹配對(duì)象為它們中的任一個(gè)。[人]:其取值也[]相同,但它要求所匹配對(duì)象為指定字符以外的任一個(gè)字符。例如:限制以Publishing結(jié)尾,使用LIKE'%Publishing'限制以A開頭:LIKE'[A]%'限制以A開頭外:LIKE'[AA]%'4、空值判斷符例WHEREageISNULL5、邏輯運(yùn)算符:優(yōu)先級(jí)為NOT、AND、OR(四)查詢結(jié)果排序使用ORDERBY子句對(duì)查詢返回的結(jié)果按一列或多列排序。ORDERBY子句的語法格式為:ORDERBY{column_name[ASC|DESC])[,...n]其中ASC表示升序,為默認(rèn)值,DESC為降序。ORDERBY不能按ntext、text和image數(shù)據(jù)類型進(jìn)行排序。例如:SELECT*FROMusertableORDERBYagedesc,useridASC另外,可以根據(jù)表達(dá)式進(jìn)行排序。二、聯(lián)合查詢UNION運(yùn)算符可以將兩個(gè)或兩個(gè)以上上SELECT語句的查詢結(jié)果集合合并成一個(gè)結(jié)果集合顯示,即執(zhí)行聯(lián)合查詢。UNION的語法格式為:select_statementUNION[ALL]selectstatement[UNION[ALL]selectstatement][...n]其中selectstatement為待聯(lián)合的SELECT查詢語句。ALL選項(xiàng)表示將所有行合并到結(jié)果集合中。不指定該項(xiàng)時(shí),被聯(lián)合查詢結(jié)果集合中的重復(fù)行將只保留一行。聯(lián)合查詢時(shí),查詢結(jié)果的列標(biāo)題為第一個(gè)查詢語句的列標(biāo)題。因此,要定義列標(biāo)題必須在第一個(gè)查詢語句中定義。要對(duì)聯(lián)合查詢結(jié)果排序時(shí),也必須使用第一查詢語句中的列名、列標(biāo)題或者列序號(hào)。在使用UNION運(yùn)算符時(shí),應(yīng)保證每個(gè)聯(lián)合查詢語句的選擇列表中有相同數(shù)量的表達(dá)式,并且每個(gè)查詢選擇表達(dá)式應(yīng)具有相同的數(shù)據(jù)類型,或是可以自動(dòng)將它們轉(zhuǎn)換為相同的數(shù)據(jù)類型。在自動(dòng)轉(zhuǎn)換時(shí),對(duì)于數(shù)值類型,系統(tǒng)將低精度的數(shù)據(jù)類型轉(zhuǎn)換為高精度的數(shù)據(jù)類型。在包括多個(gè)查詢的UNION語句中,其執(zhí)行順序是自左至右,使用括號(hào)可以改變這一執(zhí)行順序。例如:查詢1UNION(查詢2UNION查詢3)三、連接查詢通過連接運(yùn)算符可以實(shí)現(xiàn)多個(gè)表查詢。連接是關(guān)系數(shù)據(jù)庫模型的主要特點(diǎn),也是它區(qū)別于其它類型數(shù)據(jù)庫管理系統(tǒng)的一個(gè)標(biāo)志。在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,表建立時(shí)各數(shù)據(jù)之間的關(guān)系不必確定,常把一個(gè)實(shí)體的所有信息存放在一個(gè)表中。當(dāng)檢索數(shù)據(jù)時(shí),通過連接操作查詢出存放在多個(gè)表中的不同實(shí)體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時(shí)候增加新的數(shù)據(jù)類型。為不同實(shí)體創(chuàng)建新的表,爾后通過連接進(jìn)行查詢。連接可以在SELECT語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時(shí)有助于將連接操作與WHERE子句中的搜索條件區(qū)分開來。所以,在Transact-SQL中推薦使用這種方法。SQL-92標(biāo)準(zhǔn)所定義的FROM子句的連接語法格式為:FROMjoin_tablejoin_typejoin_table[ON(join_condition)]其中join_table指出參與連接操作的表名,連接可以對(duì)同一個(gè)表操作,也可以對(duì)多表操作,對(duì)同一個(gè)表操作的連接又稱做自連接。join_type指出連接類型,可分為三種:內(nèi)連接、外連接和交叉連接。內(nèi)連接(INNERJOIN)使用比較運(yùn)算符進(jìn)行表間某(些)列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)據(jù)行。根據(jù)所使用的比較方式不同,內(nèi)連接又分為等值連接、自然連接和不等連接三種。外連接分為左外連接(LEFTOUTERJOIN或LEFTJOIN)、右外連接(RIGHTOUTERJOIN或RIGHTJOIN)和全外連接(FULLOUTERJOIN或FULLJOIN)三種。與內(nèi)連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)表(全外連接時(shí))中所有符合搜索條件的數(shù)據(jù)行。交叉連接(CROSSJOIN)沒有WHERE子句,它返回連接表中所有數(shù)據(jù)行的笛卡爾積,其結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。連接操作中的ON(join_condition)子句指出連接條件,它由被連接表中的列和比較運(yùn)算符、邏輯運(yùn)算符等構(gòu)成。無論哪種連接都不能對(duì)text、ntext和image數(shù)據(jù)類型列進(jìn)行直接連接,但可以對(duì)這三種列進(jìn)行間接連接。例如:SELECTp1.pub_id,p2.pub_id,p1.pr_infoFROMpub_infoASp1INNERJOINpub_infoASp2ONDATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)(一)內(nèi)連接內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行,它使用比較運(yùn)算符比較被連接列的列值。內(nèi)連接分三種:1、等值連接:在連接條件中使用等于號(hào)(=)運(yùn)算符比較被連接列的列值,其查詢結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)列。2、不等連接:在連接條件使用除等于運(yùn)算符以外的其它比較運(yùn)算符比較被連接的列的列值。這些運(yùn)算符包括〉、>=、<=、<、?。?、?。己停迹?。3、自然連接:在連接條件中使用等于(=)運(yùn)算符比較被連接列的列值,但它使用選擇列表指出查詢結(jié)果集合中所包括的列,并刪除連接表中的重復(fù)列。例,下面使用等值連接列出authors和publishers表中位于同一城市的作者和出版社:SELECT*FROMauthorsASaINNERJOINpublishersASpONa.city=p.city又如使用自然連接,在選擇列表中刪除authors和publishers表中重復(fù)列(city和state):SELECTa.*,p.pub_id,p.pub_name,p.countryFROMauthorsASaINNERJOINpublishersASpONa.city=p.city外連接內(nèi)連接時(shí),返回查詢結(jié)果集合中的僅是符合查詢條件(WHERE搜索條件或HAVING條件)和連接條件的行。而采用外連接時(shí),它返回到查詢結(jié)果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)邊接表(全外連接)中的所有數(shù)據(jù)行。如下面使用左外連接將論壇內(nèi)容和作者信息連接起來:SELECTa.*,b.*FROMluntanLEFTJOINusertableasbONa.username=b.username下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:SELECTa.*,b.*FROMcityasaFULLOUTERJOINuserasbONa.username=b.username(三)交叉連接交叉連接不帶WHERE子句,它返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數(shù)將等于6*8=48行。SELECTtype,pub_nameFROMtitlesCROSSJOINpublishersORDERBYtype跟我學(xué)SQLSQL(StructuredQueryLanguage,結(jié)構(gòu)查詢語言)是一個(gè)功能強(qiáng)大的數(shù)據(jù)庫語言。SQL通常使用于數(shù)據(jù)庫的通訊。ANSI(美國國家標(biāo)準(zhǔn)學(xué)會(huì))聲稱,SQL是關(guān)系數(shù)據(jù)庫管理系統(tǒng)的標(biāo)準(zhǔn)語言。SQL語句通常用于完成一些數(shù)據(jù)庫的操作任務(wù),比如在數(shù)據(jù)庫中更新數(shù)據(jù),或者從數(shù)據(jù)庫中檢索數(shù)據(jù)。使用SQL的常見關(guān)系數(shù)據(jù)庫管理系統(tǒng)有:Oracle、Sybase>MicrosoftSQLServer、
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度地下管線探測(cè)與測(cè)繪分包合同精準(zhǔn)實(shí)施范本3篇
- 2025年水泥編織袋市場(chǎng)拓展與品牌戰(zhàn)略合作框架協(xié)議3篇
- 2025年度制片人知識(shí)產(chǎn)權(quán)聘用合同規(guī)范
- 二零二五年度倉儲(chǔ)用地租賃合同簡易范本3篇
- 二零二五年度農(nóng)行電子商務(wù)平臺(tái)技術(shù)支持與維護(hù)合同
- 2025年離婚協(xié)議簽訂時(shí)效與婚姻解除后續(xù)子女監(jiān)護(hù)權(quán)協(xié)議合同3篇
- 二零二五版廢輪胎膠粉回收及橡膠制品生產(chǎn)合同3篇
- 二零二五年度品牌酒店用品采購合同
- 2025年度智能城市建設(shè)項(xiàng)目承包協(xié)議書4篇
- 二零二五年度倉儲(chǔ)服務(wù)與倉儲(chǔ)設(shè)備租賃合同模板3篇
- JTG∕T E61-2014 公路路面技術(shù)狀況自動(dòng)化檢測(cè)規(guī)程
- 高中英語短語大全(打印版)
- 2024年資格考試-對(duì)外漢語教師資格證筆試參考題庫含答案
- 軟件研發(fā)安全管理制度
- 三位數(shù)除以兩位數(shù)-豎式運(yùn)算300題
- 寺院消防安全培訓(xùn)課件
- 比摩阻-管徑-流量計(jì)算公式
- GB/T 42430-2023血液、尿液中乙醇、甲醇、正丙醇、丙酮、異丙醇和正丁醇檢驗(yàn)
- 五年級(jí)數(shù)學(xué)應(yīng)用題100道
- 西方經(jīng)濟(jì)學(xué)(第二版)完整整套課件(馬工程)
- GB/T 33688-2017選煤磁選設(shè)備工藝效果評(píng)定方法
評(píng)論
0/150
提交評(píng)論