![2021SQL應(yīng)用知識(shí)手冊(cè)_第1頁(yè)](http://file4.renrendoc.com/view9/M00/1B/04/wKhkGWdnAJyAQpy8AAAj_RaxpAw763.jpg)
![2021SQL應(yīng)用知識(shí)手冊(cè)_第2頁(yè)](http://file4.renrendoc.com/view9/M00/1B/04/wKhkGWdnAJyAQpy8AAAj_RaxpAw7632.jpg)
![2021SQL應(yīng)用知識(shí)手冊(cè)_第3頁(yè)](http://file4.renrendoc.com/view9/M00/1B/04/wKhkGWdnAJyAQpy8AAAj_RaxpAw7633.jpg)
![2021SQL應(yīng)用知識(shí)手冊(cè)_第4頁(yè)](http://file4.renrendoc.com/view9/M00/1B/04/wKhkGWdnAJyAQpy8AAAj_RaxpAw7634.jpg)
![2021SQL應(yīng)用知識(shí)手冊(cè)_第5頁(yè)](http://file4.renrendoc.com/view9/M00/1B/04/wKhkGWdnAJyAQpy8AAAj_RaxpAw7635.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
錄| 錄|第1課了解 什么是 動(dòng)手實(shí) 第2課檢索數(shù) 限制結(jié) 使用注 第3課排序檢索數(shù) 排序數(shù) 2| 第4課過(guò)濾數(shù) 使用WHERE子 第5課高級(jí)數(shù)據(jù)過(guò) 組合WHERE子 第6課用通配符進(jìn)行過(guò) 第7課創(chuàng)建計(jì)算字 計(jì)算字 拼接字 第8課使用函數(shù)處理數(shù) 使用函 第9課匯總數(shù) 聚集函 錄| 第10課分組數(shù) 數(shù)據(jù)分 創(chuàng)建分 過(guò)濾分 第11課使用子查 子查 利用子查詢進(jìn)行過(guò) 作為計(jì)算字段使用子查 第12課聯(lián)結(jié) 創(chuàng)建聯(lián) 第13課創(chuàng)建高級(jí)聯(lián) 第14課組合查 組合查 4| 第15課插入數(shù) 數(shù)據(jù)插 第16課更新和刪除數(shù) 更新數(shù) 刪除數(shù) 第17課創(chuàng)建和操縱 創(chuàng)建 更新 刪除 重命名 第18課使用視 創(chuàng)建視 第19課使用存儲(chǔ)過(guò) 存儲(chǔ)過(guò) 錄|第20課管理事務(wù)處 事務(wù)處 第21課使用游 使用游 第22課高級(jí)SQL特 觸發(fā) 附錄A樣例表腳 附錄B流行的應(yīng)用程 附錄 附錄 附錄ESQL保留 索 1.1數(shù)據(jù)庫(kù)基礎(chǔ)|1課了解1.1數(shù)據(jù)庫(kù)基礎(chǔ)|后面是一些基本數(shù)據(jù)庫(kù)概念的簡(jiǎn)要介紹。如果你已經(jīng)具有一定的數(shù)據(jù)庫(kù)經(jīng)驗(yàn),可以借此復(fù)習(xí)鞏固一下;如果你剛開(kāi)始接觸數(shù)據(jù)庫(kù),可|1以由此了解必需的基本知識(shí)。理解數(shù)據(jù)庫(kù)概念是掌握以由此了解必需的基本知識(shí)。理解數(shù)據(jù)庫(kù)概念是掌握SQL的重要前提,如果有必要,你或許還應(yīng)該參閱其他一些有關(guān)數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)的書籍。數(shù)據(jù)庫(kù)這個(gè)術(shù)語(yǔ)的用法很多,但就本書而言(SQL的角度來(lái)看,數(shù)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)(DBMS(schema列列4|1網(wǎng)格中每一列存儲(chǔ)著某種特定的信息。例如,在顧客表中,一列存儲(chǔ)顧客編號(hào),另一列存儲(chǔ)顧客姓名,而地址、城市、州以及郵政編碼全都存正確地將數(shù)據(jù)分解為多個(gè)列極為重要。例如,城市、州、郵政編碼應(yīng)該總是彼此獨(dú)立的列。通過(guò)分解這些數(shù)據(jù),才有可能利用特定的列對(duì)數(shù)據(jù)進(jìn)行分類和過(guò)濾(如找出特定州或特定城市的所有顧客。如果城市和州組合在一個(gè)列中,則按州進(jìn)行分類或過(guò)濾就會(huì)很困難。SQLDBMS中具有不同的名稱。對(duì)此用行行(recordIDID或雇主鍵(primary主鍵(primary6|1;SQL(S-Q-Lsequel)是StructuredQueryLanguage(結(jié)構(gòu)化查詢語(yǔ)言)的縮寫。SQL是一種專門用來(lái)與數(shù)據(jù)庫(kù)溝通的語(yǔ)言。與其他語(yǔ)言(Java、C、PHP這樣的編程語(yǔ)言)不一樣,SQL說(shuō)明:SQL說(shuō)明:SQLDBMSSQL進(jìn)行了擴(kuò)展。這種擴(kuò)DBMSANSISQL。各個(gè)實(shí)現(xiàn)有自PL/SQL、Transact-SQL等。SQLANSISQLDBMSSQL語(yǔ)句的應(yīng)用系統(tǒng)。8|1QLA體的樣例表,并介紹了獲得(或創(chuàng)建)它們的詳細(xì)步驟,便于讀者理解B介紹在各種應(yīng)用程序中執(zhí)行QL在進(jìn)入下一課之前,強(qiáng)烈建議讀者先閱讀這兩個(gè)附錄的內(nèi)容,為以后的2.1SELECT| 2.1SELECT|1課所述,SQL語(yǔ)句是由簡(jiǎn)單的英語(yǔ)單詞構(gòu)成的。這些單詞稱為SQLSELECT語(yǔ)句了。它的用途是從一個(gè)或多個(gè)表中檢索關(guān)鍵字關(guān)鍵字A,它解釋了如何下載或創(chuàng)建這些數(shù)據(jù)文件。10|2B中也給出了相應(yīng)的建議。SELECTprod_nameFROMProducts;FishbeanbagtoyBirdbeanbagtoyRabbitbeanbagtoy8inchteddy12inchteddy18inchteddybearRaggedyAnnKingdollQueendoll如上的一條簡(jiǎn)單SELECT語(yǔ)句將返回表中的所有行。數(shù)據(jù)沒(méi)有過(guò)濾(過(guò)SQLSQL提示:SQL語(yǔ)句和大小寫SelectSQLSQL關(guān)鍵SQL是不區(qū)分大小寫的,但是表名、列名和值可能有所不同(DBMS及其如何配置。3種寫法的作用是一樣的。SELECTprod_nameFROMProducts;SELECTprod_nameFROM12|2要想從一個(gè)表中檢索多個(gè)列,仍然使用相同的SELECT語(yǔ)句。唯一的不SELECTprod_id,prod_name,prod_priceFROMProducts;3個(gè)列名,列名之間用逗號(hào)分隔。此語(yǔ)句的 FishbeanbagBirdbeanbagRabbitbeanbag8inchteddy12inchteddy18inchteddyRaggedyKingQueen,SELECTSELECTFROM(*14|2products表中所有產(chǎn)品供ID:SELECTvend_idFROM2.6限制結(jié)果|DISTINCT關(guān)鍵字,顧名思義,它指示數(shù)據(jù)庫(kù)只返回不同SELECTDISTINCTvend_idFROMProducts;SELECTDISTINCTvend_idDBMS只返回不同(具有唯一性)的DISTINCT關(guān)鍵字作用于所有的列,不僅僅是跟在其后的那一列。例SELECTDISTINCTvend_id,prod_price,除非指定的16|2SQL實(shí)現(xiàn)并不相同。SELECTTOP5prod_nameFROMProducts;8inchteddy12inchteddy18inchteddybearFishbeanbagtoyBirdbeanbagtoySELECTTOP55DB2DBMSSQL語(yǔ)SELECTprod_nameFROMProductsFETCHFIRST5ROWSFETCHFIRST5ROWSONLYSELECTprod_nameFROMProductsWHEREROWNUM<=5;SELECTprod_nameFROMProductsLIMIT5;上述代碼使用SELECTLIMIT5指示DBMS5行的數(shù)據(jù)。這個(gè)語(yǔ)句的輸出參見(jiàn)下面的代碼。SELECTprod_nameFROMProductsLIMIT5OFFSET5;MT5FFT5指示SQL等S5行起的5第一個(gè)數(shù)字是指從哪兒開(kāi)始,第二個(gè)數(shù)字是檢索的行數(shù)。這個(gè)語(yǔ)句的輸出是:18|2RabbitbeanbagtoyRaggedyAnnKingdollQueendoll54行數(shù)據(jù)(5行。00提示:MySQLMariaDBSQLSQLSQL語(yǔ)句DBMS(相關(guān)示例可以參見(jiàn)附Bcreate.sqlpopulate.sql)這同樣適用于SQL文件開(kāi)始處的內(nèi)容,它可能包含程序員的聯(lián)系方SQLDBMS將其視為注釋而加以忽略。SELECT FROMCREATETABLE語(yǔ)句中的列就很不錯(cuò)。#這是一條注釋SELECTprod_nameFROMProducts;20|2在一行的開(kāi)始處使用#/*SELECTprod_name,vend_idFROMProducts;*/SELECTprod_nameFROMProducts;常用于給代碼加注釋,就如這個(gè)例子演示的,這里定義了兩個(gè)SELECT3.1排序數(shù)據(jù)|3課3.1排序數(shù)據(jù)|SELECTprod_nameFROMProducts;FishbeanbagtoyBirdbeanbagtoyRabbitbeanbagtoy8inchteddy12inchteddy18inchteddybearRaggedyAnnKingdollQueendoll22|3DBMS重用回SELECTFROM子句。SELECTORDERBY子句。ORDERBY子句取一個(gè)或多個(gè)列的名字,據(jù)此對(duì)輸出進(jìn)行排序。請(qǐng)看下面SELECTprod_nameFROMProductsORDERBY12inchteddy18inchteddy8inchteddybearBirdbeanbagtoyFishbeanbagtoyKingdollQueen注意:ORDERBYORDER注意:ORDERBYORDERBYSELECT語(yǔ)句中最后一通常,ORDERBY子句中使用的列將是為顯示而選擇的列。但是,實(shí)3個(gè)列,并按其中兩個(gè)列對(duì)結(jié)果進(jìn)行排序——首先按價(jià)SELECTprod_id,prod_price,prod_nameFROMProducts24|3ORDERBYprod_price,BirdbeanbagFishbeanbagRabbitbeanbagRaggedy8inchteddy12inchteddyKingQueen18inchteddyprod_name排序。除了能用列名指出排序順序外,ORDERBY還支持按相對(duì)列位置進(jìn)行排SELECTprod_id,prod_price,prod_nameFROMProductsORDERBY2, 3.4指定排序方向|BirdbeanbagFishbeanbagRabbitbeanbagRaggedy8inchteddy12inchteddyKingQueen18inchteddyORDERBY子3prod_priceprod_name進(jìn)行排序。DESC關(guān)鍵字。26|3:SELECTprod_id,prod_price,prod_nameFROMProductsORDERBYprod_price18inchteddyKingQueen12inchteddy8inchteddyRaggedyFishbeanbagBirdbeanbagRabbitbeanbagSELECTprod_id,prod_price,prod_nameFROMProductsORDERBYprod_priceDESC,18inchteddyKingQueen12inchteddy3.4指定排序方向|8inchteddyRaggedyBirdbeanbagFishbeanbagRabbitbeanbagprod_name列(在每個(gè)價(jià)格內(nèi))仍然按標(biāo)準(zhǔn)的升序排序。ASCENDINGASC沒(méi)有多大用處,因?yàn)樯蚴悄J(rèn)的(如果既不指定ASC也不指定DESCASC)。BY子句可能做不到。你必須請(qǐng)求數(shù)據(jù)庫(kù)管理員的幫助。28|3SELECT語(yǔ)句中的最后一條子句。根據(jù)需要,可4.1WHERE|4.1WHERE|數(shù)據(jù)庫(kù)表一般包含大量的數(shù)據(jù),很少需要檢索表中的所有行。通常只會(huì)根據(jù)特定操作或報(bào)告的需要提取表數(shù)據(jù)的子集。只檢索所需數(shù)據(jù)需要指(h(rdo。SELECTprod_name,prod_priceFROMProductsWHEREprod_price=這條語(yǔ)句從products表中檢索兩個(gè)列,但不返回所有行,只返回 30|4Fishbeanbag Birdbeanbag Rabbitbeanbag 過(guò)濾數(shù)據(jù)。不過(guò),SQL不止能測(cè)試等于,還能做更多的事情。3.49、3.490、3.4900DBMS指定了所使用的數(shù)據(jù)類型及畢竟從數(shù)學(xué)角度講,3.493.4900是一樣的。提示:SQL過(guò)濾與應(yīng)用過(guò)濾在同時(shí)使用ORDERBY和WHERE子句時(shí),應(yīng)該讓ORDERBY位于WHERE之后,否則將會(huì)產(chǎn)生錯(cuò)誤(ORDERBY的使用,請(qǐng)參閱3課。4.2WHERE|指定的值。SQL4-1列出的所有條件操作符。表4-1WHERE < IS DBMSDBMS支持哪些操作10美元的產(chǎn)品。SELECTprod_name,prod_priceFROMProductsWHEREprod_price<32|4FishbeanbagBirdbeanbagRabbitbeanbag8inchteddy12inchteddyRaggedyKingQueenSELECTprod_name,prod_priceFROMProductsWHEREprod_price<=SELECTvend_id,prod_nameFROMProductsWHEREvend_id<> 8inchteddy4.2WHERE| 12inchteddy 18inchteddy King QueenSELECTvend_id,prod_nameFROMProductsWHEREvend_id!=DBMS文檔。BETWEENWHERE例如,BETWEEN510美元之間的所有產(chǎn)BETWEEN534|4SELECTprod_name,prod_priceFROMProductsWHEREprod_priceBETWEEN5AND8inchteddy12inchteddyKingQueenNULL。valueISNULL子句。其語(yǔ)法如下:SELECT4.2WHERE|FROMWHEREprod_priceIS這條語(yǔ)句返回所有沒(méi)有價(jià)格(prod_price0)的NULL值:SELECTcust_nameFROMCUSTOMERSWHEREcust_emailISKidsPlaceTheToyStore提示:各提示:各DBMS特有的操作符信息請(qǐng)參閱相應(yīng)的DBMS文檔。NULL值NULL的行確實(shí)出現(xiàn)在返回的36|4SELECTWHERE子句過(guò)濾返回的數(shù)據(jù)。我們學(xué)習(xí)了如何檢驗(yàn)相等、不相等、大于、小于、值的范圍以及NULL5.1WHERE|55.1WHERE|NOTIN操作符。ANDOR子句的方式使用。操作符操作符用來(lái)聯(lián)結(jié)或改變WHEREoperatorSELECTprod_id,prod_price,38|5FROMWHEREvend_id='DLL01'ANDprod_price<=4美元,但不是由指定供應(yīng)商制造的也不被檢SQL語(yǔ)句產(chǎn)生的輸出如下:BirdbeanbagFishbeanbagRabbitbeanbagAND關(guān)鍵字。ORDERBYORDERBYWHERE子句之后。5.1WHERE|SELECTprod_name,prod_priceFROMProductsWHEREvend_id='DLL01'ORvend_id=子句SQL語(yǔ)句產(chǎn)生的輸出如下:FishbeanbagBirdbeanbagRabbitbeanbag8inchteddy12inchteddy18inchteddyRaggedy40|510DLL01或BRS01WHERE子句:SELECTprod_name,prod_priceFROMProductsWHEREvend_id='DLL01'ORvend_id='BRS01'ANDprod_price>=10;FishbeanbagBirdbeanbagRabbitbeanbag18inchteddyRaggedy410美元,顯然,返回的行5.2IN|SELECTprod_name,prod_priceFROMProductsWHERE(vend_id='DLL01'ORvend_id='BRS01')ANDprod_price>=10; 18inchteddy SELECT語(yǔ)句與前一條的唯一差別是,將前兩個(gè)條件用圓括號(hào)括了SQLBRS0110美元及以上的所有產(chǎn)品,這正是我們希望42|5SELECTprod_name,prod_priceFROMProductsWHEREvend_idIN('DLL01','BRS01'ORDERBY12inchteddy18inchteddy8inchteddyBirdbeanbagFishbeanbagRabbitbeanbagRaggedySQL語(yǔ)句完成與上面的例子相同的工作。SELECTprod_name,prod_priceFROMProductsWHEREvend_id='DLL01'ORvend_id='BRS01'ORDERBYprod_name; 5.3NOT|12inchteddy18inchteddy8inchteddyBirdbeanbagFishbeanbagRabbitbeanbagRaggedyIN的最大優(yōu)點(diǎn)是可以包含其他SELECTWHERENOT操作符有且只有一個(gè)功能,那就是否定其后所跟的NOT從不單獨(dú)使用(它總是與其他操作符一起使用44|5SELECTprod_nameFROMProductsWHERENOTvend_id='DLL01'ORDERBYprod_name;12inchteddy18inchteddy8inchteddybearKingdollQueenNOT否定跟在其后的條件,因此,DBMSvend_idSELECTprod_nameFROMProductsWHEREvend_id<>'DLL01'ORDERBYprod_name;12inchteddy18inchteddyinchteddybearKingdollQueen5.4小結(jié)|NOTWHERENOT確實(shí)沒(méi)有什么優(yōu)勢(shì)。但在更復(fù)雜的子句中,NOT是非常有用的。例如,在IN操作符聯(lián)合使用時(shí),NOT可以非常簡(jiǎn)單地找出與條件列表不匹配說(shuō)明:MariaDB說(shuō)明:MariaDBINNOT操作符。46|6646|6LIKE操作符beanbag的所有產(chǎn)品?用簡(jiǎn)單的比較操作符肯定不行,必須使beanbag的所有產(chǎn)品,可以構(gòu)造一個(gè)通配beanbag的產(chǎn)品。搜索模式(searchLIKE|SQL文獻(xiàn)或手冊(cè)中遇到此術(shù)語(yǔ)時(shí)不知所云。百分號(hào)(%)SELECTprod_id,prod_nameFROMProductsWHEREprod_nameLIKE Fishbeanbag此例子使用了搜索模式'Fish%'48|6Fish起頭的詞。%DBMSFish之后的任意字符,不管它有多說(shuō)明:Access說(shuō)明:Access小寫,則'fish%'Fishbeanbagtoy就不匹配。SELECTprod_id,prod_nameFROMProductsWHEREprod_nameLIKE'%bean Fishbeanbag Birdbeanbag Rabbitbeanbag搜索模式'%beanbag%'beanbag的值,F(xiàn)y結(jié)尾的所有產(chǎn)品:6.1LIKE|SELECTprod_nameFROMProductsWHEREprod_nameLIKE地址的一部分來(lái)查找電子郵件,例如WHEREemailLIKE\h需要特別注意,除了能匹配一個(gè)或多個(gè)字符外,%0個(gè)字符。%0個(gè)、1個(gè)或多個(gè)字符。50Fishbeanbagtoy(17個(gè)字符33個(gè)空格。這樣做一般對(duì)數(shù)據(jù)SQLWHEREprod_nameLIKE'F%y'Fyprod_name。yFishbeanbagtoy就8課。WHEREprod_nameLIKENULL50|6(_說(shuō)明:DB2通配符說(shuō)明:DB2通配符說(shuō)明:AccessSELECTprod_id,prod_nameFROMProductsWHEREprod_nameLIKE'inchteddy 12inchteddy 18inchteddy這個(gè)WHERE子句中的搜索模式給出了后面跟有文本的兩個(gè)通配符。結(jié)果只顯示匹配搜索模式的行:第一行中下劃線匹配12,第二行中匹配18。8inchteddybear6.1LIKE|通配符而不是一個(gè)。對(duì)照一下,下面的SELECT語(yǔ)句使用%通配符,返SELECTprod_id,prod_nameFROMProductsWHEREprod_nameLIKE'%inchteddy 8inchteddy 12inchteddy 18inchteddy方括號(hào)()的[]AccessSQLServer支持集合。為確定你使用的DBMS是否支持集合,請(qǐng)參閱相應(yīng)的文檔。SELECT52|6FROMWHEREcust_contactLIKE'[JM]%'ORDERBYcust_contact;JimJonesJohnSmithMichelle此語(yǔ)句的EM因此,任何多于一個(gè)字符的名字都不匹配。]之后的%通配符匹配第:SELECTcust_contactFROMCustomersWHEREcust_contactLIKEORDERBY說(shuō)明:Access說(shuō)明:AccessMicrosoftAccess,需要用!而不是^來(lái)否定一個(gè)集合,因WHERE子句時(shí)可以簡(jiǎn)化語(yǔ)法:6.3小結(jié)|SELECTcust_contactFROMCustomersWHERENOTcust_contactLIKE'[JM]%'ORDERBYcust_contact;正如所見(jiàn),SQL的通配符很有用。但這種功能是有代價(jià)的,即通配符搜在確實(shí)需要使用通配符時(shí),也盡量不要把它們用在搜索模式的開(kāi)始總之,通配符是一種極其重要和有用的搜索工具,以后我們經(jīng)常會(huì)用到它。54|7754|7郵電7.2拼接字段|郵電SELECT語(yǔ)句內(nèi)字段字段SELECT語(yǔ)句中哪些列是實(shí)際的表列,在SQL語(yǔ)句內(nèi)可完成的許多轉(zhuǎn)換和格式化工作都可以直接在客戶端Vendors表包含供應(yīng)商名和地址信息。假如要生成一個(gè)供應(yīng)商報(bào)表,需此報(bào)表需要一個(gè)值,而表中數(shù)據(jù)存儲(chǔ)在兩個(gè)列vend_name和vend_SELECT語(yǔ)句很56|7拼接拼接OpenOfficeBase使用||DBMSSELECTvend_name+'('+vend_country+')'FROMVendorsORDERBYBearEmporiumBearsRUsDollHouseInc.FunandGamesFurballInc.JouetsetSELECTvend_name||'('||vend_country||7.2拼接字段|FROMORDERBYBear BearsR DollHouse Funand Furball Jouetset SELECTConcat(vend_name,'(',vend_country,')')FROMVendorsORDERBY從上述輸出中可以看到,SELECTSELECT語(yǔ)句返回的輸出。結(jié)合成一個(gè)計(jì)算字段的兩個(gè)列用58|7SELECTRTRIM(vend_name)+'('+RTRIM(vend_country)+')'FROMVendorsORDERBYBearEmporium(USA)BearsRUs(USA)DollHouseInc.(USA)FunandGames(England)FurballInc.(USA)Jouetsetours(France)SELECTRTRIM(vend_name)||'('||RTRIM(vend_country)||')'FROMVendorsORDERBYBearEmporium(USA)BearsRUs(USA)DollHouseInc.(USA)FunandGames(England)FurballInc.(USA)Jouetsetours(France)RTRIM()RTRIM(),各個(gè)列都進(jìn)說(shuō)明:TRIM說(shuō)明:TRIM函數(shù)空格、LTRIM()(去掉字符串左邊的空格)TRIM()(去掉字符SQL查詢工具中查看一下結(jié)果,這樣沒(méi)有什么不好。但是,一個(gè)為了解決這個(gè)問(wèn)題,SQL支持列別名。別名(alias)是一個(gè)字段或值的ASSELECT語(yǔ)句:SELECTRTRIM(vend_name)+'('+RTRIM(vend_country)+')'ASvend_titleFROMORDERBYBearEmporium(USA)BearsRUs(USA)DollHouseInc.(USA)FunandGames(England)FurballInc.(USA)Jouetsetours(France)60|7SELECTRTRIM(vend_name)||'('||RTRIM(vend_country)||')'ASvend_titleFROMORDERBYSELECTConcat(vend_name,'(',vend_country,')')ASvend_titleFROMORDERBY本ASvend_title。它指示SQL創(chuàng)建一個(gè)包含指定計(jì)算結(jié)果的名為vend_title的計(jì)算字段。從輸出可以看到,結(jié)果與以前的相同,但現(xiàn)說(shuō)明:AS說(shuō)明:ASDBMS中,AS關(guān)鍵字是可選的,不過(guò)最好使用它,這被視為columnSQL20008中的所有物品:SELECTprod_id,quantity,item_priceFROMOrderItemsWHEREorder_num=item_price列包含訂單中每項(xiàng)物品的單價(jià)。如下匯總物品的價(jià)格(62|7:SELECTquantity*item_priceASexpanded_priceFROMOrderItemsWHEREorder_num=SQL7-1中列出的基本算術(shù)操作符。此外,圓括號(hào)可用來(lái)區(qū)分優(yōu)5課。表7-1SQL abc,SELECTNow();Now()函數(shù)返回當(dāng)前日期和時(shí)間。SELECT語(yǔ)句進(jìn)行檢驗(yàn)。64|8864|8SQL函數(shù)的使用可能會(huì)帶來(lái)問(wèn)題。與大多數(shù)其他計(jì)算機(jī)語(yǔ)言一樣,SQL也可以用函數(shù)來(lái)處理數(shù)據(jù)。函數(shù)一在學(xué)習(xí)這一課并進(jìn)行實(shí)踐之前,你應(yīng)該了解使用SQL函數(shù)所存在的3DBMS中的語(yǔ)法:8.2使用函數(shù)|表8-1DBMS
AccessMID(DB2OraclePostgreSQL和SQLite使用數(shù)據(jù)類型轉(zhuǎn)換Access和Oracle使用多個(gè)函數(shù),每種類型的轉(zhuǎn)換有一個(gè)函數(shù);DB2和PostgreSQL使用CAST();MariaDB、MySQL和SQLServer使用取當(dāng)前日期Access使用NOWDB2和PostgreSQL使用CURRENT_DATE;SQL實(shí)現(xiàn)編寫的代碼在其他實(shí)現(xiàn)中可能不正常。DBMS可以非常有效完成的工作。以便以后你(或其他人)SQL代碼的含義。66|8SELECT后面的列名,但函數(shù)的作用不僅于SQL語(yǔ)句中使用等,后面會(huì)做更多的介紹。SELECTvend_name,UPPER(vend_name)ASvend_name_upcaseFROMVendorsORDERBY Bear BEARBearsR BEARSRDollHouse DOLLHOUSEFunand FUNAND8.2使用函數(shù)|Furball FURBALLJouetset JOUETSETupcase轉(zhuǎn)換為大寫。表8-2 表8-2中的SOUNDEX需要做進(jìn)一步的解釋。SOUNDEX是一個(gè)將任何文本串轉(zhuǎn)換為描述其語(yǔ)音表示的字母數(shù)字模式的算法。SOUNDEX考慮了類似的發(fā)音字符和音節(jié),使得能對(duì)字符串進(jìn)行發(fā)音比較而不是字母比較。雖然SOUNDEX不是SQL概念,但多數(shù)DBMS都提供對(duì)SOUNDEX的支持。MicrosoftAccessPostgreSQLSOUNDEX(),因此以下的例子DBMS。68|8SQLiteSOUNDEX()。KidsPlaceMichelleGreen。但如果這是錯(cuò)誤的輸入,SELECTcust_name,cust_contactFROMCustomersWHEREcust_contact='Michael 現(xiàn)在試一下使用SOUNDEX()函數(shù)進(jìn)行搜索,它匹配所有發(fā)音類似于MichaelGreenSELECTcust_name,cust_contactFROMCustomersWHERESOUNDEX(cust_contact)=SOUNDEX('Michael Kids Michelle8.2使用函數(shù)|和搜索字符串轉(zhuǎn)換為它們的SOUNDEX值。因?yàn)镸ichaelGreen和SELECTorder_numFROMOrdersWHEREDATEPART(yy,order_date)=70|8SELECTorder_numFROMOrdersWHEREDATEPART('yyyy',order_date)=SELECTorder_numFROMOrdersWHEREDATE_PART('year',order_date)=SELECTorder_numFROMOrdersWHEREto_number(to_char(order_date,'YYYY'))=8.2使用函數(shù)|2012進(jìn)行比較。SELECTorder_numFROMOrdersWHEREorder_dateBETWEENto_date('01-01-2012')ANDto_date('12-31-2012');在此例子中,Oracleto_date()函數(shù)用來(lái)將兩個(gè)字符串轉(zhuǎn)換為日期。CONVERT()to_date(),當(dāng)然可以使用這種類型的語(yǔ)句。MySQL和MariaDB具有各種日期處理函數(shù),但沒(méi)有DATEPART()SELECTorder_numFROMOrdersWHEREYEAR(order_date)=SELECT72|8FROMWHEREstrftime('%Y',order_date)=AND操作符可以進(jìn)行年和月份的比較。DBMSDBMS具有比較DBMS的日期DBMS支持的日8-3列出一些常用的數(shù)值處理函數(shù)。表8-3 8.3小結(jié)|ServerOracle之間的差異說(shuō)明了這一點(diǎn)。74|974|9門的函數(shù)。使用這些函數(shù),SQL查詢可用于檢索數(shù)據(jù),以便分析和報(bào)表能進(jìn)行上述檢索。與前一章介紹的數(shù)據(jù)處理函數(shù)不同,SQL的聚集函數(shù)SQL實(shí)現(xiàn)中得到了相當(dāng)一致的支持。聚集函數(shù)(aggregate聚集函數(shù)(aggregate表9-1SQL AVG()Products表中所有產(chǎn)品的平均價(jià)格:SELECTAVG(prod_price)ASavg_priceFROMProducts;7課所述,avg_price是一個(gè)別名。76|9SELECTAVG(prod_price)ASavg_priceFROMProductsWHEREvend_id=AVG()函數(shù)。COUNT()COUNT()確定表中行的數(shù)目或符合特定使用COUNT(*)9.1聚集函數(shù)|Customers表中顧客的總數(shù):SELECTCOUNT(*)ASnum_custFROMCustomers;num_cust中返回。SELECTCOUNT(cust_email)ASnum_custFROMCustomers;78|9(*,則不忽略。SELECTMAX(prod_price)ASmax_priceFROMProducts;DBMS允許將它用來(lái)返回任意列中的最大值,包括返回文本列中的最9.1聚集函數(shù)|SELECTMIN(prod_price)ASmin_priceFROMProducts;DBMS允許將它用來(lái)返回任意列中的最小值,包括返回文本列中的最下面舉一個(gè)例子,OrderItems包含訂單中實(shí)際的物品,每個(gè)物品有相應(yīng)的數(shù)量??扇缦聶z索所訂購(gòu)物品的總數(shù)(quantity值之和:80|9SELECTSUM(quantity)ASitems_orderedFROMOrderItemsWHEREorder_num=SUM也可以用來(lái)合計(jì)計(jì)算值。在下面的例子中,合計(jì)每項(xiàng)物品的SELECTSUM(item_price*quantity)AStotal_priceFROMOrderItemsWHEREorder_num=函數(shù)SUM(item_price*quantity返回訂單中所有物品價(jià)錢之和,ALL。AccessMicrosoftAccessDISTINCT,因此下面的例子不適合于Access。要在Access得到類似的結(jié)果,需要使用子查詢把DISTINCTSELECTCOUNT(*)語(yǔ)句。AVG()函數(shù)返回特定供應(yīng)商提供的產(chǎn)品的平均價(jià)格。它82|9SELECTAVG(DISTINCTprod_price)ASavg_priceFROMProductsWHEREvend_id=DISTINCTCOUNT()。DISTINCT不能用TOPTOPPERCENT。為了解具DBMS支持哪些參數(shù),請(qǐng)參閱相應(yīng)的文檔。9.4小結(jié)|SELECTCOUNT(*)ASnum_items,MIN(prod_price)ASprice_min,MAX(prod_price)ASprice_max,AVG(prod_price)ASprice_avgFROMSELECT44個(gè)值(Products聚集函數(shù)用來(lái)匯總數(shù)據(jù)。SQL5個(gè)聚集函數(shù),可以用多種方法使用84|101084|10這一課介紹如何分組數(shù)據(jù),以便匯總表內(nèi)容的子集。這涉及兩個(gè)新SELECT語(yǔ)句子句:GROUPBYHAVING從上一課得知,使用SQL聚集函數(shù)可以匯總數(shù)據(jù)。這樣,我們就能夠?qū)π羞M(jìn)行計(jì)數(shù),計(jì)算和與平均數(shù),不檢索所有數(shù)據(jù)就獲得最大值和最小值。DLL01提供的產(chǎn)品數(shù)目:SELECTCOUNT(*)ASnum_prodsFROMProductsWHEREvend_id=SELECTvend_id,COUNT(*)ASnum_prodsFROMProductsGROUPBYSELECT語(yǔ)句指定了兩個(gè)列:vend_idID,num_prods為計(jì)算字段(COUNT(*)函數(shù)建立。GROUPBY子句指示DLL014FNG012個(gè)產(chǎn)品。86|10動(dòng)完成。GROUPBYDBMS分組數(shù)據(jù),然后對(duì)每個(gè)組而不是整GROUPBYGROUPBY子句可以包含任意數(shù)目的列,因而可以對(duì)分組進(jìn)行嵌套,GROUPBY子句中列出的每一列都必須是檢索列或有效的表達(dá)式(但NULL值,它們將分為一組。GROUPBYWHERE子句之后,ORDERBY例如,GROUPBY2,1可表示按選擇的第二個(gè)列分組,然后再按第一SQL語(yǔ)句時(shí)出錯(cuò)。GROUPBY分組數(shù)據(jù)外,SQL還允許過(guò)濾分組,規(guī)定包括哪些WHERE子句的作用(4課提及。但是,在這個(gè)例子上,WHERE沒(méi)有分組的概念。WHERE使用什么呢?SQL為此提供了另一個(gè)子句,就是HAVING過(guò)濾分組。件和帶多個(gè)操作符的子句WHERE的所有技術(shù)和選HAVING。它們的句法是相同的,只是關(guān)鍵字有差別。88|10SELECTcust_id,COUNT(*)ASordersFROMOrdersGROUPBYcust_idHAVINGCOUNT(*)>=2; COUNT(*)2(兩個(gè)以上訂單)可以看到,WHERE子句在這里不起作用,因?yàn)檫^(guò)濾是基于分組聚集值,HAVING子句中基于這些值4的供應(yīng)商:SELECTvend_id,COUNT(*)ASnum_prodsFROMProductsWHEREprod_price>=4GROUPBYvend_idHAVINGCOUNT(*)>=2; :SELECTvend_id,COUNT(*)ASnum_prodsFROMProductsGROUPBYvend_idHAVINGCOUNT(*)>=2;90|10HAVING時(shí)應(yīng)GROUPBYWHERE子句用于標(biāo)準(zhǔn)的行級(jí)過(guò)濾。10-1匯總了它們之間的差別。表10-1ORDERBY與GROUPORDER GROUP
表1-1PY分QL規(guī)范S總是按給出的UPY數(shù)據(jù),用戶也可能會(huì)要求以不同的順序排序。就因?yàn)槟阋阅撤N方式分組(RBYUPY子句。ORDERGROUPBYORDERBY子句。這是保GROUPBY排序數(shù)據(jù)。為說(shuō)明GROUPBY和ORDERBYSELECTorder_num,COUNT(*)ASitemsFROMOrderItemsGROUPBYorder_numHAVINGCOUNT(*)>=3; ORDERBYSELECTorder_num,COUNT(*)ASitemsFROMOrderItemsGROUPBYorder_numHAVINGCOUNT(*)>=3ORDERBYitems,說(shuō)明:Access說(shuō)明:Access,ORDERBYCOUNT(*order_numORDERBY2order_num。 92|10SELECT10-2SELECT語(yǔ)句中表10-2SELECTGROUPORDERSQL聚集函數(shù)對(duì)數(shù)據(jù)進(jìn)行匯總計(jì)算。這一課講授了我們看到了如何使用HAVING子句過(guò)濾特定的組,還知道了ORDERBYGROUPBYWHEREHAVING之間的差異。11.2利用子查詢進(jìn)行過(guò)濾| 11.2利用子查詢進(jìn)行過(guò)濾|SELECTSQLSELECT語(yǔ)句都查詢查詢(subquery說(shuō)明:MySQL說(shuō)明:MySQL如果使用MySQL,應(yīng)該知道對(duì)子查詢的支持是從4.1本書所有課中使用的數(shù)據(jù)庫(kù)表都是關(guān)系表(關(guān)于每個(gè)表及關(guān)系的描述,I、94|11訂單日期,在Orders表中存儲(chǔ)為一行。各訂單的物品存儲(chǔ)在相關(guān)的Customers表中。RGAN01的所有顧客,應(yīng)該怎樣檢索?下SELECT語(yǔ)SELECTWHERE子句。order_num列。輸出列出了兩個(gè)包含此物品的訂單:SELECTorder_numFROMOrderItemsWHEREprod_id=11.2利用子查詢進(jìn)行過(guò)濾|SELECTcust_idFROMOrdersWHEREorder_numINSELECT語(yǔ)句:SELECTcust_idFROMOrdersWHEREorder_numIN(SELECTFROMWHEREprod_id=句時(shí),DBMS實(shí)際上執(zhí)行了兩個(gè)操作。96|11SELECTorder_numFROMorderitemsWHERE此查詢返回兩個(gè)訂單號(hào):2000720008IN操作符要求的逗號(hào)分隔的格式傳遞給外部查詢的WHERE子句。外部查詢SELECTcust_idFROMordersWHEREorder_numINSELECT語(yǔ)句難以閱讀和調(diào)試,它們?cè)谳^為復(fù)雜時(shí)更是SQL。IDSQL語(yǔ)句為:SELECTcust_name,cust_contactFROMCustomersWHEREcust_idINSELECTcust_name,FROMWHEREcust_idIN(SELECTFROMWHEREorder_numIN(SELECTFROM DeniseL.TheToy Kim最里邊的子查詢返回訂單號(hào)列表,此列表用于其外面的子查詢的WHEREIDID列表用于最外層查詢WHERE子句。最外層查詢返回所需的數(shù)據(jù)。SELECT語(yǔ)句只能查詢單個(gè)列。企圖檢索多個(gè)列將返回不總是執(zhí)行這類數(shù)據(jù)檢索的最有效方法。更多的論述,請(qǐng)參閱第1298|11IDOrders表中。1000000001的訂單進(jìn)行計(jì)數(shù):SELECTCOUNT(*)ASordersFROMOrdersWHEREcust_id=SELECT(SELECTCOUNT(*)FROMWHEREOrders.cust_id=Customers.cust_id)ASordersFROMCustomersORDERBY KidsTheToyVillagecust_stateorders。orders是一個(gè)計(jì)算字段,它是由圓括號(hào)中的55個(gè)顧客。完全限定列名,而不只是列名(cust_id。它指定表名和列名WHEREOrders.cust_id=cust_id自身進(jìn)行比較。因?yàn)镾ELECTCOUNT(*)FROMOrdersWHEREcust_id=SELECT(SELECTCOUNT(*)FROM100|11WHEREcust_id=cust_id)ASordersFROMCustomersORDERBYKidsTheToyVillageSELECT語(yǔ)句中操作多個(gè)表,就應(yīng)使用完全限定列名來(lái)避免歧義。JOIN時(shí),我們WHERE子句12.1聯(lián)結(jié)|1212.1聯(lián)結(jié)|這一課會(huì)介紹什么是聯(lián)結(jié),為什么使用聯(lián)結(jié),如何編寫使用聯(lián)結(jié)的SQL的極為重要的部分。102|12,則很難保證每次key外,它不存儲(chǔ)其他有關(guān)供應(yīng)商的信息。VendorsVendors表ProductsIDVendors表中找出相應(yīng)供應(yīng)稱為可伸縮性好(scalewell)。SELECT語(yǔ)句說(shuō)明:使用交互式說(shuō)明:使用交互式DBMS工具DBMS管理。104|12SELECTvend_name,prod_name,prod_priceFROMVendors,ProductsWHEREVendors.vend_id=DollHouseFishbeanbagDollHouseBirdbeanbagDollHouseRabbitbeanbagBearsR8inchteddyBearsR12inchteddyBearsR18inchteddyDollHouseRaggedyFunandKingFunandQueen這里最大的差別是所指定的兩列(prod_name和prod_price)在一個(gè)DBMS會(huì)返回錯(cuò)誤。SELECT語(yǔ)句中聯(lián)結(jié)幾個(gè)表時(shí),相應(yīng)的關(guān)系是第一個(gè)表中的每一行與第二個(gè)表中的每一行配對(duì)。WHERE子句作為過(guò)濾條件,只包含那些匹配給定條件(這里是聯(lián)結(jié)條件)WHERE106|12SELECTvend_name,prod_name,FROMVendors, BearsR 8inchteddyBearsR 12inchteddyBearsR 18inchteddyBearsR FishbeanbagBearsR BirdbeanbagBearsR RabbitbeanbagBearsR RaggedyBearsR KingBearsR QueenBear 8inchteddyBear 12inchteddyBear 18inchteddyBear FishbeanbagBear BirdbeanbagBear RabbitbeanbagBear RaggedyBear KingBear QueenDollHouse 8inchteddyDollHouse 12inchteddyDollHouse 18inchteddyDollHouse FishbeanbagDollHouse BirdbeanbagDollHouse RabbitbeanbagDollHouse RaggedyDollHouse KingDollHouse QueenFurball 8inchteddyFurball 12inchteddyFurball 18inchteddyFurball FishbeanbagFurball BirdbeanbagRabbitbeanbagRaggedyKingQueenFun8inchteddyFun12inchteddyFun18inchteddyFunFishbeanbagFunBirdbeanbagFunRabbitbeanbagFunRaggedyFunKingFunQueenJouetset8inchteddyJouetset12inchteddyJouetset18inchteddyJouetsetFishbeanbagJouetsetBirdbeanbagJouetsetRabbitbeanbagJouetsetRaggedyJouetsetKingJouetsetQueenDBMS返回不正確的數(shù)據(jù)。join108|12(equijoinSELECT語(yǔ)句返回與SELECTvend_name,prod_name,prod_priceFROMVendorsINNERJOINProductsONVendors.vend_id=ONWHERE的相同。ANSISQLINNERJOIN語(yǔ)法,之前使用的是簡(jiǎn)單的等值語(yǔ)是說(shuō),DBMS的確支持簡(jiǎn)單格式和標(biāo)準(zhǔn)格式,我建議你要理解這兩種SQLSELECT語(yǔ)句中可以聯(lián)結(jié)的表的數(shù)目。創(chuàng)建聯(lián)結(jié)的基本12.2創(chuàng)建聯(lián)結(jié)|SELECTprod_name,vend_name,prod_price,quantityFROMOrderItems,Products,VendorsWHEREProducts.vend_id=Vendors.vend_idANDOrderId_id=Pd_idANDorder_num=20007;18inchteddyBearsRFishbeanbagDollHouseBirdbeanbagDollHouseRabbitbeanbagDollHouseRaggedyDollHouseIDProducts表中的產(chǎn)品。這些產(chǎn)品通IDVendorsID存儲(chǔ)在每個(gè)20007中的物品。DBMSDBMS在運(yùn)行時(shí)關(guān)聯(lián)指定的每個(gè)表,以處理聯(lián)結(jié)。這種處理可能非常110|12現(xiàn)在回顧一下第11課中的例子,如下的SELECTSELECTcust_name,cust_contactFROMCustomersWHEREcust_idIN(SELECTFROMWHEREorder_numIN(SELECTFROMSELECTcust_name,cust_contactFROMCustomers,Orders,OrderItemsWHERECustomers.cust_id=Orders.cust_idANDOrderItems.order_num=Orders.order_numANDprod_id='RGAN01'; DeniseL.TheToy Kim112|1313112|13SELECTRTRIM(vend_name)+'('+RTRIM(vend_country)+')'ASvend_titleFROMORDERBYSQL除了可以對(duì)列名和計(jì)算字段使用別名,還允許給表名起別名。這樣SELECT語(yǔ)句。它與前一課例子中所用的語(yǔ)句基本相同,但13.2使用不同類型的聯(lián)結(jié)|SELECTcust_name,FROMCustomersASC,OrdersASO,OrderItemsASOIWHEREC.cust_id=O.cust_idANDOI.order_num=O.order_numANDprod_id='RGAN01';注意:Oracle注意:OracleSELECT114|13SELECTcust_id,cust_name,cust_contactFROMCustomersWHEREcust_name=(SELECTFROMWHEREcust_contact='JimJimDeniseL.SELECT語(yǔ)句做了一個(gè)簡(jiǎn)SELECTc1.cust_id,c1.cust_name,c1.cust_contactFROMCustomersASc1,CustomersASc2WHEREc1.cust_name=c2.cust_nameANDc2.cust_contact='JimJones';13.2使用不同類型的聯(lián)結(jié)|JimDeniseL.提示:Oracle提示:OracleDBMSCustomers表。不知道想要的是哪一列(即使它們其實(shí)是同一列。WHERE首先聯(lián)結(jié)兩個(gè)cust_contact過(guò)濾數(shù)據(jù),返回所需的數(shù)據(jù)。無(wú)論何時(shí)對(duì)表進(jìn)行聯(lián)結(jié),應(yīng)該至少有一列不止出現(xiàn)在一個(gè)表中(116|13SELECTC.*,O.order_num,O.order_date,OI.prod_id,OI.quantity,OI.item_priceFROMCustomersASC,OrdersASO,OrderItemsASOIWHEREC.cust_id=O.cust_id提示:OracleAND提示:Oracle13.2使用不同類型的聯(lián)結(jié)|需要注意,用來(lái)創(chuàng)建外聯(lián)結(jié)的語(yǔ)法在不同的SQL實(shí)現(xiàn)中可能稍有不DBMS文檔,以確定其語(yǔ)法。SELECTCustomers.cust_id,Orders.order_numFROMCustomersINNERJOINOrdersONCustomers.cust_id=SELECTCustomers.cust_id,Orders.order_numFROMCustomersLEFTOUTERJOINOrdersONCustomers.cust_id= 118|13來(lái)指定聯(lián)結(jié)類型(WHERE子句中指定。但是,與內(nèi)聯(lián)結(jié)關(guān)聯(lián)OUTERJOINRIGHTLEFT左邊的表LEFTOUTERJOINFROMRIGHTOUTERJOIN,如下例所示:SELECTCustomers.cust_id,Orders.order_numFROMCustomersRIGHTOUTERJOINOrdersONOrders.cust_id=注意:SQLite注意:SQLiteSQLiteRIGHTOUTERJOIN,有一種更簡(jiǎn)單13.3使用帶聚集函數(shù)的聯(lián)結(jié)|joinSELECTCustomers.cust_id,Orders.order_numFROMOrdersFULLOUTERJOINCustomersONOrders.cust_id=注意:FULL注意:FULLOUTERJOINAccess、MariaDB、MySQL、OpenOfficeBaseSQLiteFULLOUTERJOIN語(yǔ)法。如第9課所述,聚集函數(shù)用來(lái)匯總數(shù)據(jù)。雖然至今為止我們舉的聚集函數(shù)的例子都只是從一個(gè)表中匯總數(shù)據(jù),但這些函數(shù)也可以與聯(lián)結(jié)一起使用。COUNT()函數(shù)完成此工作:SELECTCustomers.cust_id,COUNT(Orders.order_num)ASnum_ordFROMCustomersINNERJOINONCustomers.cust_id=Orders.cust_idGROUPBYCustomers.cust_id;120|13 num_ord返回。SELECTCustomers.cust_id,COUNT(Orders.order_num)ASnum_ordFROMCustomersLEFTOUTERJOINOrdersONCustomers.cust_id=Orders.cust_idGROUPBY提示:Oracle提示:Oracle13.5小結(jié)|10000000020個(gè)訂單。種語(yǔ)法(DBMS使用這兩課中描述的某種語(yǔ)法。122|1414122|14本課講述如何利用UNION操作符將多條SELECT語(yǔ)句組合成一個(gè)結(jié)個(gè)查詢結(jié)果集返回。這些組合查詢通常稱為并(union)或復(fù)合查詢query14.2創(chuàng)建組合查詢|可用UNION操作符來(lái)組合數(shù)條SQL查詢。利用UNION,可給出多條SELECT語(yǔ)句,將它們的結(jié)果組合成一個(gè)結(jié)果集。使用UNION。WHEREUNION。SELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_stateIN VillageToys JohnSmith JimJones
\h\hTheToy Kim SELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_name=124|14 Jim DeniseL.
\h\hSELECTIllinoisIndianaMichiganIN子句,檢索出這些州的所有行。第二條SELECT利用簡(jiǎn)單的相等測(cè)試找出所有SELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_stateIN('IL','IN','MI')SELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_name= DeniseL. JimJonesVillageToys JohnSmith
\h\h\hTheToy Kim 14.2創(chuàng)建組合查詢|WHERE子句而不是UNIONSELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_stateIN('IL','IN','MI')ORcust_name='Fun4All';UNION可能會(huì)使處理更簡(jiǎn)單。126|14如果遵守了這些基本規(guī)則或限制,則可以將UNION用于任何數(shù)據(jù)檢索14.2.1SELECT語(yǔ)句。注意到在分別執(zhí)行語(yǔ)句UNIONSELECT45行。UNION從查詢結(jié)果集中自動(dòng)去除了重復(fù)的行;換句話說(shuō),它的行為與一UNIONALLUNION。14.2創(chuàng)建組合查詢|SELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_stateIN('IL','IN','MI')UNIONALLSELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_name= VillageToys JohnSmith JimJones
\h\hTheToy Kim Jim DeniseL.
\h\hUNIONALL,DBMS5行,其中這一課一開(kāi)始我們說(shuō)過(guò),UNIONWHERE條件相同的工作。UNIONALLUNIONWHERE子句完成,UNIONALLWHERE。128|14ORDERBY子句。UNION返回的結(jié)果進(jìn)行排序:SELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_stateIN('IL','IN','MI')SELECTcust_name,cust_contact,cust_emailFROMCustomersWHEREcust_name=ORDERBYcust_name, DeniseL. Jim
\h\hTheToy Kim Village John
\hSELECT語(yǔ)句返回的所有結(jié)果。來(lái)檢索只在第一個(gè)表中存在而在第二個(gè)表中不存在的行;而14.3小結(jié)|UNION與別名組合,檢索130|1515130|153個(gè)常用的SQL顧名思義,INSERT用來(lái)將行插入(或添加)到數(shù)據(jù)庫(kù)表。插入有幾種INSERT前,應(yīng)該保證自己有足夠的安全權(quán)限。INSERT語(yǔ)法,它要求指定INSERTINTOCustomers'Toy'123AnyStreet','NewYork',Customers表中。存儲(chǔ)到表中每一列的數(shù)DBMS之間可移植。132|15INSERTINTO'Toy'123AnyStreet','NewYork',INSERT語(yǔ)句的工作完全相同,但在表名后的括號(hào)里明確給出了列名。在插入行時(shí),DBMSVALUES列表中的相應(yīng)值填I(lǐng)NSERT語(yǔ)句仍然能正確工作。15.1數(shù)據(jù)插入|INSERTINTO'Toy'123AnyStreet','NewYork',正如所述,使用INSERT134|15語(yǔ)法,還可以省略列,這表示可以只給某些列提供值,給其他列不提供值。INSERTINTO'Toy'123AnyStreet','NewYork',INSERT操作中省略某些列。省略的列15.1數(shù)據(jù)插入|如果表中不允許有NULLINSERT一般用來(lái)給表插入具有指定列值的行。INSERT還存在另一種形式,可以利用它將SELECT語(yǔ)句的結(jié)果插入表中,這就是所謂的INSERTSELECTINSERTSELECTINSERT插入,可以如下進(jìn)行:INSERTINTOSELECTFROM136|15這個(gè)例子從一個(gè)名為CustNew的表中讀出數(shù)據(jù)并插入到CustomersCustNew表。CustNewACustomersCustNew時(shí),Customerscust_id值(如果主鍵值重INSERT操作將會(huì)失敗。這個(gè)例子使用INSERTSELECT從CustNew中將所有數(shù)據(jù)導(dǎo)入Customers。SELECTCustNew檢索出要插入的值,而不是列出CustNew表有多少行。如果這個(gè)表Customers。提示:提示:INSERTSELECTINSERT和SELECT語(yǔ)句中使用了相同的列名。但是,不一定要求列名匹配。事實(shí)上,DBMSSELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管INSERT插入。INSERT語(yǔ)句。要將一個(gè)表的內(nèi)容復(fù)制到一個(gè)全新的表(運(yùn)行中創(chuàng)建的表SELECTINTO語(yǔ)句。說(shuō)明:DB2說(shuō)明:DB2不支持DB2SELECTINTODBMS)。說(shuō)明:說(shuō)明:INSERTSELECTSELECTSELECTSELECTINTOCustCopyFROMCustomers;的整個(gè)內(nèi)容復(fù)制到新表中。因?yàn)檫@里使用的是SELECT*,所以將在138|15CREATETABLECustCopySELECT*FROMSELECTINTOSELECTWHEREGROUPSQL代碼,而不會(huì)影響實(shí)際的數(shù)據(jù)。INSERT的幾UPDATEDELETE進(jìn)一步操作表數(shù)據(jù)。16.1更新數(shù)據(jù)|16課16.1更新數(shù)據(jù)|UPDATE時(shí)一定要細(xì)心。因?yàn)樯圆蛔⒁?,就?huì)更新表中的所有UPDATE前,應(yīng)該保證自己有足夠的安全權(quán)限。140|16UPDATESETcust_email=\h'kim@'WHEREcust_id='1000000005';cust_email列為指定的值:SETcust_email=\hUPDATESETcust_contact='SamRoberts',cust_email=\h'sam@'WHEREcust_id=SET命令,每個(gè)“列=16.2刪除數(shù)據(jù)|11課。UPDATESETcust_email=WHEREcust_id=其中NULL用來(lái)去除cust_email(空字符串用''表示,是一個(gè)值NULL表示沒(méi)有值。142|16DELETE時(shí)一定要細(xì)心。因?yàn)樯圆蛔⒁猓蜁?huì)錯(cuò)誤地刪除表中DELETE前,應(yīng)該保證自己有足夠的安全權(quán)限。Customers表中刪除一行:DELETEFROMWHEREcust_id=這條語(yǔ)句很容易理解。DELETEFROM要求指定從中刪除數(shù)據(jù)的表名,WHERE子句,它將刪除表中每個(gè)顧客。也可以讓DBMS通過(guò)使用外鍵來(lái)嚴(yán)格實(shí)施關(guān)系(這些定義在附錄A中。存在外鍵時(shí),DBMS使用它們實(shí)施引用完整性。例如要向Products表中插入一個(gè)新產(chǎn)品,DBMS16.3更新和刪除的指導(dǎo)原則|vend_idvend_idVendors表的。那么,這與DELETE有什么關(guān)系呢?使用外鍵確保引用完整性的一個(gè)好處是,DBMS通??梢苑乐箘h除某個(gè)關(guān)系需要用到的行。例如,要從ProductsOrderItems的已有訂單中,那么DELETE語(yǔ)句將拋出錯(cuò)誤并中止。這是總要定義外鍵的另SQL代碼在DBMSUPDATE語(yǔ)句。DELETEDELETE語(yǔ)句從表中刪除行,甚至是刪除表中所有行。但是,DELETE144|16UPDATEDELETE語(yǔ)句。,盡可能WHERE子句那樣使用它(可以指定各主鍵、多個(gè)值或值的范圍。,DBMS將不允許刪除其數(shù)據(jù)與其他表相關(guān)聯(lián)的行。DBMSWHERE子句17.1創(chuàng)建表|17課17.1創(chuàng)建表|SQL不僅用于表數(shù)據(jù)操縱,還用來(lái)執(zhí)行數(shù)據(jù)庫(kù)和表的所有操作,包括表SQL實(shí)現(xiàn)中,CREATETABLE語(yǔ)句的語(yǔ)法可能有所不同。對(duì)DBMS支持何種語(yǔ)法,請(qǐng)參閱相應(yīng)的文檔。146|17說(shuō)明:DBMS創(chuàng)建表的具體例子說(shuō)明:DBMS創(chuàng)建表的具體例子CREATETABLECREATETABLECREATETABLEProductsprod_idCHAR(10)NOTvend_idCHAR(10)NOTprod_nameCHAR(254)NOTNULL,prod_priceDECIMAL(8,2)NOTNULL,prod_descVARCHAR(1000)NULLCREATETABLE關(guān)鍵字。實(shí)際的表定義(所有列)5列組17.1創(chuàng)建表|建腳本的原因(。,然NULL值的列不接受沒(méi)有列值的行,換148|17CREATETABLEOrdersorder_numINTEGERNOTNULL,order_dateDATETIMENOTNULL,cust_idCHAR(10)NOTNULLOrders表。Orders包含三列:訂單號(hào)、訂IDNOTNULLNOTNULLCREATETABLEVendorsNOTNOTDBMS文檔。第1如果指定''(兩個(gè)單引號(hào),其間沒(méi)有字符NOTNULL列中是允NULLNULLSQL允許指定默認(rèn)值,在插入行時(shí)如果不給出值,DBMS將自動(dòng)采用默CREATETABLEOrderItems NOT NOT NOT NOT DEFAULT NOT150|17這條語(yǔ)句創(chuàng)建OrderItems表,包含構(gòu)成訂單的各項(xiàng)(訂單本身存儲(chǔ)在或變量,將系統(tǒng)日期用作默認(rèn)日期。MySQL用戶指定DEFAULTCURRENT_DATE(),OracleDEFAULTSYSDATESQLServerDBMS,請(qǐng)參閱相應(yīng)的文檔。表17-1 SQL ALTERTABLEDBMSALTERTABLEALTERTABLE時(shí)需要考慮的事情。理想情況下,不要在表中包含數(shù)據(jù)時(shí)對(duì)其進(jìn)行更新。應(yīng)該在表的設(shè)計(jì)過(guò)程中充分考慮未來(lái)可能的需求,避免今后對(duì)表的結(jié)構(gòu)做大改動(dòng)。DBMS文檔。ALTERTABLE在ALTERTABLE之后給出要更改的表名(該表必須存在,否則將ALTERTABLEADDvend_phone152|17Vendorsvend_phone的列,其數(shù)據(jù)類型CHAR。DBMS都有效:ALTERTABLEVendorsDROPCOLUMNvend_phone; ;說(shuō)明:說(shuō)明:ALTERTABLE17.4重命名表|ALTER刪除表(刪除整個(gè)表而不是其內(nèi)容)DROPTABLE語(yǔ)句DROPTABLECustCopy表(15課中創(chuàng)建的。刪除表沒(méi)有確認(rèn),也154|17SQLSQLiteTABLE語(yǔ)句。DBMS文檔。18.1視圖|18課18.1視圖|SQL操作。說(shuō)明:DBMS說(shuō)明:DBMSMicrosoftAccessSQLMicrosoftAccess。MySQL。156|18SELECTcust_name,cust_contactFROMCustomers,Orders,OrderItemsWHERECustomers.cust_id=Orders.cust_idANDOrderItems.order_num=Orders.order_numANDprod_id='RGAN01';SELECTcust_n
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 冷庫(kù)加班入貨合同范例
- 動(dòng)物寄養(yǎng)合同范例
- 書面流轉(zhuǎn)合同范本
- 農(nóng)家購(gòu)房合同范本
- 沈陽(yáng)商用房屋出租合同范本
- 個(gè)體用工合同范本
- 農(nóng)村院子賣房合同范本
- 物品采購(gòu)合同范本
- 代蓋公章合同范例
- 企業(yè)監(jiān)理裝修合同范本
- 2024黑龍江公務(wù)員考試【A類、B類、省直、筆試】四套真題及答案
- 2025年中國(guó)高價(jià)HPV疫苗行業(yè)競(jìng)爭(zhēng)格局分析及投資規(guī)劃研究報(bào)告
- 醫(yī)院感染與醫(yī)療器械消毒
- 2025年春新北師大版物理八年級(jí)下冊(cè)課件 第七章 運(yùn)動(dòng)和力 第四節(jié) 同一直線上二力的合成
- 智能客服系統(tǒng)中人工智能技術(shù)的應(yīng)用
- 2025年公司年會(huì)活動(dòng)總結(jié)樣本(3篇)
- 村衛(wèi)生室2025年初工作計(jì)劃
- 派出所校園安全創(chuàng)新
- 飛書項(xiàng)目管理
- 醫(yī)院醫(yī)共體2025年度工作計(jì)劃
- UL498標(biāo)準(zhǔn)中文版-2019插頭插座UL標(biāo)準(zhǔn)中文版
評(píng)論
0/150
提交評(píng)論