版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1
SQL語(yǔ)言基礎(chǔ)SQL概述SQL(StructuredqueryLanguage,結(jié)構(gòu)化查詢語(yǔ)言),功能包括查詢、操縱、定義、控制。功能豐富、語(yǔ)言簡(jiǎn)潔、使用靈活,倍受歡迎。1974年由Boyce,Chamberlin提出,1975年在IBM公司的SystemR上首次實(shí)現(xiàn)。原型稱為SEQUEL(StructuredEnglishQUEryLanguage).1986年ANSISQL-86標(biāo)準(zhǔn),是第一個(gè)SQL標(biāo)準(zhǔn)。1987年成為國(guó)際標(biāo)準(zhǔn)。1992年SQL-92標(biāo)準(zhǔn)(簡(jiǎn)稱SQL2)。21999年SQL-99標(biāo)準(zhǔn)(簡(jiǎn)稱SQL3)。增加了對(duì)對(duì)象關(guān)系模型的支持。目前僅部分實(shí)現(xiàn)。最流行的國(guó)際標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)語(yǔ)言。主要特點(diǎn):SQL是非結(jié)構(gòu)化的語(yǔ)言,使用SQL查詢數(shù)據(jù)庫(kù)時(shí),只需要告訴它做什么而不用告訴它如何去做。SQL本身不提供任何程序流程控制結(jié)構(gòu),而是通過(guò)PL/SQL提供SQL語(yǔ)言的過(guò)程化功能SQL提供相對(duì)固定的數(shù)據(jù)類(lèi)型,一般不需要擴(kuò)展SQL本身十分靈活,方便易學(xué)。3標(biāo)準(zhǔn)SQL只包含9種語(yǔ)句:數(shù)據(jù)查詢:select數(shù)據(jù)定義:create,drop,alter數(shù)據(jù)操縱:insert,update,delete數(shù)據(jù)控制:grant,revoke4數(shù)據(jù)定義語(yǔ)言(DDL),用于定義數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)操縱語(yǔ)言(DML),用于檢索和修改數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)控制語(yǔ)言(DCL),用于規(guī)定數(shù)據(jù)庫(kù)用戶的各種權(quán)限數(shù)據(jù)庫(kù)事務(wù)處理,用來(lái)保證數(shù)據(jù)庫(kù)的完整性SQL語(yǔ)言分類(lèi)5SQL語(yǔ)言分類(lèi)數(shù)據(jù)定義語(yǔ)言(DDL):用于定義數(shù)據(jù)結(jié)構(gòu)能使用戶完成下列任務(wù)創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象刪除數(shù)據(jù)庫(kù)對(duì)象更改數(shù)據(jù)庫(kù)對(duì)象6常用的DDL語(yǔ)句包括:CreateTable:創(chuàng)建數(shù)據(jù)庫(kù)表CreateIndex:創(chuàng)建數(shù)據(jù)庫(kù)表的索引DropTable:刪除數(shù)據(jù)庫(kù)表DropIndex:刪除數(shù)據(jù)庫(kù)表的索引Truncate:刪除表中所有行AlterTable:增加表列,重定義表列,更改存儲(chǔ)分配AlterTableADDCONSTRAINT:在已有的表上增加約束7數(shù)據(jù)操縱語(yǔ)言(DML):允許用戶對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行Insert,Update,Delete和Select等操作常用DML語(yǔ)句包括:Insert:增加數(shù)據(jù)行到表Delete:從表中刪除數(shù)據(jù)行Update:更改表中數(shù)據(jù)Select:從表中或視圖中檢索數(shù)據(jù)行8數(shù)據(jù)控制語(yǔ)言(DCL):用于規(guī)定數(shù)據(jù)庫(kù)用戶的各種權(quán)限常用的數(shù)據(jù)控制語(yǔ)句包括:GRANT:將權(quán)限或角色授予用戶或其它角色REVOKE:從用戶或數(shù)據(jù)庫(kù)角色回收權(quán)限SetRole:禁止或允許一個(gè)角色9數(shù)據(jù)庫(kù)事務(wù)控制:用來(lái)保證數(shù)據(jù)庫(kù)的完整性常用的事務(wù)處理語(yǔ)句包括:COMMITWORK:把當(dāng)前事務(wù)所作的更改永久化(寫(xiě)入磁盤(pán))ROLLBACK:作廢上次提交以來(lái)的所有更改10事務(wù):指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,而這些邏輯工作單元需要具有原子性,一致性,隔離性和持久性四個(gè)屬性。原子性:指事務(wù)必須是原子工作單元,即對(duì)于事務(wù)所進(jìn)行數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行11一致性:指事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致性狀態(tài),而且在相關(guān)數(shù)據(jù)庫(kù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)都必須是正確的。12隔離性:指由并發(fā)事務(wù)所做的修改必須與任何其他并發(fā)事務(wù)所做的修改相隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是被另一并發(fā)事務(wù)修改之前的狀態(tài),要么是被另一事務(wù)修改之后的狀態(tài),即事務(wù)不會(huì)查看正在由另一個(gè)并發(fā)事務(wù)正在修改的數(shù)據(jù)。持久性:指事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的,即使出現(xiàn)系統(tǒng)故障也是如此。13SQL語(yǔ)句的基本語(yǔ)法基本語(yǔ)法如下:每條SQL語(yǔ)句必須以分號(hào)結(jié)束每條SQL語(yǔ)句可以單獨(dú)寫(xiě)成一行,也可以分成若干行SQL語(yǔ)句對(duì)大小寫(xiě)不敏感,對(duì)于SQL語(yǔ)句的關(guān)鍵字(如Insert等),表名,列名等,可以大小寫(xiě)混合;但對(duì)列的內(nèi)容則是大小寫(xiě)敏感的。14對(duì)象命名約定SQLServer用三段式名字標(biāo)識(shí)對(duì)象:<數(shù)據(jù)庫(kù)名>.<所有者名>.<對(duì)象名>前兩者可以省略,系統(tǒng)自動(dòng)有一個(gè)默認(rèn)值。數(shù)據(jù)庫(kù)名的默認(rèn)值是當(dāng)前數(shù)據(jù)庫(kù),所有者名的默認(rèn)值是數(shù)據(jù)庫(kù)的所有者(dbo)例如:在pubs數(shù)據(jù)庫(kù)中的authors表的所有者是dbo,它可以在多個(gè)數(shù)據(jù)庫(kù)中按如下方法引用:pubs.dbo.authorsPubs.authors15別名:使用別名的主要目的是增加select語(yǔ)句的可讀性??墒褂萌缦抡Z(yǔ)句指派數(shù)據(jù)表的別名:數(shù)據(jù)表名稱as數(shù)據(jù)表別名16例如:usesampleSelecte.員工編號(hào),e.員工姓名From員工數(shù)據(jù)表ase注意:如果為數(shù)據(jù)表指定了別名,則在相應(yīng)的T-SQL語(yǔ)句中,對(duì)該數(shù)據(jù)表的所有顯式引用都必須使用別名,而不能使用數(shù)據(jù)表名。例如:Select員工數(shù)據(jù)表.員工編號(hào),e.員工姓名From員工數(shù)據(jù)表ase17SELECT語(yǔ)句數(shù)據(jù)檢索是數(shù)據(jù)庫(kù)中最頻繁執(zhí)行的活動(dòng)在SQL中,使用SELECT語(yǔ)句可以在需要的表單中檢索數(shù)據(jù)在進(jìn)行檢索之前,必須知道需要的數(shù)據(jù)存儲(chǔ)在哪里
SELECT語(yǔ)句可以由多個(gè)查詢子句組成18SELECT語(yǔ)句SELECT語(yǔ)句可用于檢索:全部的行和列全部的行和特定的列限定范圍的行與一組值匹配的行根據(jù)未知值檢索的行隱藏有重復(fù)值的行根據(jù)多個(gè)搜索條件檢索的行19SELECT語(yǔ)句Select語(yǔ)句的基本結(jié)構(gòu)如下:SELECT[ALL|DISTINCT]select_list[INTO[new_table_name]]FROM{table_name|view_name} [[,{table_name2|view_name2} [….,{table_name16|view_name16}]][WHEREsearch_conditions][GROUPBYgroup_by_list] [HAVINGsearch_conditions]
[ORDERBYorder_list[ASC|DESC]]20SELECT子句SELECT
子句指定需要通過(guò)查詢返回的表的列。其語(yǔ)法如下:SELECT[ALL|DISTINCT][TOPn]<select_list>各參數(shù)說(shuō)明如下:其中,select_list表示需要檢索的字段的列表,字段名稱之間用逗號(hào)分隔。這個(gè)列表中既可以包含數(shù)據(jù)源表或視圖中的字段名稱,還可以包含其它表達(dá)式。如用*,則系統(tǒng)將返回?cái)?shù)據(jù)表中的所有字段。21
ALL:指明查詢結(jié)果中可以顯示值相同的列ALL是系統(tǒng)默認(rèn)的
DISTINCT:指明查詢結(jié)果中如果有值相同的列,則只顯示其中的一列。對(duì)DISTINCT
選項(xiàng)來(lái)說(shuō),Null值被認(rèn)為是相同的值
TOPn[PERCENT]:指定返回查詢結(jié)果的前n行數(shù)據(jù),如果PERCENT
關(guān)鍵字指定的話,則返回查詢結(jié)果的前百分之n行數(shù)據(jù)。22例如:例:查詢所有產(chǎn)品的編號(hào)名稱和成本selectp_id,p_name,costfromproducts運(yùn)行結(jié)果如下p_idp_namecost----------------------------------10030001路由器20000.000010030002網(wǎng)卡100.0000……因數(shù)據(jù)太多故省略之23例:查詢數(shù)據(jù)庫(kù)表的全部列select*fromemployee運(yùn)行結(jié)果如下emp_ide_namesexbirthdayjob_leveldept_idhire_datee_wage10010001張三11968-02-1400:00:00.000110011996-08-0200:00:00.0008000.000024例:查詢產(chǎn)品的編號(hào)、名稱、庫(kù)存數(shù)量和成本,并計(jì)算每種產(chǎn)品的總成本價(jià)值selectp_id,p_name,quantity,cost,cost*quantityassum_costfromproducts運(yùn)行結(jié)果如下p_idp_namequantitycostsum_cost10030001路由器100020000.000020000000.000025INTO子句INTO
子句用于把查詢結(jié)果存放到一個(gè)新建的表中。SELECT...INTO
句式不能與COMPUTE
子句一起使用。其語(yǔ)法如下INTOnew_table參數(shù)new_table
指定了新建的表的名稱,新表的列由SELECT
子句中指定的列構(gòu)成。新表中的數(shù)據(jù)行是由WHERE
子句指定的。但如果SELECT
子句中指定了計(jì)算列,在新表中對(duì)應(yīng)的列則不是計(jì)算列,而是一個(gè)實(shí)際存儲(chǔ)在表中的列,其中的數(shù)據(jù)由執(zhí)行SELECT...INTO
語(yǔ)句時(shí)計(jì)算得出。26FROM子句FROM
子句指定需要進(jìn)行數(shù)據(jù)查詢的表只要SELECT
子句中有要查詢的列就必須使用FROM
子句其語(yǔ)法如下FROM{<table_source>}[,...n]table_source:指明SELECT
語(yǔ)句要用到的表、視圖等數(shù)據(jù)源,該列表中的數(shù)據(jù)表名和視圖名之間使用逗號(hào)分隔。27From子句還可以指定數(shù)據(jù)表或視圖之間聯(lián)接的類(lèi)型,這些類(lèi)型將決定于on子句中指定的聯(lián)接條件。例如:Select員工數(shù)據(jù)表.員工編號(hào),項(xiàng)目數(shù)據(jù)表.項(xiàng)目名稱From員工數(shù)據(jù)表joinon(員工數(shù)據(jù)表.員工編號(hào)=項(xiàng)目數(shù)據(jù)表.負(fù)責(zé)人)28T-SQL可以支持在from子句中指定除了數(shù)據(jù)表或視圖以外的其他對(duì)象,例如查詢結(jié)果集構(gòu)成的派生表。這些派生表實(shí)際上是from子句中select語(yǔ)句的查詢結(jié)果集,這些結(jié)果集構(gòu)成了外層select語(yǔ)句查詢時(shí)所用的數(shù)據(jù)表。29例如:SelectEmp.員工編號(hào),emp.員工姓名,sp.部門(mén)名稱From員工數(shù)據(jù)表asemp,(select部門(mén)數(shù)據(jù)表.部門(mén)編號(hào),部門(mén)數(shù)據(jù)表.部門(mén)名稱From部門(mén)數(shù)據(jù)表Where部門(mén)數(shù)據(jù)表.部門(mén)編號(hào)>2)asspWhereemp.部門(mén)編號(hào)=sp.部門(mén)編號(hào)首先使用select語(yǔ)句檢索高級(jí)部門(mén),并用別名sp表示該派生表,然后從員工數(shù)據(jù)表和sp派生表中檢索數(shù)據(jù)。30Where子句Where
子句指定數(shù)據(jù)檢索的條件,以限制返回的數(shù)據(jù)行。Where子句中的查詢條件比較運(yùn)算符:<、<=、>、>=、=、>、!=、!<、!>范圍說(shuō)明:BetweenAandB、NotBetweenAandB可選值列表:IN、NOTIN模式匹配:LIKE,NOTLIKE是否空值:ISNULL、ISNOTNULL上述條件的邏輯組合:AND、OR、NOT31比較查詢條件:text、ntext和image數(shù)據(jù)類(lèi)型不能與比較運(yùn)算符組合成查詢條件。列表查詢條件:in關(guān)鍵字在大多數(shù)情況下應(yīng)用于嵌套查詢(又稱為子查詢)中,通常首先使用select語(yǔ)句選定一個(gè)范圍,然后將選定的范圍作為in關(guān)鍵字的符號(hào)條件的列表,從而得出最終的結(jié)果集。32模式查詢條件:Like、NotLike通配符*——匹配任意字符串?——匹配任意一個(gè)字符大小寫(xiě)敏感33Like關(guān)鍵字中的通配符及其含義通配符含義%由0個(gè)或更多字符組成的任意字符串_任意單個(gè)字符[]用于指定范圍,例如[a-f],表示a到f范圍內(nèi)的任何單個(gè)字符[^]表示指定范圍,例如[^a-f],表示a到f范圍以外的任何單個(gè)字符34Like關(guān)鍵字舉例like格式檢索范圍Like‘Mc%’以Mc開(kāi)頭的所有字符串Like‘%inger’以字母inger結(jié)尾的所有字符串Like‘_heryl’以字母heryl結(jié)尾的所有6個(gè)字母的名稱Like‘[M-Z]inger’以inger結(jié)尾、以從M到Z的任何單個(gè)字母開(kāi)頭的所有字符串Like‘M[^c]%’以M開(kāi)頭,且第二個(gè)字母不是c的所有字符串Like‘%en%’在任何位置包含字母en的所有字符串35空值判斷查詢條件:null值表示字段的數(shù)據(jù)值未知或不可用,它并不表示零(數(shù)字值或二進(jìn)制值)、零長(zhǎng)度的字符串或空白(字符值)36例如例:查詢工資介于2000元和3000元之間的員工姓名selecte_namefromemployeewheree_wagebetween2000and3000運(yùn)行結(jié)果如下e_name--------------------王二伍將(2row(s)affected)37例:列出工資大于7000的員工所屬的部門(mén)編號(hào)selectdistinctdept_idfromemployeewheree_wage>7000運(yùn)行結(jié)果如下dept_id-------10011005(2row(s)affected)38例:查詢?cè)诰幪?hào)為1001和1002的部門(mén)中工作的員工姓名selecte_namefromemployeewheredept_idin(’1001’,’1002’)運(yùn)行結(jié)果如下e_name--------------------張三李四39例:查找公司中所有姓王,且全名為兩個(gè)字的員工的姓名、所在部門(mén)編號(hào)selecte_name,dept_idfromemployeewheree_namelike’王__’/*注意這里使用了兩個(gè)下劃線_符號(hào)運(yùn)行結(jié)果如下e_namedept_id---------------------------王二1001王朝1003(2row(s)affected)40如果用戶要查找的數(shù)據(jù)中本身就包含了通配符,如SQL_Mail,就需要使用轉(zhuǎn)義字符來(lái)區(qū)分通配符與實(shí)際存在的字符。其格式如下LIKE
字符匹配串ESCAPE轉(zhuǎn)義字符例:查找對(duì)象名稱為SQL_M
開(kāi)頭,il結(jié)尾,中間有一個(gè)不確定字符的對(duì)象select*fromobjectswhereobject_namelike’SQL#_M_il’escape‘#’/*
這里使用了兩個(gè)下劃線_符號(hào),前一個(gè)下劃線由于有逃逸字符在其前面作標(biāo)識(shí),因而被認(rèn)為是實(shí)際存在的下劃線字符;后面一個(gè)下劃線沒(méi)有逃逸字符在其前面作標(biāo)識(shí),因此將它作為通配符
*/41使用[]來(lái)將通配符指定為普通字符。例如:Select*fromobjectWherecolumn1like‘%54[%]%’將返回所有包含54%的字符串42GROUPBY子句GROUPBY
子句指定查詢結(jié)果的分組條件。其語(yǔ)法如下:GROUPBY[ALL]group_by_expression[,...n][WITH{CUBE|ROLLUP}]各參數(shù)說(shuō)明如下:group_by_expression:指明分組條件group_by_expression
通常是一個(gè)列名,但不能是列的別名。數(shù)據(jù)類(lèi)型為T(mén)EXT、NTEXT、IMAGE或BIT
類(lèi)型的列不能作為分組條件ALL:返回所有可能的查詢結(jié)果組合,即使此組合中沒(méi)有任何滿足WHERE
子句的數(shù)據(jù)。分組的統(tǒng)計(jì)列如果不滿足查詢條件,則將由NULL值構(gòu)成其數(shù)據(jù)。ALL
選項(xiàng)不能與CUBE或ROLLUP
選項(xiàng)同時(shí)使用
43CUBE:除了返回由GROUPBY
子句指定的列外,還返回按組統(tǒng)計(jì)的行。返回的結(jié)果先按分組的第一個(gè)條件列排序顯示,再按第二個(gè)條件列排序顯示,以此類(lèi)推。統(tǒng)計(jì)行包括了GROUPBY
子句指定的列的各種組合的數(shù)據(jù)統(tǒng)計(jì)
ROLLUP:與CUBE
不同的是,此選項(xiàng)對(duì)GROUPBY
子句中的列順序敏感,它只返回第一個(gè)分組條件指定的列的統(tǒng)計(jì)行,改變列的順序會(huì)使返回的結(jié)果的行數(shù)發(fā)生變化。44例如:例:查詢工作級(jí)別為2的員工姓名,查詢結(jié)果按部門(mén)分組selecte_name,dept_idfromemployeewherejob_level='2'groupbydept_id,e_name運(yùn)行結(jié)果如下e_namedept_id---------------------------李四1001張龍1002王朝100345CUBE:除了返回由GROUPBY
子句指定的列外,還返回按組統(tǒng)計(jì)的行。返回的結(jié)果先按分組的第一個(gè)條件列排序顯示,再按第二個(gè)條件列排序顯示,以此類(lèi)推。統(tǒng)計(jì)行包括了GROUPBY子句指定的列的各種組合的數(shù)據(jù)統(tǒng)計(jì)Select所屬部門(mén),性別,AVG(工資)FROM員工數(shù)據(jù)表Groupby所屬部門(mén),性別Withcube所屬部門(mén)性別平均工資項(xiàng)目部男2000項(xiàng)目部女3000項(xiàng)目部null2500項(xiàng)目部全體員工的平均工資檢驗(yàn)部男1750檢驗(yàn)部女1000檢驗(yàn)部null1500檢驗(yàn)部全體員工的平均工資錄入部男1000錄入部null1000辦公室女3000辦公室null3000nullnull1928所有員工的平均工資null男1625所有男性的平均工資null女2333所有女性的平均工資46ROLLUP:與CUBE
不同的是,此選項(xiàng)對(duì)GROUPBY
子句中的列順序敏感,它只返回第一個(gè)分組條件指定的列的統(tǒng)計(jì)行,改變列的順序會(huì)使返回的結(jié)果的行數(shù)發(fā)生變化。Select所屬部門(mén),性別,AVG(工資)FROM員工數(shù)據(jù)表Groupby所屬部門(mén),性別Withrollup所屬部門(mén)性別平均工資項(xiàng)目部男2000項(xiàng)目部女3000項(xiàng)目部null2500項(xiàng)目部全體員工的平均工資檢驗(yàn)部男1750檢驗(yàn)部女1000檢驗(yàn)部null1500檢驗(yàn)部全體員工的平均工資錄入部男1000錄入部null1000辦公室女3000辦公室null3000nullnull1928所有員工的平均工資null男1625null女233347若希望在查詢結(jié)果總僅包含按照性別分組后取得的平均值,則需要將groupby子句中的“所屬部門(mén)”和“性別”字段的位置調(diào)換。Select所屬部門(mén),性別,AVG(工資)FROM員工數(shù)據(jù)表Groupby性別,所屬部門(mén)Withrollup所屬部門(mén)性別平均工資項(xiàng)目部男2000檢驗(yàn)部男1750錄入部男l(wèi)1000null男1625所有男性的平均工資項(xiàng)目部女1000檢驗(yàn)部女l1500錄入部女1000null女2333所有女性的平均工資nullnull1928所有員工的平均工資48HAVING子句HAVING
子句指定分組搜索條件。HAVING
子句通常與GROUPBY
子句一起使用。TEXT、NTEXT和IMAGE
數(shù)據(jù)類(lèi)型不能用于HAVING
子句。其語(yǔ)法如下HAVING<search_condition>HAVING
子句與WHERE
子句很相似,其區(qū)別在于其作用的對(duì)象不同。WHERE
子句作用于表和視圖,HAVING
子句作用于組49例如:例:查詢有多個(gè)員工的工資不低于6000的部門(mén)編號(hào)selectdept_id,count(*)fromemployeewheree_wage>=6000groupbydept_idhavingcount(*)>1運(yùn)行結(jié)果如下dept_id------------------1005210073(2row(s)affected)50ORDERBY子句ORDERBY
子句指定查詢結(jié)果的排序方式。其語(yǔ)法如下:ORDERBY{order_by_expression[ASC|DESC]}[,...n]各參數(shù)說(shuō)明如下:
order_by_expression:指定排序的規(guī)則order_by_expression
可以是表或視圖的列的名稱或別名,如果SELECT語(yǔ)句中沒(méi)有使用DISTINCT
選項(xiàng)或UNION
操作符,那么ORDERBY
子句中可以包含selectlist中沒(méi)有出現(xiàn)的列名或別名。ORDERBY
子句中也不能使用TEXT、NTEXT和IMAGE
數(shù)據(jù)類(lèi)型
ASC:指明查詢結(jié)果按升序排列這是系統(tǒng)默認(rèn)值
DESC:指明查詢結(jié)果按降序排列51例如:例:查詢工作級(jí)別為2的員工姓名,查詢結(jié)果按工資排序selecte_namefromemployeewherejob_level=’2’orderbye_wage運(yùn)行結(jié)果如下e_name--------------------王朝李四姜上52例:查詢由編號(hào)1003的部門(mén)生產(chǎn)的產(chǎn)品編號(hào)、名稱、成本、庫(kù)存數(shù)量,結(jié)果按產(chǎn)品的成本降序、庫(kù)存數(shù)量升序排列selectp_id,p_name,cost,quantityfromproductswheredept_id=’1003’orderbycostdesc,quantity運(yùn)行結(jié)果如下p_idp_namecostquantity----------------------------------------10030001路由器20000.0000100010030005
中繼器10000.00002000053例:查詢工資最高的三名員工的姓名和工資selecttop3e_name,e_wagefromemployeeorderbye_wagedesc運(yùn)行結(jié)果如下e_namee_wage-----------------------------------------張三8000.0000大師傅
7500.0000張龍7000.0000(3row(s)affected)54COMPUTE子句COMPUTE
子句在查詢結(jié)果的末尾生成一個(gè)匯總數(shù)據(jù)行,其語(yǔ)法如下:COMPUTE{{AVG|COUNT|MAX|MIN|SUM}(expression)}[,...n][BYexpression[,...n]]各參數(shù)說(shuō)明如下:
AVG|COUNT|MAX|MIN|SUM:以上參數(shù)與對(duì)應(yīng)的函數(shù)有相同的含義,這些函數(shù)均會(huì)忽略NULL值且DISTINCT選項(xiàng)不能在此使用
55expression:指定需要統(tǒng)計(jì)的列的名稱,此列必須包含于SELECT列表中,且不能用別名。COMPUTE子句中也不能使用TEXT、NTEXT和IMAGE
數(shù)據(jù)類(lèi)型
BYexpression:在查詢結(jié)果中生成分類(lèi)統(tǒng)計(jì)的行。如果使用此選項(xiàng),則必須同時(shí)使用ORDERBY
子句。expression是對(duì)應(yīng)的ORDERBY
子句中的order_by_expression的子集或全集56例如:Select員工姓名,所屬部門(mén),工資From員工數(shù)據(jù)表Orderby所屬部門(mén)Coumputesum(工資)by所屬部門(mén)注意:在加入by關(guān)鍵字及其分組字段的同時(shí)必須將這個(gè)分組字段同時(shí)作為排序條件,否則查詢會(huì)出錯(cuò)。57把一列中的值進(jìn)行匯總運(yùn)算,返回單值的函數(shù)五個(gè)預(yù)定義的聚合函數(shù)平均值:Avg總和:Sum最小值:Min最大值:Max計(jì)數(shù):Count
Count(*)、Count(Distinct…)數(shù)值匯總函數(shù)58匯總函數(shù)忽略NullCount:count函數(shù)將忽略對(duì)象中的空值,而count(*)函數(shù)則將所有符合條件的記錄都計(jì)算在內(nèi)Sum:忽略求和對(duì)象中的空值A(chǔ)vg:忽略求和對(duì)象中的空值Max/Min:忽略求和對(duì)象中的空值匯總函數(shù)——
Null59例如:例:查詢公司的員工總數(shù)selectcount(*)fromemployee運(yùn)行結(jié)果如下21(1row(s)affected)60例:查詢各部門(mén)中的最高工資數(shù)額selectdept_id,max(e_wage)asmax_wage/*
使用as
字符來(lái)指定統(tǒng)計(jì)列的名稱
*/fromemployeegroupbydept_id運(yùn)行結(jié)果如下dept_idmax_wage----------------------------10018000.000010027000.000010034500.000061例:查詢訂貨量大于庫(kù)存量的產(chǎn)品名稱selectp_name,quantity,sum(o_quantity)assum_orderfromproducts,orderswhereproducts.p_id=orders.p_idgroupbyproducts.p_id,p_name,quantityhavingquantity<sum(o_quantity)orderbyproducts.p_id運(yùn)行結(jié)果如下p_namequantitysum_order------------------------------------光纖
1000019000調(diào)制解調(diào)器
1800023000(2row(s)affected)62Selectcount(*)from項(xiàng)目數(shù)據(jù)庫(kù)Where結(jié)束日期<=‘January1,2002’Selectcount(distinct負(fù)責(zé)人)From項(xiàng)目數(shù)據(jù)庫(kù)Where結(jié)束日期<=‘January1,2002’注意:使用count函數(shù)可以同時(shí)使用可選關(guān)鍵字distinct來(lái)去掉重復(fù)值,而使用count(*)函數(shù)則不可以63UNION子句UNION
操作符將兩個(gè)或兩個(gè)以上的查詢結(jié)果合并為一個(gè)結(jié)果集。它與使用連接查詢合并兩個(gè)表的列是不同的,使用UNION
操作符合并查詢結(jié)果需要遵循兩個(gè)基本規(guī)則:列的數(shù)目和順序在所有查詢中必須是一致的;數(shù)據(jù)類(lèi)型必須兼容其語(yǔ)法如下:Select語(yǔ)句UNION[ALL]Select語(yǔ)句64注意:使用union子句獲得的結(jié)果集的字段名稱與union運(yùn)算符之前的select語(yǔ)句結(jié)果集中的字段名相同,union運(yùn)算符之后的select語(yǔ)句結(jié)果集的字段名將被忽略。在默認(rèn)情況下,union運(yùn)算符將從最終結(jié)果集中刪除重復(fù)的記錄。如果希望最終結(jié)果集保留所有的記錄,則必須使用all關(guān)鍵字。65在使用union運(yùn)算符時(shí),單獨(dú)的select語(yǔ)句中不能包含其自己的orderby或coumpute子句只能在最后一個(gè)select語(yǔ)句的后面使用一個(gè)orderby或compute子句,此時(shí),該子句將適用于最終的組合結(jié)果集若需要對(duì)查詢結(jié)果進(jìn)行分組以及在分組后對(duì)結(jié)果使用having子句進(jìn)行過(guò)濾,則必須在單獨(dú)的select語(yǔ)句中指定groupby和having子句。66例如:例:查詢計(jì)算機(jī)系的學(xué)生或者年齡不大于19歲的學(xué)生,并按年齡倒排序。Select*fromdepartmentwheresdept=“計(jì)算機(jī)”;Union;Select*fromstudentwheresage<=19orderbysagedesc67聯(lián)接查詢通過(guò)使用聯(lián)接查詢,可以根據(jù)各個(gè)數(shù)據(jù)表之間的邏輯關(guān)系從兩個(gè)或多個(gè)數(shù)據(jù)表中檢索數(shù)據(jù)。定義數(shù)據(jù)表之間的關(guān)聯(lián)方式:1在數(shù)據(jù)表中指定用于聯(lián)接的字段。典型的聯(lián)接條件是在一個(gè)數(shù)據(jù)表中指定外鍵,同時(shí)在另一個(gè)數(shù)據(jù)表中指定與其關(guān)聯(lián)的主鍵。2在select語(yǔ)句中指定比較各字段值時(shí)要使用的邏輯運(yùn)算符。聯(lián)接的類(lèi)型:內(nèi)連接外聯(lián)接:左向外聯(lián)接,右向外聯(lián)接,完整外聯(lián)接交叉聯(lián)接68內(nèi)連接內(nèi)聯(lián)接的格式為:數(shù)據(jù)表1innerjoin數(shù)據(jù)表2on聯(lián)接表達(dá)式指定返回兩個(gè)表中所有匹配的行。Inner是缺省的連接方式
例:select*from員工數(shù)據(jù)表Innerjoin項(xiàng)目數(shù)據(jù)表On員工數(shù)據(jù)表.員工編號(hào)=項(xiàng)目數(shù)據(jù)表.負(fù)責(zé)人69外聯(lián)接:左向外聯(lián)接,右向外聯(lián)接和完整外聯(lián)接。左向外聯(lián)接的格式為:數(shù)據(jù)表1leftjoin數(shù)據(jù)表2on聯(lián)接表達(dá)式或數(shù)據(jù)表1leftouterjoin數(shù)據(jù)表2on聯(lián)接表達(dá)式注意:返回結(jié)果集中將包括數(shù)據(jù)表1中所有的記錄,而不僅僅是聯(lián)接字段所匹配的記錄。如果數(shù)據(jù)表1的某條記錄在數(shù)據(jù)表2中沒(méi)有匹配的記錄,則結(jié)果集相應(yīng)記錄的有關(guān)數(shù)據(jù)表2的所有字段將為空值。例如:select*from員工數(shù)據(jù)表leftjoin項(xiàng)目數(shù)據(jù)表On員工數(shù)據(jù)表.員工編號(hào)=項(xiàng)目數(shù)據(jù)表.負(fù)責(zé)人則:檢索員工數(shù)據(jù)表中的所有記錄,并將項(xiàng)目數(shù)據(jù)表中負(fù)責(zé)人字段可以匹配的記錄輸出到結(jié)果集。70右向外聯(lián)接的格式為:數(shù)據(jù)表1rightjoin數(shù)據(jù)表2on聯(lián)接表達(dá)式或數(shù)據(jù)表1rightouterjoin數(shù)據(jù)表2on聯(lián)接表達(dá)式注意:返回結(jié)果集中將包括數(shù)據(jù)表2中所有的記錄,而不僅僅是聯(lián)接字段所匹配的記錄。如果數(shù)據(jù)表2的某條記錄在數(shù)據(jù)表1中沒(méi)有匹配的記錄,則結(jié)果集相應(yīng)記錄的有關(guān)數(shù)據(jù)表1的所有字段將為空值。例如:select*from員工數(shù)據(jù)表rightjoin項(xiàng)目數(shù)據(jù)表On員工數(shù)據(jù)表.員工編號(hào)=項(xiàng)目數(shù)據(jù)表.負(fù)責(zé)人則:檢索項(xiàng)目數(shù)據(jù)表中的所有記錄,并將員工數(shù)據(jù)表中員工編號(hào)字段可以匹配的記錄輸出到結(jié)果集。71完整外聯(lián)接格式如下:數(shù)據(jù)表1fulljoin數(shù)據(jù)表2on聯(lián)接表達(dá)式或:數(shù)據(jù)表1fullouterjoin數(shù)據(jù)表2on聯(lián)接表達(dá)式結(jié)果集將包含兩個(gè)數(shù)據(jù)表中的所有記錄,當(dāng)某條記錄在另一個(gè)數(shù)據(jù)表中沒(méi)有匹配記錄時(shí),則將另一個(gè)數(shù)據(jù)表的選擇列表字段指定為空值72交叉聯(lián)接格式為:數(shù)據(jù)表1crossjoin數(shù)據(jù)表2如果在select語(yǔ)句中沒(méi)有使用where子句,則交叉聯(lián)接將返回?cái)?shù)據(jù)表1和數(shù)據(jù)表2中記錄的笛卡兒乘積,即交叉聯(lián)接返回?cái)?shù)據(jù)表1中的所有記錄,以及數(shù)據(jù)表1中的每一條記錄與數(shù)據(jù)表2中的所有記錄的組合。例如:select*from員工數(shù)據(jù)表Crossjoin項(xiàng)目數(shù)據(jù)表將返回員工數(shù)據(jù)表中的所有記錄,以及員工數(shù)據(jù)表中的每條記錄與項(xiàng)目數(shù)據(jù)表中的所有記錄的組合。73嵌套查詢嵌套查詢是指在一個(gè)外層查詢中包含有另一個(gè)內(nèi)層查詢。其中,外層查詢稱為主查詢,內(nèi)層查詢稱為子查詢。SQL允許多層嵌套,由內(nèi)而外地進(jìn)行分析,子查詢的結(jié)果作為主查詢的查找條件可以用多個(gè)簡(jiǎn)單查詢來(lái)構(gòu)成復(fù)雜查詢,以增強(qiáng)SQL的查詢能力子查詢中一般不使用OrderBy子句,OrderBy子句只能對(duì)最終查詢結(jié)果進(jìn)行排序74子查詢(Subquery)包含子查詢的格式通常采用如下格式:Where表達(dá)式[not]in(子查詢)Where表達(dá)式比較運(yùn)算符[any|all]子查詢Where[not]exists(子查詢)75返回單值的子查詢,只返回一行一列主查詢與單值子查詢之間用比較運(yùn)算符進(jìn)行連接運(yùn)算符:>、>=、=、<=、<、<>例:找出與95001同齡的學(xué)生
Select* FromStudent Wheresage=(Selectsage FromStudent Wheresno=‘95001’)子查詢——單值比較76例:查詢訂購(gòu)了產(chǎn)品光纖的公司名稱selectf_namefromfirmswherefirm_idin(selectfirm_idfromorderswherep_id=(selectp_idfromproductswherep_name='光纖'))orderbyfirm_id77例:查詢選修‘C01’課程的學(xué)生的學(xué)號(hào)、姓名。Selectsno,snameFromStudentWheresnoIN(Selectsno
FromSC Wherecno=‘C01’ )子查詢——In78例:查詢有工資超過(guò)7000的員工的部門(mén)名稱,查詢結(jié)果按部門(mén)編號(hào)排序selectd_namefromdepartmentwheredept_idin(selectdept_idfromemployeewheree_wage>7000)orderbydept_id79例:
查詢選修了‘?dāng)?shù)據(jù)庫(kù)’的學(xué)生的學(xué)號(hào)和姓名Selectsno,snameFromStudentWheresnoIN (Selectsno
FromSC WherecnoIN (Selectcno
FromCourse Wherecname=‘?dāng)?shù)據(jù)庫(kù)’))
子查詢——In80多值比較:多行一列父查詢與多值子查詢之間的比較需用All來(lái)連接標(biāo)量值s比子查詢返回集R中的每個(gè)都大時(shí),s>AllR為T(mén)rueAll表示所有>all、<all、<=all、>=all、<>all<>all等價(jià)于notin例:找出年齡最小的學(xué)生
Select*FromStudentWheresage<all( SelectsageFromStudent)子查詢——多值比較all81父查詢與多值子查詢之間的比較需用Some/Any來(lái)連接標(biāo)量值s比子查詢返回集R中的某一個(gè)都大時(shí)s>SomeR為T(mén)rue或
s>AnyR為T(mén)rueSome(早期用Any)表示某一個(gè),只要有一個(gè)即返回真>some、<some、<=some、>=some、<>some=some等價(jià)于in、<>some不等價(jià)于notin子查詢——多值比較Some/Any82例:找出不是最小年齡的學(xué)生
Select*Fromstudent Wheresage>some(Selectsage FromStudent)子查詢——多值比較83Exists+子查詢用來(lái)判斷該子查詢是否返回元組當(dāng)子查詢的結(jié)果集非空時(shí),Exists為T(mén)rue當(dāng)子查詢的結(jié)果集為空時(shí),Exists為False不關(guān)心子查詢的具體內(nèi)容,因此用Select*子查詢——存在判斷Exists84
例:列出選修了C01課程的學(xué)生的學(xué)號(hào)、姓名
Selectsno,sname FromStudent WhereExists(Select* FromSC WhereSC.sno=Student.snoAnd cno=‘C01’) 子查詢——Exists85
例:列出沒(méi)有選C01課程的學(xué)生的學(xué)號(hào)、姓名
Selectsno,sname
FromStudent WhereNotExists (Select* FromSC WhereSC.sno=Student.snoAnd
cno=‘C01’) 子查詢——NotExists86
例:列出得過(guò)100分的學(xué)生的學(xué)號(hào)、姓名
Selectsno,sname
FromStudent WhereExists (Select* FromSC WhereSC.sno=Student.snoAnd grade=100) 子查詢——Exists87如何提高select語(yǔ)句的效率使用exists關(guān)鍵字檢查結(jié)果集:不要用count(*)來(lái)檢查結(jié)果集中是否包含行。使用標(biāo)準(zhǔn)聯(lián)接代替嵌套查詢:在執(zhí)行嵌套查詢時(shí),SQLServer將先執(zhí)行內(nèi)部的子查詢,然后將查詢結(jié)果返回給外部查詢作為檢索的數(shù)據(jù)源,最后執(zhí)行外部的主查詢。而在執(zhí)行包含標(biāo)準(zhǔn)聯(lián)接的查詢時(shí),SQLServer將要執(zhí)行的僅僅是一個(gè)查詢。有效避免整表掃描:使用索引;除了缺失索引外,可能導(dǎo)致整表掃描的另外一種常見(jiàn)的情況是在like子句的匹配條
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版電力行業(yè)用鍍鋅鋼管合同
- 二零二五年度環(huán)保設(shè)施運(yùn)營(yíng)與維護(hù)合同3篇
- 2024版新材料研發(fā)與長(zhǎng)期供應(yīng)合同
- 2024物聯(lián)網(wǎng)傳感器采購(gòu)與安裝服務(wù)合同
- 2024生物制藥產(chǎn)品出口代理合同
- 二零二五年度勞動(dòng)合同變更及特殊崗位協(xié)議3篇
- 2024版知識(shí)產(chǎn)權(quán)許可使用合同標(biāo)的及許可范圍
- 二零二五年度大學(xué)生實(shí)習(xí)就業(yè)實(shí)習(xí)單位實(shí)習(xí)崗位市場(chǎng)調(diào)研與評(píng)估合同2篇
- 建材行業(yè)助理工作總結(jié)
- 數(shù)碼設(shè)計(jì)師的工作總結(jié)
- 2025年四川長(zhǎng)寧縣城投公司招聘筆試參考題庫(kù)含答案解析
- 2024年06月上海廣發(fā)銀行上海分行社會(huì)招考(622)筆試歷年參考題庫(kù)附帶答案詳解
- TSG 51-2023 起重機(jī)械安全技術(shù)規(guī)程 含2024年第1號(hào)修改單
- 計(jì)算機(jī)科學(xué)導(dǎo)論
- 浙江省杭州市錢(qián)塘區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期英語(yǔ)期末試卷
- 《工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)》(2002年修訂本)
- 2024年一級(jí)消防工程師《消防安全技術(shù)綜合能力》考試真題及答案解析
- 2024-2025學(xué)年六上科學(xué)期末綜合檢測(cè)卷(含答案)
- 安徽省森林撫育技術(shù)導(dǎo)則
- 2023七年級(jí)英語(yǔ)下冊(cè) Unit 3 How do you get to school Section A 第1課時(shí)(1a-2e)教案 (新版)人教新目標(biāo)版
- 泌尿科主任述職報(bào)告
評(píng)論
0/150
提交評(píng)論