SQL-入門新手教程(重要)_第1頁
SQL-入門新手教程(重要)_第2頁
SQL-入門新手教程(重要)_第3頁
SQL-入門新手教程(重要)_第4頁
SQL-入門新手教程(重要)_第5頁
已閱讀5頁,還剩158頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

/SQL是用于訪問和處理數據庫的標準的計算機語言。什么是SQL?SQL指結構化查詢語言SQL使我們有能力訪問數據庫SQL是一種ANSI的標準計算機語言編者注:ANSI,美國國家標準化組織SQL能做什么?SQL面向數據庫執行查詢SQL可從數據庫取回數據SQL可在數據庫中插入新的紀錄SQL可更新數據庫中的數據SQL可從數據庫刪除記錄SQL可創建新數據庫SQL可在數據庫中創建新表SQL可在數據庫中創建存儲過程SQL可在數據庫中創建視圖SQL可以設置表、存儲過程和視圖的權限SQL是一種標準-但是...SQL是一門ANSI的標準計算機語言,用來訪問和操作數據庫系統。SQL語句用于取回和更新數據庫中的數據。SQL可與數據庫程序協同工作,比如MSAccess、DB2、Informix、MSSQLServer、Oracle、Sybase以和其他數據庫系統。不幸地是,存在著很多不同版本的SQL語言,但是為了與ANSI標準相兼容,它們必須以相似的方式共同地來支持一些主要的關鍵詞(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等)。注釋:除了SQL標準之外,大部分SQL數據庫程序都擁有它們自己的私有擴展!在您的網站中使用SQL要創建發布數據庫中數據的網站,您需要以下要素:RDBMS數據庫程序(比如MSAccess,SQLServer,MySQL)服務器端腳本語言(比如PHP或ASP)SQLHTML/CSSRDBMSRDBMS指的是關系型數據庫管理系統。RDBMS是SQL的基礎,同樣也是所有現代數據庫系統的基礎,比如MSSQLServer,IBMDB2,Oracle,MySQL以和MicrosoftAccess。RDBMS中的數據存儲在被稱為表(tables)的數據庫對象中。表是相關的數據項的集合,它由列和行組成。SQL語法數據庫表一個數據庫通常包含一個或多個表。每個表由一個名字標識(例如“客戶”或者“訂單”)。表包含帶有數據的記錄(行)。下面的例子是一個名為"Persons"的表:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing上面的表包含三條記錄(每一條對應一個人)和五個列(Id、姓、名、地址和城市)。SQL語句您需要在數據庫上執行的大部分工作都由SQL語句完成。下面的語句從表中選取LastName列的數據:SELECTLastNameFROMPersons在本教程中,我們將為您講解各種不同的SQL語句。重要事項一定要記住,SQL對大小寫不敏感!SQL語句后面的分號?某些數據庫系統要求在每條SQL命令的末端使用分號。在我們的教程中不使用分號。分號是在數據庫系統中分隔每條SQL語句的標準方法,這樣就可以在對服務器的相同請求中執行一條以上的語句。如果您使用的是MSAccess和SQLServer2000,則不必在每條SQL語句之后使用分號,不過某些數據庫軟件要求必須使用分號。SQLDML和DDL可以把SQL分為兩個部分:數據操作語言(DML)和數據定義語言(DDL)。SQL(結構化查詢語言)是用于執行查詢的語法。但是SQL語言也包含用于更新、插入和刪除記錄的語法。查詢和更新指令構成了SQL的DML部分:SELECT-從數據庫表中獲取數據UPDATE-更新數據庫表中的數據DELETE-從數據庫表中刪除數據INSERTINTO-向數據庫表中插入數據SQL的數據定義語言(DDL)部分使我們有能力創建或刪除表格。我們也可以定義索引(鍵),規定表之間的鏈接,以和施加表間的約束。SQL中最重要的DDL語句:CREATEDATABASE-創建新數據庫ALTERDATABASE-修改數據庫CREATETABLE-創建新表ALTERTABLE-變更(改變)數據庫表DROPTABLE-刪除表CREATEINDEX-創建索引(搜索SQLSELECT語句本章講解SELECT和SELECT*語句。SQLSELECT語句SELECT語句用于從表中選取數據。結果被存儲在一個結果表中(稱為結果集)。SQLSELECT語法SELECT列名稱FROM表名稱以和:SELECT*FROM表名稱注釋:SQL語句對大小寫不敏感。SELECT等效于select。SQLSELECT實例如需獲取名為"LastName"和"FirstName"的列的內容(從名為"Persons"的數據庫表),請使用類似這樣的SELECT語句:SELECTLastName,FirstNameFROMPersons"Persons"表:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing結果:LastNameFirstNameAdamsJohnBushGeorgeCarterThomasSQLSELECT*實例現在我們希望從"Persons"表中選取所有的列。請使用符號*取代列的名稱,就像這樣:SELECT*FROMPersons提示:星號(*)是選取所有列的快捷方式。結果:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing在結果集(result-set)中導航由SQL查詢程序獲得的結果被存放在一個結果集中。大多數數據庫軟件系統都允許使用編程函數在結果集中進行導航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record等等。類似這些編程函數不在本教程講解之列。如需學習通過函數調用訪問數據的知識,請訪問我們的\o"ADO教程"ADO教程和\o"PHP教程"PHP教程。SQLSELECTDISTINCT語句本章講解SELECTDISTINCT語句。SQLSELECTDISTINCT語句在表中,可能會包含重復值。這并不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。關鍵詞DISTINCT用于返回唯一不同的值。語法:SELECTDISTINCT列名稱FROM表名稱使用DISTINCT關鍵詞如果要從"Company"列中選取所有的值,我們需要使用SELECT語句:SELECTCompanyFROMOrders"Orders"表:CompanyOrderNumberIBM3532W3School2356Apple4698W3School6953結果:CompanyIBMW3SchoolAppleW3School請注意,在結果集中,W3School被列出了兩次。如需從Company"列中僅選取唯一不同的值,我們需要使用SELECTDISTINCT語句:SELECTDISTINCTCompanyFROMOrders結果:CompanyIBMW3SchoolApple現在,在結果集中,"W3School"僅被列出了一次。SQLWHERE子句WHERE子句用于規定選擇的標準。WHERE子句如需有條件地從表中選取數據,可將WHERE子句添加到SELECT語句。語法SELECT列名稱FROM表名稱WHERE列運算符值下面的運算符可在WHERE子句中使用:操作符描述=等于<>不等于>大于<小于>=大于等于<=小于等于BETWEEN在某個范圍內LIKE搜索某種模式注釋:在某些版本的SQL中,操作符<>可以寫為!=。使用WHERE子句如果只希望選取居住在城市"Beijing"中的人,我們需要向SELECT語句添加WHERE子句:SELECT*FROMPersonsWHERECity='Beijing'"Persons"表LastNameFirstNameAddressCityYearAdamsJohnOxfordStreetLondon1970BushGeorgeFifthAvenueNewYork1975CarterThomasChanganStreetBeijing1980GatesBillXuanwumen10Beijing1985結果:LastNameFirstNameAddressCityYearCarterThomasChanganStreetBeijing1980GatesBillXuanwumen10Beijing1985引號的使用請注意,我們在例子中的條件值周圍使用的是單引號。SQL使用單引號來環繞文本值(大部分數據庫系統也接受雙引號)。如果是數值,請不要使用引號。文本值:這是正確的:SELECT*FROMPersonsWHEREFirstName='Bush'這是錯誤的:SELECT*FROMPersonsWHEREFirstName=Bush數值:這是正確的:SELECT*FROMPersonsWHEREYear>1965這是錯誤的:SELECT*FROMPersonsWHEREYear>'1965'SQLAND&OR運算符AND和OR運算符用于基于一個以上的條件對記錄進行過濾。AND和OR運算符AND和OR可在WHERE子語句中把兩個或多個條件結合起來。如果第一個條件和第二個條件都成立,則AND運算符顯示一條記錄。如果第一個條件和第二個條件中只要有一個成立,則OR運算符顯示一條記錄。原始的表(用在例子中的):LastNameFirstNameAddressCityAdamsJohnOxfordStreetLondonBushGeorgeFifthAvenueNewYorkCarterThomasChanganStreetBeijingCarterWilliamXuanwumen10BeijingAND運算符實例使用AND來顯示所有姓為"Carter"并且名為"Thomas"的人:SELECT*FROMPersonsWHEREFirstName='Thomas'ANDLastName='Carter'結果:LastNameFirstNameAddressCityCarterThomasChanganStreetBeijingOR運算符實例使用OR來顯示所有姓為"Carter"或者名為"Thomas"的人:SELECT*FROMPersonsWHEREfirstname='Thomas'ORlastname='Carter'結果:LastNameFirstNameAddressCityCarterThomasChanganStreetBeijingCarterWilliamXuanwumen10Beijing結合AND和OR運算符我們也可以把AND和OR結合起來(使用圓括號來組成復雜的表達式):SELECT*FROMPersonsWHERE(FirstName='Thomas'ORFirstName='William')ANDLastName='Carter'結果:LastNameFirstNameAddressCityCarterThomasChanganStreetBeijingCarterWilliamXuanwumen10BeijingSQLORDERBY子句ORDERBY語句用于對結果集進行排序。ORDERBY語句ORDERBY語句用于根據指定的列對結果集進行排序。ORDERBY語句默認按照升序對記錄進行排序。如果您希望按照降序對記錄進行排序,可以使用DESC關鍵字。原始的表(用在例子中的):Orders表:CompanyOrderNumberIBM3532W3School2356Apple4698W3School6953實例1以字母順序顯示公司名稱:SELECTCompany,OrderNumberFROMOrdersORDERBYCompany結果:CompanyOrderNumberApple4698IBM3532W3School6953W3School2356實例2以字母順序顯示公司名稱(Company),并以數字順序顯示順序號(OrderNumber):SELECTCompany,OrderNumberFROMOrdersORDERBYCompany,OrderNumber結果:CompanyOrderNumberApple4698IBM3532W3School2356W3School6953實例3以逆字母順序顯示公司名稱:SELECTCompany,OrderNumberFROMOrdersORDERBYCompanyDESC結果:CompanyOrderNumberW3School6953W3School2356IBM3532Apple4698實例4以逆字母順序顯示公司名稱,并以數字順序顯示順序號:SELECTCompany,OrderNumberFROMOrdersORDERBYCompanyDESC,OrderNumberASC結果:CompanyOrderNumberW3School2356W3School6953IBM3532Apple4698注意:在以上的結果中有兩個相等的公司名稱(W3School)。只有這一次,在第一列中有相同的值時,第二列是以升序排列的。如果第一列中有些值為nulls時,情況也是這樣的。SQLINSERTINTO語句INSERTINTO語句INSERTINTO語句用于向表格中插入新的行。語法INSERTINTO表名稱VALUES(值1,值2,)我們也可以指定所要插入數據的列:INSERTINTOtable_name(列1,列2,...)VALUES(值1,值2,)插入新的行"Persons"表:LastNameFirstNameAddressCityCarterThomasChanganStreetBeijingSQL語句:INSERTINTOPersonsVALUES('Gates','Bill','Xuanwumen10','Beijing')結果:LastNameFirstNameAddressCityCarterThomasChanganStreetBeijingGatesBillXuanwumen10Beijing在指定的列中插入數據"Persons"表:LastNameFirstNameAddressCityCarterThomasChanganStreetBeijingGatesBillXuanwumen10BeijingSQL語句:INSERTINTOPersons(LastName,Address)VALUES('Wilson','Champs-Elysees')結果:LastNameFirstNameAddressCityCarterThomasChanganStreetBeijingGatesBillXuanwumen10BeijingWilson

Champs-Elysees

SQLUPDATE語句Update語句Update語句用于修改表中的數據。語法:UPDATE表名稱SET列名稱=新值WHERE列名稱=某值Person:LastNameFirstNameAddressCityGatesBillXuanwumen10BeijingWilson

Champs-Elysees

更新某一行中的一個列我們為lastname是"Wilson"的人添加firstname:UPDATEPersonSETFirstName='Fred'WHERELastName='Wilson'結果:LastNameFirstNameAddressCityGatesBillXuanwumen10BeijingWilsonFredChamps-Elysees

更新某一行中的若干列我們會修改地址(address),并添加城市名稱(city):UPDATEPersonSETAddress='Zhongshan23',City='Nanjing'WHERELastName='Wilson'結果:LastNameFirstNameAddressCityGatesBillXuanwumen10BeijingWilsonFredZhongshan23NanjingSQLDELETE語句DELETE語句DELETE語句用于刪除表中的行。語法DELETEFROM表名稱WHERE列名稱=值Person:LastNameFirstNameAddressCityGatesBillXuanwumen10BeijingWilsonFredZhongshan23Nanjing刪除某行"FredWilson"會被刪除:DELETEFROMPersonWHERELastName='Wilson'結果:LastNameFirstNameAddressCityGatesBillXuanwumen10Beijing刪除所有行可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的:DELETEFROMtable_name或者:DELETE*FROMtable_nameSQL高級SQLTOP子句TOP子句TOP子句用于規定要返回的記錄的數目。對于擁有數千條記錄的大型表來說,TOP子句是非常有用的。注釋:并非所有的數據庫系統都支持TOP子句。SQLServer的語法:SELECTTOPnumber|percentcolumn_name(s)FROMtable_nameMySQL和Oracle中的SQLSELECTTOP是等價的MySQL語法SELECTcolumn_name(s)FROMtable_nameLIMITnumber例子SELECT*FROMPersonsLIMIT5Oracle語法SELECTcolumn_name(s)FROMtable_nameWHEREROWNUM<=number例子SELECT*FROMPersonsWHEREROWNUM<=5原始的表(用在例子中的):Persons表:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing4ObamaBarackPennsylvaniaAvenueWashingtonSQLTOP實例現在,我們希望從上面的"Persons"表中選取頭兩條記錄。我們可以使用下面的SELECT語句:SELECTTOP2*FROMPersons結果:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYorkSQLTOPPERCENT實例現在,我們希望從上面的"Persons"表中選取50%的記錄。我們可以使用下面的SELECT語句:SELECTTOP50PERCENT*FROMPersons結果:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYorkSQLLIKE操作符LIKE操作符用于在WHERE子句中搜索列中的指定模式。LIKE操作符LIKE操作符用于在WHERE子句中搜索列中的指定模式。SQLLIKE操作符語法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameLIKEpattern原始的表(用在例子中的):Persons表:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijingLIKE操作符實例例子1現在,我們希望從上面的"Persons"表中選取居住在以"N"開始的城市里的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERECityLIKE'N%'提示:"%"可用于定義通配符(模式中缺少的字母)。結果集:IdLastNameFirstNameAddressCity2BushGeorgeFifthAvenueNewYork例子2接下來,我們希望從"Persons"表中選取居住在以"g"結尾的城市里的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERECityLIKE'%g'結果集:IdLastNameFirstNameAddressCity3CarterThomasChanganStreetBeijing例子3接下來,我們希望從"Persons"表中選取居住在包含"lon"的城市里的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERECityLIKE'%lon%'結果集:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon例子4通過使用NOT關鍵字,我們可以從"Persons"表中選取居住在不包含"lon"的城市里的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERECityNOTLIKE'%lon%'結果集:IdLastNameFirstNameAddressCity2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijingSQL通配符在搜索數據庫中的數據時,您可以使用SQL通配符。SQL通配符在搜索數據庫中的數據時,SQL通配符可以替代一個或多個字符。SQL通配符必須與LIKE運算符一起使用。在SQL中,可使用以下通配符:通配符描述%替代一個或多個字符_僅替代一個字符[charlist]字符列中的任何單一字符[^charlist]或者[!charlist]不在字符列中的任何單一字符原始的表(用在例子中的):Persons表:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing使用%通配符例子1現在,我們希望從上面的"Persons"表中選取居住在以"Ne"開始的城市里的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERECityLIKE'Ne%'結果集:IdLastNameFirstNameAddressCity2BushGeorgeFifthAvenueNewYork例子2接下來,我們希望從"Persons"表中選取居住在包含"lond"的城市里的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERECityLIKE'%lond%'結果集:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon使用_通配符例子1現在,我們希望從上面的"Persons"表中選取名字的第一個字符之后是"eorge"的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHEREFirstNameLIKE'_eorge'結果集:IdLastNameFirstNameAddressCity2BushGeorgeFifthAvenueNewYork例子2接下來,我們希望從"Persons"表中選取的這條記錄的姓氏以"C"開頭,然后是一個任意字符,然后是"r",然后是任意字符,然后是"er":我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERELastNameLIKE'C_r_er'結果集:IdLastNameFirstNameAddressCity3CarterThomasChanganStreetBeijing使用[charlist]通配符例子1現在,我們希望從上面的"Persons"表中選取居住的城市以"A"或"L"或"N"開頭的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERECityLIKE'[ALN]%'結果集:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork例子2現在,我們希望從上面的"Persons"表中選取居住的城市不以"A"或"L"或"N"開頭的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERECityLIKE'[!ALN]%'結果集:IdLastNameFirstNameAddressCity3CarterThomasChanganStreetBeijingSQLIN操作符IN操作符IN操作符允許我們在WHERE子句中規定多個值。SQLIN語法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameIN(value1,value2,...)原始的表(在實例中使用:)Persons表:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijingIN操作符實例現在,我們希望從上表中選取姓氏為Adams和Carter的人:我們可以使用下面的SELECT語句:SELECT*FROMPersonsWHERELastNameIN('Adams','Carter')結果集:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon3CarterThomasChanganStreetBeijingSQLBETWEEN操作符BETWEEN操作符在WHERE子句中使用,作用是選取介于兩個值之間的數據范圍。BETWEEN操作符操作符BETWEEN...AND會選取介于兩個值之間的數據范圍。這些值可以是數值、文本或者日期。SQLBETWEEN語法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameBETWEENvalue1ANDvalue2原始的表(在實例中使用:)Persons表:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing4GatesBillXuanwumen10BeijingBETWEEN操作符實例如需以字母順序顯示介于"Adams"(包括)和"Carter"(不包括)之間的人,請使用下面的SQL:SELECT*FROMPersonsWHERELastNameBETWEEN'Adams'AND'Carter'結果集:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork重要事項:不同的數據庫對BETWEEN...AND操作符的處理方式是有差異的。某些數據庫會列出介于"Adams"和"Carter"之間的人,但不包括"Adams"和"Carter";某些數據庫會列出介于"Adams"和"Carter"之間并包括"Adams"和"Carter"的人;而另一些數據庫會列出介于"Adams"和"Carter"之間的人,包括"Adams",但不包括"Carter"。所以,請檢查你的數據庫是如何處理BETWEENAND操作符的!實例2如需使用上面的例子顯示范圍之外的人,請使用NOT操作符:SELECT*FROMPersonsWHERELastNameNOTBETWEEN'Adams'AND'Carter'結果集:IdLastNameFirstNameAddressCity3CarterThomasChanganStreetBeijing4GatesBillXuanwumen10BeijingSQLAlias(別名)通過使用SQL,可以為列名稱和表名稱指定別名(Alias)。SQLAlias表的SQLAlias語法SELECTcolumn_name(s)FROMtable_nameASalias_name列的SQLAlias語法SELECTcolumn_nameASalias_nameFROMtable_nameAlias實例:使用表名稱別名假設我們有兩個表分別是:"Persons"和"Product_Orders"。我們分別為它們指定別名"p"和"po"。現在,我們希望列出"JohnAdams"的所有定單。我們可以使用下面的SELECT語句:SELECTpo.OrderID,p.LastName,p.FirstNameFROMPersonsASp,Product_OrdersASpoWHEREp.LastName='Adams'WHEREp.FirstName='John'不使用別名的SELECT語句:SELECTProduct_Orders.OrderID,Persons.LastName,Persons.FirstNameFROMPersons,Product_OrdersWHEREPersons.LastName='Hansen'WHEREPersons.FirstName='Ola'從上面兩條SELECT語句您可以看到,別名使查詢程序更易閱讀和書寫。Alias實例:使用一個列名別名表Persons:IdLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijingSQL:SELECTLastNameASFamily,FirstNameFROMPersons結果:FamilyNameAdamsJohnBushGeorgeCarterThomasSQLJOINSQLjoin用于根據兩個或多個表中的列之間的關系,從這些表中查詢數據。Join和Key有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果。我們就需要執行join。數據庫中的表可通過鍵將彼此聯系起來。主鍵(PrimaryKey)是一個列,在這個列中的每一行的值都是唯一的。在表中,每個主鍵的值都是唯一的。這樣做的目的是在不重復每個表中的所有數據的情況下,把表間的數據交叉捆綁在一起。請看"Persons"表:Id_PLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing請注意,"Id_P"列是Persons表中的的主鍵。這意味著沒有兩行能夠擁有相同的Id_P。即使兩個人的姓名完全相同,Id_P也可以區分他們。接下來請看"Orders"表:Id_OOrderNoId_P177895324467833224561424562153476465請注意,"Id_O"列是Orders表中的的主鍵,同時,"Orders"表中的"Id_P"列用于引用"Persons"表中的人,而無需使用他們的確切姓名。請留意,"Id_P"列把上面的兩個表聯系了起來。引用兩個表我們可以通過引用兩個表的方式,從兩個表中獲取數據:誰訂購了產品,并且他們訂購了什么產品?SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersons,OrdersWHEREPersons.Id_P=Orders.Id_P結果集:LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678SQLJOIN-使用Join除了上面的方法,我們也可以使用關鍵詞JOIN來從兩個表中獲取數據。如果我們希望列出所有人的定購,可以使用下面的SELECT語句:SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsINNERJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName結果集:LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678不同的SQLJOIN除了我們在上面的例子中使用的INNERJOIN(內連接),我們還可以其他幾種連接。下面列出了您可以使用的JOIN類型,以和它們之間的差異。JOIN:如果表中有至少一個匹配,則返回行LEFTJOIN:即使右表中沒有匹配,也從左表返回所有的行RIGHTJOIN:即使左表中沒有匹配,也從右表返回所有的行FULLJOIN:只要其中一個表中存在匹配,就返回行SQLINNERJOIN關鍵字SQLINNERJOIN關鍵字在表中存在至少一個匹配時,INNERJOIN關鍵字返回行。INNERJOIN關鍵字語法SELECTcolumn_name(s)FROMtable_name1INNERJOINtable_name2ONtable_name1.column_name=table_name2.column_name注釋:INNERJOIN與JOIN是相同的。原始的表(用在例子中的):"Persons"表:Id_PLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing"Orders"表:Id_OOrderNoId_P177895324467833224561424562153476465內連接(INNERJOIN)實例現在,我們希望列出所有人的定購。您可以使用下面的SELECT語句:SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsINNERJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName結果集:LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678INNERJOIN關鍵字在表中存在至少一個匹配時返回行。如果"Persons"中的行在"Orders"中沒有匹配,就不會列出這些行。SQLLEFTJOIN關鍵字SQLLEFTJOIN關鍵字LEFTJOIN關鍵字會從左表(table_name1)那里返回所有的行,即使在右表(table_name2)中沒有匹配的行。LEFTJOIN關鍵字語法SELECTcolumn_name(s)FROMtable_name1LEFTJOINtable_name2ONtable_name1.column_name=table_name2.column_name注釋:在某些數據庫中,LEFTJOIN稱為LEFTOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_PLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing"Orders"表:Id_OOrderNoId_P177895324467833224561424562153476465左連接(LEFTJOIN)實例現在,我們希望列出所有的人,以和他們的定購-如果有的話。您可以使用下面的SELECT語句:SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsLEFTJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName結果集:LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678BushGeorge

LEFTJOIN關鍵字會從左表(Persons)那里返回所有的行,即使在右表(Orders)中沒有匹配的行。SQLRIGHTJOIN關鍵字SQLRIGHTJOIN關鍵字RIGHTJOIN關鍵字會右表(table_name2)那里返回所有的行,即使在左表(table_name1)中沒有匹配的行。RIGHTJOIN關鍵字語法SELECTcolumn_name(s)FROMtable_name1RIGHTJOINtable_name2ONtable_name1.column_name=table_name2.column_name注釋:在某些數據庫中,RIGHTJOIN稱為RIGHTOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_PLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing"Orders"表:Id_OOrderNoId_P177895324467833224561424562153476465右連接(RIGHTJOIN)實例現在,我們希望列出所有的定單,以和定購它們的人-如果有的話。您可以使用下面的SELECT語句:SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsRIGHTJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName結果集:LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678

34764RIGHTJOIN關鍵字會從右表(Orders)那里返回所有的行,即使在左表(Persons)中沒有匹配的行。SQLFULLJOIN關鍵字SQLFULLJOIN關鍵字只要其中某個表存在匹配,FULLJOIN關鍵字就會返回行。FULLJOIN關鍵字語法SELECTcolumn_name(s)FROMtable_name1FULLJOINtable_name2ONtable_name1.column_name=table_name2.column_name注釋:在某些數據庫中,FULLJOIN稱為FULLOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_PLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing"Orders"表:Id_OOrderNoId_P177895324467833224561424562153476465全連接(FULLJOIN)實例現在,我們希望列出所有的人,以和他們的定單,以和所有的定單,以和定購它們的人。您可以使用下面的SELECT語句:SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsFULLJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName結果集:LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678BushGeorge

34764FULLJOIN關鍵字會從左表(Persons)和右表(Orders)那里返回所有的行。如果"Persons"中的行在表"Orders"中沒有匹配,或者如果"Orders"中的行在表"Persons"中沒有匹配,這些行同樣會列出。SQLUNION和UNIONALL操作符SQLUNION操作符UNION操作符用于合并兩個或多個SELECT語句的結果集。請注意,UNION內部的SELECT語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條SELECT語句中的列的順序必須相同。SQLUNION語法SELECTcolumn_name(s)FROMtable_name1UNIONSELECTcolumn_name(s)FROMtable_name2注釋:默認地,UNION操作符選取不同的值。如果允許重復的值,請使用UNIONALL。SQLUNIONALL語法SELECTcolumn_name(s)FROMtable_name1UNIONALLSELECTcolumn_name(s)FROMtable_name2另外,UNION結果集中的列名總是等于UNION中第一個SELECT語句中的列名。下面的例子中使用的原始表:Employees_China:E_IDE_Name01Zhang,Hua02Wang,Wei03Carter,Thomas04Yang,MingEmployees_USA:E_IDE_Name01Adams,John02Bush,George03Carter,Thomas04Gates,Bill使用UNION命令實例列出所有在中國和美國的不同的雇員名:SELECTE_NameFROMEmployees_ChinaUNIONSELECTE_NameFROMEmployees_USA結果E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingAdams,JohnBush,GeorgeGates,Bill注釋:這個命令無法列出在中國和美國的所有雇員。在上面的例子中,我們有兩個名字相同的雇員,他們當中只有一個人被列出來了。UNION命令只會選取不同的值。UNIONALLUNIONALL命令和UNION命令幾乎是等效的,不過UNIONALL命令會列出所有的值。SQLStatement1UNIONALLSQLStatement2使用UNIONALL命令實例:列出在中國和美國的所有的雇員:SELECTE_NameFROMEmployees_ChinaUNIONALLSELECTE_NameFROMEmployees_USA結果E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingAdams,JohnBush,GeorgeCarter,ThomasGates,BillSQLSELECTINTO語句SQLSELECTINTO語句可用于創建表的備份復件。SELECTINTO語句SELECTINTO語句從一個表中選取數據,然后把數據插入另一個表中。SELECTINTO語句常用于創建表的備份復件或者用于對記錄進行存檔。SQLSELECTINTO語法您可以把所有的列插入新表:SELECT*INTOnew_table_name[INexternaldatabase]FROMold_tablename或者只把希望的列插入新表:SELECTcolumn_name(s)INTOnew_table_name[INexternaldatabase]FROMold_tablenameSQLSELECTINTO實例-制作備份復件下面的例子會制作"Persons"表的備份復件:SELECT*INTOPersons_backupFROMPersonsIN子句可用于向另一個數據庫中拷貝表:SELECT*INTOPersonsIN'Backup.mdb'FROMPersons如果我們希望拷貝某些域,可以在SELECT語句后列出這些域:SELECTLastName,FirstNameINTOPersons_backupFROMPersonsSQLSELECTINTO實例-帶有WHERE子句我們也可以添加WHERE子句。下面的例子通過從"Persons"表中提取居住在"Beijing"的人的信息,創建了一個帶有兩個列的名為"Persons_backup"的表:SELECTLastName,FirstnameINTOPersons_backupFROMPersonsWHERECity='Beijing'SQLSELECTINTO實例-被連接的表從一個以上的表中選取數據也是可以做到的。下面的例子會創建一個名為"Persons_Order_Backup"的新表,其中包含了從Persons和Orders兩個表中取得的信息:SELECTPersons.LastName,Orders.OrderNoINTOPersons_Order_BackupFROMPersonsINNERJOINOrdersONPersons.Id_P=Orders.Id_PSQLCREATEDATABASE語句CREATEDATABASE語句CREATEDATABASE用于創建數據庫。SQLCREATEDATABASE語法CREATEDATABASEdatabase_nameSQLCREATEDATABASE實例現在我們希望創建一個名為"my_db"的數據庫。我們使用下面的CREATEDATABASE語句:CREATEDATABASEmy_db可以通過CREATETABLE來添加數據庫表。SQLCREATETABLE語句CREATETABLE語句CREATETABLE語句用于創建數據庫中的表。SQLCREATETABLE語法CREATETABLE表名稱(列名稱1數據類型,列名稱2數據類型,列名稱3數據類型,)數據類型(data_type)規定了列可容納何種數據類型。下面的表格包含了SQL中最常用的數據類型:數據類型描述integer(size)int(size)smallint(size)tinyint(size)僅容納整數。在括號內規定數字的最大位數。decimal(size,d)numeric(size,d)容納帶有小數的數字。"size"規定數字的最大位數。"d"規定小數點右側的最大位數。char(size)容納固定長度的字符串(可容納字母、數字以和特殊字符)。在括號中規定字符串的長度。varchar(size)容納可變長度的字符串(可容納字母、數字以和特殊的字符)。在括號中規定字符串的最大長度。date(yyyymmdd)容納日期。SQLCREATETABLE實例本例演示如何創建名為"Person"的表。該表包含5個列,列名分別是:"Id_P"、"LastName"、"FirstName"、"Address"以和"City":CREATETABLEPersons(Id_Pint,LastNamevarchar(255),FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))Id_P列的數據類型是int,包含整數。其余4列的數據類型是varchar,最大長度為255個字符。空的"Persons"表類似這樣:Id_PLastNameFirstNameAddressCity

可使用INSERTINTO語句向空表寫入數據。SQL約束(Constraints)SQL約束約束用于限制加入表的數據的類型。可以在創建表時規定約束(通過CREATETABLE語句),或者在表創建之后也可以(通過ALTERTABLE語句)。我們將主要探討以下幾種約束:NOTNULLUNIQUEPRIMARYKEYFOREIGNKEYCHECKDEFAULT注釋:在下面的章節,我們會詳細講解每一種約束。SQLNOTNULL約束SQLNOTNULL約束NOTNULL約束強制列不接受NULL值。NOTNULL約束強制字段始終包含值。這意味著,如果不向字段添加值,就無法插入新紀錄或者更新記錄。下面的SQL語句強制"Id_P"列和"LastName"列不接受NULL值:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))SQLUNIQUE約束SQLUNIQUE約束UNIQUE約束唯一標識數據庫表中的每條記錄。UNIQUE和PRIMARYKEY約束均為列或列集合提供了唯一性的保證。PRIMARYKEY擁有自動定義的UNIQUE約束。請注意,每個表可以有多個UNIQUE約束,但是每個表只能有一個PRIMARYKEY約束。SQLUNIQUEConstraintonCREATETABLE下面的SQL在"Persons"表創建時在"Id_P"列創建UNIQUE約束:MySQL:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),UNIQUE(Id_P))SQLServer/Oracle/MSAccess:CREATETABLEPersons(Id_PintNOTNULLUNIQUE,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))如果需要命名UNIQUE約束,以和為多個列定義UNIQUE約束,請使用下面的SQL語法:MySQL/SQLServer/Oracle/MSAccess:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),CONSTRAINTuc_PersonIDUNIQUE(Id_P,LastName))撤銷UNIQUE約束如需撤銷UNIQUE約束,請使用下面的SQL:MySQL:ALTERTABLEPersonsDROPINDEXuc_PersonIDSQLServer/Oracle/MSAccess:ALTERTABLEPersonsDROPCONSTRAINTuc_PersonIDSQLPRIMARYKEY約束SQLPRIMARYKEY約束PRIMARYKEY約束唯一標識數據庫表中的每條記錄。主鍵必須包含唯一的值。主鍵列不能包含NULL值。每個表應該都一個主鍵,并且每個表只能有一個主鍵。SQLPRIMARYKEYConstraintonCREATETABLE下面的SQL在"Persons"表創建時在"Id_P"列創建PRIMARYKEY約束:MySQL:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),PRIMARYKEY(Id_P))SQLServer/Oracle/MSAccess:CREATETABLEPersons(Id_PintNOTNULLPRIMARYKEY,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))如果需要命名PRIMARYKEY約束,以和為多個列定義PRIMARYKEY約束,請使用下面的SQL語法:MySQL/SQLServer/Oracle/MSAccess:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),CONSTRAINTuc_PersonIDPRIMARYKEY(Id_P,LastName))SQLPRIMARYKEYConstraintonALTERTABLE如果在表已存在的情況下為"Id_P"列創建PRIMARYKEY約束,請使用下面的SQL:MySQL/SQLServer/Oracle/MSAccess:ALTERTABLEPersonsADDPRIMARYKEY(Id_P)如果需要命名PRIMARYKEY約束,以和為多個列定義PRIMARYKEY約束,請使用下面的SQL語法:MySQL/SQLServer/Oracle/MSAccess:ALTERTABLEPersonsADDCONSTRAINTpk_PersonIDPRIMARYKEY(Id_P,LastName)注釋:如果您使用ALTERTABLE語句添加主鍵,必須把主鍵列聲明為不包含NULL值(在表首次創建時)。撤銷PRIMARYKEY約束如需撤銷PRIMARYKEY約束,請使用下面的SQL:MySQL:ALTERTABLEPersonsDROPPRIMARYKEYSQLServer/Oracle/MSAccess:ALTERTABLEPersonsDROPCONSTRAINTpk_PersonIDSQLFOREIGNKEY約束SQLFOREIGNKEY約束一個表中的FOREIGNKEY指向另一個表中的PRIMARYKEY。讓我們通過一個例子來解釋外鍵。請看下面兩個表:"Persons"表:Id_PLastNameFirstNameAddressCity1AdamsJohnOxfordStreetLondon2BushGeorgeFifthAvenueNewYork3CarterThomasChanganStreetBeijing"Orders"表:Id_OOrderNoId_P1778953244678332245614245621請注意,"Orders"中的"Id_P"列指向"Persons"表中的"Id_P"列。"Persons"表中的"Id_P"列是"Persons"表中的PRIMARYKEY。"Orders"表中的"Id_P"列是"Orders"表中的FOREIGNKEY。FOREIGNKEY約束用于預防破壞表之間連接的動作。FOREIGNKEY約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。SQLFOREIGNKEYConstraintonCREATETABLE下面的SQL在"Orders"表創建時為"Id_P"列創建FOREIGNKEY:MySQL:CREATETABLEOrders(O_IdintNOTNULL,OrderNointNOTNULL,Id_Pint,PRIMARYKEY(O_Id),FOREIGNKEY(Id_P)REFERENCESPersons(Id_P))SQLServer/Oracle/MSAccess:CREATETABLEOrders(O_IdintNOTNULLPRIMARYKEY,OrderNointNOTNULL,Id_PintFOREIGNKEYREFERENCESPersons(Id_P))如果需要命名FOREIGNKEY約束,以和為多個列定義FOREIGNKEY約束,請使用下面的SQL語法:MySQL/SQLServer/Oracle/MSAccess:CREATETABLEOrders(O_IdintNOTNULL,OrderNointNOTNULL,Id_Pint,PRIMARYKEY(O_Id),CONSTRAINTfk_PerOrdersFOREIGNKEY(Id_P)REFERENCESPersons(Id_P))SQLFOREIGNKEYConstraintonALTERTABLE如果在"Orders"表已存在的情況下為"Id_P"列創建FOREIGNKEY約束,請使用下面的SQL:MySQL/SQLServer/Oracle/MSAccess:ALTERTABLEOrdersADDFOREIGNKEY(Id_P)REFERENCESPersons(Id_P)如果需要命名FOREIGNKEY約束,以和為多個列定義FOREIGNKEY約束,請使用下面的SQL語法:MySQL/SQLServer/Oracle/MSAccess:ALTERTABLEOrdersADDCONSTRAINTfk_PerOrdersFOREIGNKEY(Id_P)REFERENCESPersons(Id_P)撤銷FOREIGNKEY約束如需撤銷FOREIGNKEY約束,請使用下面的SQL:MySQL:ALTERTABLEOrdersDROPFOREIGNKEYfk_PerOrdersSQLServer/Oracle/MSAccess:ALTERTABLEOrdersDROPCONSTRAINTfk_PerOrdersSQLCHECK約束SQLCHECK約束CHECK約束用于限制列中的值的范圍。如果對單個列定義CHECK約束,那么該列只允許特定的值。如果對一個表定義CHECK約束,那么此約束會在特定的列中對值進行限制。SQLCHECKConstraintonCREATETABLE下面的SQL在"Persons"表創建時為"Id_P"列創建CHECK約束。CHECK約束規定"Id_P"列必須只包含大于0的整數。MySQL:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),CHECK(Id_P>0))SQLServer/Oracle/MSAccess:CREATETABLEPersons(Id_PintNOTNULLCHECK(Id_P>0),LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))如果需要命名CHECK約束,以和為多

溫馨提示

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

評論

0/150

提交評論