版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
錄| 錄|第1課了解 什么是 動手實 第2課檢索數(shù) 限制結(jié) 使用注 第3課排序檢索數(shù) 排序數(shù) 2| 第4課過濾數(shù) 使用WHERE子 第5課高級數(shù)據(jù)過 組合WHERE子 第6課用通配符進(jìn)行過 第7課創(chuàng)建計算字 計算字 拼接字 第8課使用函數(shù)處理數(shù) 使用函 第9課匯總數(shù) 聚集函 錄| 第10課分組數(shù) 數(shù)據(jù)分 創(chuàng)建分 過濾分 第11課使用子查 子查 利用子查詢進(jìn)行過 作為計算字段使用子查 第12課聯(lián)結(jié) 創(chuàng)建聯(lián) 第13課創(chuàng)建高級聯(lián) 第14課組合查 組合查 4| 第15課插入數(shù) 數(shù)據(jù)插 第16課更新和刪除數(shù) 更新數(shù) 刪除數(shù) 第17課創(chuàng)建和操縱 創(chuàng)建 更新 刪除 重命名 第18課使用視 創(chuàng)建視 第19課使用存儲過 存儲過 錄|第20課管理事務(wù)處 事務(wù)處 第21課使用游 使用游 第22課高級SQL特 觸發(fā) 附錄A樣例表腳 附錄B流行的應(yīng)用程 附錄 附錄 附錄ESQL保留 索 1.1數(shù)據(jù)庫基礎(chǔ)|1課了解1.1數(shù)據(jù)庫基礎(chǔ)|后面是一些基本數(shù)據(jù)庫概念的簡要介紹。如果你已經(jīng)具有一定的數(shù)據(jù)庫經(jīng)驗,可以借此復(fù)習(xí)鞏固一下;如果你剛開始接觸數(shù)據(jù)庫,可|1以由此了解必需的基本知識。理解數(shù)據(jù)庫概念是掌握以由此了解必需的基本知識。理解數(shù)據(jù)庫概念是掌握SQL的重要前提,如果有必要,你或許還應(yīng)該參閱其他一些有關(guān)數(shù)據(jù)庫基礎(chǔ)知識的書籍。數(shù)據(jù)庫這個術(shù)語的用法很多,但就本書而言(SQL的角度來看,數(shù)數(shù)據(jù)庫數(shù)據(jù)庫(DBMS(schema列列4|1網(wǎng)格中每一列存儲著某種特定的信息。例如,在顧客表中,一列存儲顧客編號,另一列存儲顧客姓名,而地址、城市、州以及郵政編碼全都存正確地將數(shù)據(jù)分解為多個列極為重要。例如,城市、州、郵政編碼應(yīng)該總是彼此獨立的列。通過分解這些數(shù)據(jù),才有可能利用特定的列對數(shù)據(jù)進(jìn)行分類和過濾(如找出特定州或特定城市的所有顧客。如果城市和州組合在一個列中,則按州進(jìn)行分類或過濾就會很困難。SQLDBMS中具有不同的名稱。對此用行行(recordIDID或雇主鍵(primary主鍵(primary6|1;SQL(S-Q-Lsequel)是StructuredQueryLanguage(結(jié)構(gòu)化查詢語言)的縮寫。SQL是一種專門用來與數(shù)據(jù)庫溝通的語言。與其他語言(Java、C、PHP這樣的編程語言)不一樣,SQL說明:SQL說明:SQLDBMSSQL進(jìn)行了擴(kuò)展。這種擴(kuò)DBMSANSISQL。各個實現(xiàn)有自PL/SQL、Transact-SQL等。SQLANSISQLDBMSSQL語句的應(yīng)用系統(tǒng)。8|1QLA體的樣例表,并介紹了獲得(或創(chuàng)建)它們的詳細(xì)步驟,便于讀者理解B介紹在各種應(yīng)用程序中執(zhí)行QL在進(jìn)入下一課之前,強(qiáng)烈建議讀者先閱讀這兩個附錄的內(nèi)容,為以后的2.1SELECT| 2.1SELECT|1課所述,SQL語句是由簡單的英語單詞構(gòu)成的。這些單詞稱為SQLSELECT語句了。它的用途是從一個或多個表中檢索關(guān)鍵字關(guān)鍵字A,它解釋了如何下載或創(chuàng)建這些數(shù)據(jù)文件。10|2B中也給出了相應(yīng)的建議。SELECTprod_nameFROMProducts;FishbeanbagtoyBirdbeanbagtoyRabbitbeanbagtoy8inchteddy12inchteddy18inchteddybearRaggedyAnnKingdollQueendoll如上的一條簡單SELECT語句將返回表中的所有行。數(shù)據(jù)沒有過濾(過SQLSQL提示:SQL語句和大小寫SelectSQLSQL關(guān)鍵SQL是不區(qū)分大小寫的,但是表名、列名和值可能有所不同(DBMS及其如何配置。3種寫法的作用是一樣的。SELECTprod_nameFROMProducts;SELECTprod_nameFROM12|2要想從一個表中檢索多個列,仍然使用相同的SELECT語句。唯一的不SELECTprod_id,prod_name,prod_priceFROMProducts;3個列名,列名之間用逗號分隔。此語句的 FishbeanbagBirdbeanbagRabbitbeanbag8inchteddy12inchteddy18inchteddyRaggedyKingQueen,SELECTSELECTFROM(*14|2products表中所有產(chǎn)品供ID:SELECTvend_idFROM2.6限制結(jié)果|DISTINCT關(guān)鍵字,顧名思義,它指示數(shù)據(jù)庫只返回不同SELECTDISTINCTvend_idFROMProducts;SELECTDISTINCTvend_idDBMS只返回不同(具有唯一性)的DISTINCT關(guān)鍵字作用于所有的列,不僅僅是跟在其后的那一列。例SELECTDISTINCTvend_id,prod_price,除非指定的16|2SQL實現(xiàn)并不相同。SELECTTOP5prod_nameFROMProducts;8inchteddy12inchteddy18inchteddybearFishbeanbagtoyBirdbeanbagtoySELECTTOP55DB2DBMSSQL語SELECTprod_nameFROMProductsFETCHFIRST5ROWSFETCHFIRST5ROWSONLYSELECTprod_nameFROMProductsWHEREROWNUM<=5;SELECTprod_nameFROMProductsLIMIT5;上述代碼使用SELECTLIMIT5指示DBMS5行的數(shù)據(jù)。這個語句的輸出參見下面的代碼。SELECTprod_nameFROMProductsLIMIT5OFFSET5;MT5FFT5指示SQL等S5行起的5第一個數(shù)字是指從哪兒開始,第二個數(shù)字是檢索的行數(shù)。這個語句的輸出是:18|2RabbitbeanbagtoyRaggedyAnnKingdollQueendoll54行數(shù)據(jù)(5行。00提示:MySQLMariaDBSQLSQLSQL語句DBMS(相關(guān)示例可以參見附Bcreate.sqlpopulate.sql)這同樣適用于SQL文件開始處的內(nèi)容,它可能包含程序員的聯(lián)系方SQLDBMS將其視為注釋而加以忽略。SELECT FROMCREATETABLE語句中的列就很不錯。#這是一條注釋SELECTprod_nameFROMProducts;20|2在一行的開始處使用#/*SELECTprod_name,vend_idFROMProducts;*/SELECTprod_nameFROMProducts;常用于給代碼加注釋,就如這個例子演示的,這里定義了兩個SELECT3.1排序數(shù)據(jù)|3課3.1排序數(shù)據(jù)|SELECTprod_nameFROMProducts;FishbeanbagtoyBirdbeanbagtoyRabbitbeanbagtoy8inchteddy12inchteddy18inchteddybearRaggedyAnnKingdollQueendoll22|3DBMS重用回SELECTFROM子句。SELECTORDERBY子句。ORDERBY子句取一個或多個列的名字,據(jù)此對輸出進(jìn)行排序。請看下面SELECTprod_nameFROMProductsORDERBY12inchteddy18inchteddy8inchteddybearBirdbeanbagtoyFishbeanbagtoyKingdollQueen注意:ORDERBYORDER注意:ORDERBYORDERBYSELECT語句中最后一通常,ORDERBY子句中使用的列將是為顯示而選擇的列。但是,實3個列,并按其中兩個列對結(jié)果進(jìn)行排序——首先按價SELECTprod_id,prod_price,prod_nameFROMProducts24|3ORDERBYprod_price,BirdbeanbagFishbeanbagRabbitbeanbagRaggedy8inchteddy12inchteddyKingQueen18inchteddyprod_name排序。除了能用列名指出排序順序外,ORDERBY還支持按相對列位置進(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列(在每個價格內(nèi))仍然按標(biāo)準(zhǔn)的升序排序。ASCENDINGASC沒有多大用處,因為升序是默認(rèn)的(如果既不指定ASC也不指定DESCASC)。BY子句可能做不到。你必須請求數(shù)據(jù)庫管理員的幫助。28|3SELECT語句中的最后一條子句。根據(jù)需要,可4.1WHERE|4.1WHERE|數(shù)據(jù)庫表一般包含大量的數(shù)據(jù),很少需要檢索表中的所有行。通常只會根據(jù)特定操作或報告的需要提取表數(shù)據(jù)的子集。只檢索所需數(shù)據(jù)需要指(h(rdo。SELECTprod_name,prod_priceFROMProductsWHEREprod_price=這條語句從products表中檢索兩個列,但不返回所有行,只返回 30|4Fishbeanbag Birdbeanbag Rabbitbeanbag 過濾數(shù)據(jù)。不過,SQL不止能測試等于,還能做更多的事情。3.49、3.490、3.4900DBMS指定了所使用的數(shù)據(jù)類型及畢竟從數(shù)學(xué)角度講,3.493.4900是一樣的。提示:SQL過濾與應(yīng)用過濾在同時使用ORDERBY和WHERE子句時,應(yīng)該讓ORDERBY位于WHERE之后,否則將會產(chǎn)生錯誤(ORDERBY的使用,請參閱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子句。其語法如下:SELECT4.2WHERE|FROMWHEREprod_priceIS這條語句返回所有沒有價格(prod_price0)的NULL值:SELECTcust_nameFROMCUSTOMERSWHEREcust_emailISKidsPlaceTheToyStore提示:各提示:各DBMS特有的操作符信息請參閱相應(yīng)的DBMS文檔。NULL值NULL的行確實出現(xiàn)在返回的36|4SELECTWHERE子句過濾返回的數(shù)據(jù)。我們學(xué)習(xí)了如何檢驗相等、不相等、大于、小于、值的范圍以及NULL5.1WHERE|55.1WHERE|NOTIN操作符。ANDOR子句的方式使用。操作符操作符用來聯(lián)結(jié)或改變WHEREoperatorSELECTprod_id,prod_price,38|5FROMWHEREvend_id='DLL01'ANDprod_price<=4美元,但不是由指定供應(yīng)商制造的也不被檢SQL語句產(chǎn)生的輸出如下:BirdbeanbagFishbeanbagRabbitbeanbagAND關(guān)鍵字。ORDERBYORDERBYWHERE子句之后。5.1WHERE|SELECTprod_name,prod_priceFROMProductsWHEREvend_id='DLL01'ORvend_id=子句SQL語句產(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語句與前一條的唯一差別是,將前兩個條件用圓括號括了SQLBRS0110美元及以上的所有產(chǎn)品,這正是我們希望42|5SELECTprod_name,prod_priceFROMProductsWHEREvend_idIN('DLL01','BRS01'ORDERBY12inchteddy18inchteddy8inchteddyBirdbeanbagFishbeanbagRabbitbeanbagRaggedySQL語句完成與上面的例子相同的工作。SELECTprod_name,prod_priceFROMProductsWHEREvend_id='DLL01'ORvend_id='BRS01'ORDERBYprod_name; 5.3NOT|12inchteddy18inchteddy8inchteddyBirdbeanbagFishbeanbagRabbitbeanbagRaggedyIN的最大優(yōu)點是可以包含其他SELECTWHERENOT操作符有且只有一個功能,那就是否定其后所跟的NOT從不單獨使用(它總是與其他操作符一起使用44|5SELECTprod_nameFROMProductsWHERENOTvend_id='DLL01'ORDERBYprod_name;12inchteddy18inchteddy8inchteddybearKingdollQueenNOT否定跟在其后的條件,因此,DBMSvend_idSELECTprod_nameFROMProductsWHEREvend_id<>'DLL01'ORDERBYprod_name;12inchteddy18inchteddyinchteddybearKingdollQueen5.4小結(jié)|NOTWHERENOT確實沒有什么優(yōu)勢。但在更復(fù)雜的子句中,NOT是非常有用的。例如,在IN操作符聯(lián)合使用時,NOT可以非常簡單地找出與條件列表不匹配說明:MariaDB說明:MariaDBINNOT操作符。46|6646|6LIKE操作符beanbag的所有產(chǎn)品?用簡單的比較操作符肯定不行,必須使beanbag的所有產(chǎn)品,可以構(gòu)造一個通配beanbag的產(chǎn)品。搜索模式(searchLIKE|SQL文獻(xiàn)或手冊中遇到此術(shù)語時不知所云。百分號(%)SELECTprod_id,prod_nameFROMProductsWHEREprod_nameLIKE Fishbeanbag此例子使用了搜索模式'Fish%'48|6Fish起頭的詞。%DBMSFish之后的任意字符,不管它有多說明:Access說明: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地址的一部分來查找電子郵件,例如WHEREemailLIKE\h需要特別注意,除了能匹配一個或多個字符外,%0個字符。%0個、1個或多個字符。50Fishbeanbagtoy(17個字符33個空格。這樣做一般對數(shù)據(jù)SQLWHEREprod_nameLIKE'F%y'Fyprod_name。yFishbeanbagtoy就8課。WHEREprod_nameLIKENULL50|6(_說明:DB2通配符說明:DB2通配符說明:AccessSELECTprod_id,prod_nameFROMProductsWHEREprod_nameLIKE'inchteddy 12inchteddy 18inchteddy這個WHERE子句中的搜索模式給出了后面跟有文本的兩個通配符。結(jié)果只顯示匹配搜索模式的行:第一行中下劃線匹配12,第二行中匹配18。8inchteddybear6.1LIKE|通配符而不是一個。對照一下,下面的SELECT語句使用%通配符,返SELECTprod_id,prod_nameFROMProductsWHEREprod_nameLIKE'%inchteddy 8inchteddy 12inchteddy 18inchteddy方括號()的[]AccessSQLServer支持集合。為確定你使用的DBMS是否支持集合,請參閱相應(yīng)的文檔。SELECT52|6FROMWHEREcust_contactLIKE'[JM]%'ORDERBYcust_contact;JimJonesJohnSmithMichelle此語句的EM因此,任何多于一個字符的名字都不匹配。]之后的%通配符匹配第:SELECTcust_contactFROMCustomersWHEREcust_contactLIKEORDERBY說明:Access說明:AccessMicrosoftAccess,需要用!而不是^來否定一個集合,因WHERE子句時可以簡化語法:6.3小結(jié)|SELECTcust_contactFROMCustomersWHERENOTcust_contactLIKE'[JM]%'ORDERBYcust_contact;正如所見,SQL的通配符很有用。但這種功能是有代價的,即通配符搜在確實需要使用通配符時,也盡量不要把它們用在搜索模式的開始總之,通配符是一種極其重要和有用的搜索工具,以后我們經(jīng)常會用到它。54|7754|7郵電7.2拼接字段|郵電SELECT語句內(nèi)字段字段SELECT語句中哪些列是實際的表列,在SQL語句內(nèi)可完成的許多轉(zhuǎn)換和格式化工作都可以直接在客戶端Vendors表包含供應(yīng)商名和地址信息。假如要生成一個供應(yīng)商報表,需此報表需要一個值,而表中數(shù)據(jù)存儲在兩個列vend_name和vend_SELECT語句很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語句返回的輸出。結(jié)合成一個計算字段的兩個列用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(),各個列都進(jìn)說明:TRIM說明:TRIM函數(shù)空格、LTRIM()(去掉字符串左邊的空格)TRIM()(去掉字符SQL查詢工具中查看一下結(jié)果,這樣沒有什么不好。但是,一個為了解決這個問題,SQL支持列別名。別名(alias)是一個字段或值的ASSELECT語句: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)建一個包含指定計算結(jié)果的名為vend_title的計算字段。從輸出可以看到,結(jié)果與以前的相同,但現(xiàn)說明:AS說明:ASDBMS中,AS關(guān)鍵字是可選的,不過最好使用它,這被視為columnSQL20008中的所有物品:SELECTprod_id,quantity,item_priceFROMOrderItemsWHEREorder_num=item_price列包含訂單中每項物品的單價。如下匯總物品的價格(62|7:SELECTquantity*item_priceASexpanded_priceFROMOrderItemsWHEREorder_num=SQL7-1中列出的基本算術(shù)操作符。此外,圓括號可用來區(qū)分優(yōu)5課。表7-1SQL abc,SELECTNow();Now()函數(shù)返回當(dāng)前日期和時間。SELECT語句進(jìn)行檢驗。64|8864|8SQL函數(shù)的使用可能會帶來問題。與大多數(shù)其他計算機(jī)語言一樣,SQL也可以用函數(shù)來處理數(shù)據(jù)。函數(shù)一在學(xué)習(xí)這一課并進(jìn)行實踐之前,你應(yīng)該了解使用SQL函數(shù)所存在的3DBMS中的語法:8.2使用函數(shù)|表8-1DBMS
AccessMID(DB2OraclePostgreSQL和SQLite使用數(shù)據(jù)類型轉(zhuǎn)換Access和Oracle使用多個函數(shù),每種類型的轉(zhuǎn)換有一個函數(shù);DB2和PostgreSQL使用CAST();MariaDB、MySQL和SQLServer使用取當(dāng)前日期Access使用NOWDB2和PostgreSQL使用CURRENT_DATE;SQL實現(xiàn)編寫的代碼在其他實現(xiàn)中可能不正常。DBMS可以非常有效完成的工作。以便以后你(或其他人)SQL代碼的含義。66|8SELECT后面的列名,但函數(shù)的作用不僅于SQL語句中使用等,后面會做更多的介紹。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是一個將任何文本串轉(zhuǎn)換為描述其語音表示的字母數(shù)字模式的算法。SOUNDEX考慮了類似的發(fā)音字符和音節(jié),使得能對字符串進(jìn)行發(fā)音比較而不是字母比較。雖然SOUNDEX不是SQL概念,但多數(shù)DBMS都提供對SOUNDEX的支持。MicrosoftAccessPostgreSQLSOUNDEX(),因此以下的例子DBMS。68|8SQLiteSOUNDEX()。KidsPlaceMichelleGreen。但如果這是錯誤的輸入,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值。因為MichaelGreen和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ù)用來將兩個字符串轉(zhuǎn)換為日期。CONVERT()to_date(),當(dāng)然可以使用這種類型的語句。MySQL和MariaDB具有各種日期處理函數(shù),但沒有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之間的差異說明了這一點。74|974|9門的函數(shù)。使用這些函數(shù),SQL查詢可用于檢索數(shù)據(jù),以便分析和報表能進(jìn)行上述檢索。與前一章介紹的數(shù)據(jù)處理函數(shù)不同,SQL的聚集函數(shù)SQL實現(xiàn)中得到了相當(dāng)一致的支持。聚集函數(shù)(aggregate聚集函數(shù)(aggregate表9-1SQL AVG()Products表中所有產(chǎn)品的平均價格:SELECTAVG(prod_price)ASavg_priceFROMProducts;7課所述,avg_price是一個別名。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允許將它用來返回任意列中的最大值,包括返回文本列中的最9.1聚集函數(shù)|SELECTMIN(prod_price)ASmin_priceFROMProducts;DBMS允許將它用來返回任意列中的最小值,包括返回文本列中的最下面舉一個例子,OrderItems包含訂單中實際的物品,每個物品有相應(yīng)的數(shù)量??扇缦聶z索所訂購物品的總數(shù)(quantity值之和:80|9SELECTSUM(quantity)ASitems_orderedFROMOrderItemsWHEREorder_num=SUM也可以用來合計計算值。在下面的例子中,合計每項物品的SELECTSUM(item_price*quantity)AStotal_priceFROMOrderItemsWHEREorder_num=函數(shù)SUM(item_price*quantity返回訂單中所有物品價錢之和,ALL。AccessMicrosoftAccessDISTINCT,因此下面的例子不適合于Access。要在Access得到類似的結(jié)果,需要使用子查詢把DISTINCTSELECTCOUNT(*)語句。AVG()函數(shù)返回特定供應(yīng)商提供的產(chǎn)品的平均價格。它82|9SELECTAVG(DISTINCTprod_price)ASavg_priceFROMProductsWHEREvend_id=DISTINCTCOUNT()。DISTINCT不能用TOPTOPPERCENT。為了解具DBMS支持哪些參數(shù),請參閱相應(yīng)的文檔。9.4小結(jié)|SELECTCOUNT(*)ASnum_items,MIN(prod_price)ASprice_min,MAX(prod_price)ASprice_max,AVG(prod_price)ASprice_avgFROMSELECT44個值(Products聚集函數(shù)用來匯總數(shù)據(jù)。SQL5個聚集函數(shù),可以用多種方法使用84|101084|10這一課介紹如何分組數(shù)據(jù),以便匯總表內(nèi)容的子集。這涉及兩個新SELECT語句子句:GROUPBYHAVING從上一課得知,使用SQL聚集函數(shù)可以匯總數(shù)據(jù)。這樣,我們就能夠?qū)π羞M(jìn)行計數(shù),計算和與平均數(shù),不檢索所有數(shù)據(jù)就獲得最大值和最小值。DLL01提供的產(chǎn)品數(shù)目:SELECTCOUNT(*)ASnum_prodsFROMProductsWHEREvend_id=SELECTvend_id,COUNT(*)ASnum_prodsFROMProductsGROUPBYSELECT語句指定了兩個列:vend_idID,num_prods為計算字段(COUNT(*)函數(shù)建立。GROUPBY子句指示DLL014FNG012個產(chǎn)品。86|10動完成。GROUPBYDBMS分組數(shù)據(jù),然后對每個組而不是整GROUPBYGROUPBY子句可以包含任意數(shù)目的列,因而可以對分組進(jìn)行嵌套,GROUPBY子句中列出的每一列都必須是檢索列或有效的表達(dá)式(但NULL值,它們將分為一組。GROUPBYWHERE子句之后,ORDERBY例如,GROUPBY2,1可表示按選擇的第二個列分組,然后再按第一SQL語句時出錯。GROUPBY分組數(shù)據(jù)外,SQL還允許過濾分組,規(guī)定包括哪些WHERE子句的作用(4課提及。但是,在這個例子上,WHERE沒有分組的概念。WHERE使用什么呢?SQL為此提供了另一個子句,就是HAVING過濾分組。件和帶多個操作符的子句WHERE的所有技術(shù)和選HAVING。它們的句法是相同的,只是關(guān)鍵字有差別。88|10SELECTcust_id,COUNT(*)ASordersFROMOrdersGROUPBYcust_idHAVINGCOUNT(*)>=2; COUNT(*)2(兩個以上訂單)可以看到,WHERE子句在這里不起作用,因為過濾是基于分組聚集值,HAVING子句中基于這些值4的供應(yīng)商:SELECTvend_id,COUNT(*)ASnum_prodsFROMProductsWHEREprod_price>=4GROUPBYvend_idHAVINGCOUNT(*)>=2; :SELECTvend_id,COUNT(*)ASnum_prodsFROMProductsGROUPBYvend_idHAVINGCOUNT(*)>=2;90|10HAVING時應(yīng)GROUPBYWHERE子句用于標(biāo)準(zhǔn)的行級過濾。10-1匯總了它們之間的差別。表10-1ORDERBY與GROUPORDER GROUP
表1-1PY分QL規(guī)范S總是按給出的UPY數(shù)據(jù),用戶也可能會要求以不同的順序排序。就因為你以某種方式分組(RBYUPY子句。ORDERGROUPBYORDERBY子句。這是保GROUPBY排序數(shù)據(jù)。為說明GROUPBY和ORDERBYSELECTorder_num,COUNT(*)ASitemsFROMOrderItemsGROUPBYorder_numHAVINGCOUNT(*)>=3; ORDERBYSELECTorder_num,COUNT(*)ASitemsFROMOrderItemsGROUPBYorder_numHAVINGCOUNT(*)>=3ORDERBYitems,說明:Access說明:Access,ORDERBYCOUNT(*order_numORDERBY2order_num。 92|10SELECT10-2SELECT語句中表10-2SELECTGROUPORDERSQL聚集函數(shù)對數(shù)據(jù)進(jìn)行匯總計算。這一課講授了我們看到了如何使用HAVING子句過濾特定的組,還知道了ORDERBYGROUPBYWHEREHAVING之間的差異。11.2利用子查詢進(jìn)行過濾| 11.2利用子查詢進(jìn)行過濾|SELECTSQLSELECT語句都查詢查詢(subquery說明:MySQL說明:MySQL如果使用MySQL,應(yīng)該知道對子查詢的支持是從4.1本書所有課中使用的數(shù)據(jù)庫表都是關(guān)系表(關(guān)于每個表及關(guān)系的描述,I、94|11訂單日期,在Orders表中存儲為一行。各訂單的物品存儲在相關(guān)的Customers表中。RGAN01的所有顧客,應(yīng)該怎樣檢索?下SELECT語SELECTWHERE子句。order_num列。輸出列出了兩個包含此物品的訂單:SELECTorder_numFROMOrderItemsWHEREprod_id=11.2利用子查詢進(jìn)行過濾|SELECTcust_idFROMOrdersWHEREorder_numINSELECT語句:SELECTcust_idFROMOrdersWHEREorder_numIN(SELECTFROMWHEREprod_id=句時,DBMS實際上執(zhí)行了兩個操作。96|11SELECTorder_numFROMorderitemsWHERE此查詢返回兩個訂單號:2000720008IN操作符要求的逗號分隔的格式傳遞給外部查詢的WHERE子句。外部查詢SELECTcust_idFROMordersWHEREorder_numINSELECT語句難以閱讀和調(diào)試,它們在較為復(fù)雜時更是SQL。IDSQL語句為:SELECTcust_name,cust_contactFROMCustomersWHEREcust_idINSELECTcust_name,FROMWHEREcust_idIN(SELECTFROMWHEREorder_numIN(SELECTFROM DeniseL.TheToy Kim最里邊的子查詢返回訂單號列表,此列表用于其外面的子查詢的WHEREIDID列表用于最外層查詢WHERE子句。最外層查詢返回所需的數(shù)據(jù)。SELECT語句只能查詢單個列。企圖檢索多個列將返回不總是執(zhí)行這類數(shù)據(jù)檢索的最有效方法。更多的論述,請參閱第1298|11IDOrders表中。1000000001的訂單進(jìn)行計數(shù):SELECTCOUNT(*)ASordersFROMOrdersWHEREcust_id=SELECT(SELECTCOUNT(*)FROMWHEREOrders.cust_id=Customers.cust_id)ASordersFROMCustomersORDERBY KidsTheToyVillagecust_stateorders。orders是一個計算字段,它是由圓括號中的55個顧客。完全限定列名,而不只是列名(cust_id。它指定表名和列名WHEREOrders.cust_id=cust_id自身進(jìn)行比較。因為SELECTCOUNT(*)FROMOrdersWHEREcust_id=SELECT(SELECTCOUNT(*)FROM100|11WHEREcust_id=cust_id)ASordersFROMCustomersORDERBYKidsTheToyVillageSELECT語句中操作多個表,就應(yīng)使用完全限定列名來避免歧義。JOIN時,我們WHERE子句12.1聯(lián)結(jié)|1212.1聯(lián)結(jié)|這一課會介紹什么是聯(lián)結(jié),為什么使用聯(lián)結(jié),如何編寫使用聯(lián)結(jié)的SQL的極為重要的部分。102|12,則很難保證每次key外,它不存儲其他有關(guān)供應(yīng)商的信息。VendorsVendors表ProductsIDVendors表中找出相應(yīng)供應(yīng)稱為可伸縮性好(scalewell)。SELECT語句說明:使用交互式說明:使用交互式DBMS工具DBMS管理。104|12SELECTvend_name,prod_name,prod_priceFROMVendors,ProductsWHEREVendors.vend_id=DollHouseFishbeanbagDollHouseBirdbeanbagDollHouseRabbitbeanbagBearsR8inchteddyBearsR12inchteddyBearsR18inchteddyDollHouseRaggedyFunandKingFunandQueen這里最大的差別是所指定的兩列(prod_name和prod_price)在一個DBMS會返回錯誤。SELECT語句中聯(lián)結(jié)幾個表時,相應(yīng)的關(guān)系是第一個表中的每一行與第二個表中的每一行配對。WHERE子句作為過濾條件,只包含那些匹配給定條件(這里是聯(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語句返回與SELECTvend_name,prod_name,prod_priceFROMVendorsINNERJOINProductsONVendors.vend_id=ONWHERE的相同。ANSISQLINNERJOIN語法,之前使用的是簡單的等值語是說,DBMS的確支持簡單格式和標(biāo)準(zhǔn)格式,我建議你要理解這兩種SQLSELECT語句中可以聯(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存儲在每個20007中的物品。DBMSDBMS在運行時關(guān)聯(lián)指定的每個表,以處理聯(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除了可以對列名和計算字段使用別名,還允許給表名起別名。這樣SELECT語句。它與前一課例子中所用的語句基本相同,但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語句做了一個簡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表。不知道想要的是哪一列(即使它們其實是同一列。WHERE首先聯(lián)結(jié)兩個cust_contact過濾數(shù)據(jù),返回所需的數(shù)據(jù)。無論何時對表進(jìn)行聯(lián)結(jié),應(yīng)該至少有一列不止出現(xiàn)在一個表中(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é)|需要注意,用來創(chuàng)建外聯(lián)結(jié)的語法在不同的SQL實現(xiàn)中可能稍有不DBMS文檔,以確定其語法。SELECTCustomers.cust_id,Orders.order_numFROMCustomersINNERJOINOrdersONCustomers.cust_id=SELECTCustomers.cust_id,Orders.order_numFROMCustomersLEFTOUTERJOINOrdersONCustomers.cust_id= 118|13來指定聯(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,有一種更簡單13.3使用帶聚集函數(shù)的聯(lián)結(jié)|joinSELECTCustomers.cust_id,Orders.order_numFROMOrdersFULLOUTERJOINCustomersONOrders.cust_id=注意:FULL注意:FULLOUTERJOINAccess、MariaDB、MySQL、OpenOfficeBaseSQLiteFULLOUTERJOIN語法。如第9課所述,聚集函數(shù)用來匯總數(shù)據(jù)。雖然至今為止我們舉的聚集函數(shù)的例子都只是從一個表中匯總數(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個訂單。種語法(DBMS使用這兩課中描述的某種語法。122|1414122|14本課講述如何利用UNION操作符將多條SELECT語句組合成一個結(jié)個查詢結(jié)果集返回。這些組合查詢通常稱為并(union)或復(fù)合查詢query14.2創(chuàng)建組合查詢|可用UNION操作符來組合數(shù)條SQL查詢。利用UNION,可給出多條SELECT語句,將它們的結(jié)果組合成一個結(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利用簡單的相等測試找出所有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可能會使處理更簡單。126|14如果遵守了這些基本規(guī)則或限制,則可以將UNION用于任何數(shù)據(jù)檢索14.2.1SELECT語句。注意到在分別執(zhí)行語句UNIONSELECT45行。UNION從查詢結(jié)果集中自動去除了重復(fù)的行;換句話說,它的行為與一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行,其中這一課一開始我們說過,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語句返回的所有結(jié)果。來檢索只在第一個表中存在而在第二個表中不存在的行;而14.3小結(jié)|UNION與別名組合,檢索130|1515130|153個常用的SQL顧名思義,INSERT用來將行插入(或添加)到數(shù)據(jù)庫表。插入有幾種INSERT前,應(yīng)該保證自己有足夠的安全權(quán)限。INSERT語法,它要求指定INSERTINTOCustomers'Toy'123AnyStreet','NewYork',Customers表中。存儲到表中每一列的數(shù)DBMS之間可移植。132|15INSERTINTO'Toy'123AnyStreet','NewYork',INSERT語句的工作完全相同,但在表名后的括號里明確給出了列名。在插入行時,DBMSVALUES列表中的相應(yīng)值填I(lǐng)NSERT語句仍然能正確工作。15.1數(shù)據(jù)插入|INSERTINTO'Toy'123AnyStreet','NewYork',正如所述,使用INSERT134|15語法,還可以省略列,這表示可以只給某些列提供值,給其他列不提供值。INSERTINTO'Toy'123AnyStreet','NewYork',INSERT操作中省略某些列。省略的列15.1數(shù)據(jù)插入|如果表中不允許有NULLINSERT一般用來給表插入具有指定列值的行。INSERT還存在另一種形式,可以利用它將SELECT語句的結(jié)果插入表中,這就是所謂的INSERTSELECTINSERTSELECTINSERT插入,可以如下進(jìn)行:INSERTINTOSELECTFROM136|15這個例子從一個名為CustNew的表中讀出數(shù)據(jù)并插入到CustomersCustNew表。CustNewACustomersCustNew時,Customerscust_id值(如果主鍵值重INSERT操作將會失敗。這個例子使用INSERTSELECT從CustNew中將所有數(shù)據(jù)導(dǎo)入Customers。SELECTCustNew檢索出要插入的值,而不是列出CustNew表有多少行。如果這個表Customers。提示:提示:INSERTSELECTINSERT和SELECT語句中使用了相同的列名。但是,不一定要求列名匹配。事實上,DBMSSELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管INSERT插入。INSERT語句。要將一個表的內(nèi)容復(fù)制到一個全新的表(運行中創(chuàng)建的表SELECTINTO語句。說明:DB2說明:DB2不支持DB2SELECTINTODBMS)。說明:說明:INSERTSELECTSELECTSELECTSELECTINTOCustCopyFROMCustomers;的整個內(nèi)容復(fù)制到新表中。因為這里使用的是SELECT*,所以將在138|15CREATETABLECustCopySELECT*FROMSELECTINTOSELECTWHEREGROUPSQL代碼,而不會影響實際的數(shù)據(jù)。INSERT的幾UPDATEDELETE進(jìn)一步操作表數(shù)據(jù)。16.1更新數(shù)據(jù)|16課16.1更新數(shù)據(jù)|UPDATE時一定要細(xì)心。因為稍不注意,就會更新表中的所有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命令,每個“列=16.2刪除數(shù)據(jù)|11課。UPDATESETcust_email=WHEREcust_id=其中NULL用來去除cust_email(空字符串用''表示,是一個值NULL表示沒有值。142|16DELETE時一定要細(xì)心。因為稍不注意,就會錯誤地刪除表中DELETE前,應(yīng)該保證自己有足夠的安全權(quán)限。Customers表中刪除一行:DELETEFROMWHEREcust_id=這條語句很容易理解。DELETEFROM要求指定從中刪除數(shù)據(jù)的表名,WHERE子句,它將刪除表中每個顧客。也可以讓DBMS通過使用外鍵來嚴(yán)格實施關(guān)系(這些定義在附錄A中。存在外鍵時,DBMS使用它們實施引用完整性。例如要向Products表中插入一個新產(chǎn)品,DBMS16.3更新和刪除的指導(dǎo)原則|vend_idvend_idVendors表的。那么,這與DELETE有什么關(guān)系呢?使用外鍵確保引用完整性的一個好處是,DBMS通常可以防止刪除某個關(guān)系需要用到的行。例如,要從ProductsOrderItems的已有訂單中,那么DELETE語句將拋出錯誤并中止。這是總要定義外鍵的另SQL代碼在DBMSUPDATE語句。DELETEDELETE語句從表中刪除行,甚至是刪除表中所有行。但是,DELETE144|16UPDATEDELETE語句。,盡可能WHERE子句那樣使用它(可以指定各主鍵、多個值或值的范圍。,DBMS將不允許刪除其數(shù)據(jù)與其他表相關(guān)聯(lián)的行。DBMSWHERE子句17.1創(chuàng)建表|17課17.1創(chuàng)建表|SQL不僅用于表數(shù)據(jù)操縱,還用來執(zhí)行數(shù)據(jù)庫和表的所有操作,包括表SQL實現(xiàn)中,CREATETABLE語句的語法可能有所不同。對DBMS支持何種語法,請參閱相應(yīng)的文檔。146|17說明:DBMS創(chuàng)建表的具體例子說明:DBMS創(chuàng)建表的具體例子CREATETABLECREATETABLECREATETABLEProductsprod_idCHAR(10)NOTvend_idCHAR(10)NOTprod_nameCHAR(254)NOTNULL,prod_priceDECIMAL(8,2)NOTNULL,prod_descVARCHAR(1000)NULLCREATETABLE關(guān)鍵字。實際的表定義(所有列)5列組17.1創(chuàng)建表|建腳本的原因(。,然NULL值的列不接受沒有列值的行,換148|17CREATETABLEOrdersorder_numINTEGERNOTNULL,order_dateDATETIMENOTNULL,cust_idCHAR(10)NOTNULLOrders表。Orders包含三列:訂單號、訂IDNOTNULLNOTNULLCREATETABLEVendorsNOTNOTDBMS文檔。第1如果指定''(兩個單引號,其間沒有字符NOTNULL列中是允NULLNULLSQL允許指定默認(rèn)值,在插入行時如果不給出值,DBMS將自動采用默CREATETABLEOrderItems NOT NOT NOT NOT DEFAULT NOT150|17這條語句創(chuàng)建OrderItems表,包含構(gòu)成訂單的各項(訂單本身存儲在或變量,將系統(tǒng)日期用作默認(rèn)日期。MySQL用戶指定DEFAULTCURRENT_DATE(),OracleDEFAULTSYSDATESQLServerDBMS,請參閱相應(yīng)的文檔。表17-1 SQL ALTERTABLEDBMSALTERTABLEALTERTABLE時需要考慮的事情。理想情況下,不要在表中包含數(shù)據(jù)時對其進(jìn)行更新。應(yīng)該在表的設(shè)計過程中充分考慮未來可能的需求,避免今后對表的結(jié)構(gòu)做大改動。DBMS文檔。ALTERTABLE在ALTERTABLE之后給出要更改的表名(該表必須存在,否則將ALTERTABLEADDvend_phone152|17Vendorsvend_phone的列,其數(shù)據(jù)類型CHAR。DBMS都有效:ALTERTABLEVendorsDROPCOLUMNvend_phone; ;說明:說明:ALTERTABLE17.4重命名表|ALTER刪除表(刪除整個表而不是其內(nèi)容)DROPTABLE語句DROPTABLECustCopy表(15課中創(chuàng)建的。刪除表沒有確認(rèn),也154|17SQLSQLiteTABLE語句。DBMS文檔。18.1視圖|18課18.1視圖|SQL操作。說明:DBMS說明:DBMSMicrosoftAccessSQLMicrosoftAccess。MySQL。156|18SELECTcust_name,cust_contactFROMCustomers,Orders,OrderItemsWHERECustomers.cust_id=Orders.cust_idANDOrderItems.order_num=Orders.order_numANDprod_id='RGAN01';SELECTcust_n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024全新綠色環(huán)保產(chǎn)業(yè)項目合作協(xié)議3篇
- 洛陽職業(yè)技術(shù)學(xué)院《人文地理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024全新環(huán)保產(chǎn)業(yè)勞動合同執(zhí)行細(xì)則及環(huán)保責(zé)任承諾3篇
- 2025酒水購銷合同范文
- 夏令營地活動贊助合同
- 企業(yè)新品發(fā)布會接待流程
- 2024年度購物中心健身中心特許經(jīng)營合同3篇
- 集市綠色能源集貿(mào)市場管理辦法
- 建筑印刷施工人工費合同
- 廚房裝飾裝修協(xié)議
- 人機(jī)工程學(xué)知到章節(jié)答案智慧樹2023年寧波大學(xué)
- 大學(xué)英語I智慧樹知到答案章節(jié)測試2023年桂林電子科技大學(xué)
- MS2711A手持式頻譜分析儀使用說明
- 層敬老院建設(shè)項目施工組織設(shè)計
- 排污許可證后管理培訓(xùn) PPT
- 醫(yī)院藥品分類編碼規(guī)則
- 地下鐵-幾米漫畫
- 食源性疾病工作總結(jié)-1
- 某影視演播廳空調(diào)設(shè)計施工方案正式版
- 出院患者隨訪登記表
- GB/T 5195.2-2006螢石碳酸鹽含量的測定
評論
0/150
提交評論