还剩46页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
博解町的SQL晌辨看了端攵本丰翻于垓减廨衅习SQL指令SELECTDISTINCTWHEREANDORINBETWEENLIKEORDERBY函数COUNTGROUPBYHAVINGALIAS表格链接外部链接CONCATENATESUBSTRINGTRIM表格处理CREATETABLECONSTRAINTNOTNULLUNIQUECHECK主键外来键CREATEVIEWCREATEINDEXALTERTABLEDROPTABLETRUNCATETABLEINSERTINTOUPDATEDELETEFROM进阶SQLUNIONUNIONALLINTERSECTMINUS子查询EXISTSCASE算排名函数既然数据库中有许多资料都是已数字的型态存在,一个很重要的用途就是要能够对这些数字做一些运算,例如将它们总合起来,或是找出它们的平均值SQL有提供一些这一类的函数它们是AVG(平均)COUNT(计数)MAX(最大值)MIN(最小值)SUM(总合)运用函数的语法是SELECT”函数名(“栏位名”)FROM”表格名,举例来说,若我们要由我们的范例表格中求出Sales栏位的总合,Store_lnformation表格我们就键入SELECTSUM(Sales)FROMStore_Information结果SUM(Sales)$2750$2750代表所有Sales栏位的总合:$1500+$250+$300+$
700.除了函数的运用外,SQL也可以做简单的数学运算,例如加(+)和减(-)对于文字类的资料SQL也有好几个文字处理方面的函数,例如文字相连(concatenation)文字修整(trim)以及子字符串(substring不同的数据库对这些函数有不同的语法,所以最好是参考您所用数据库的信息,来确定在那个数据库中,这些函数是如何被运用的COUNT在上一页有提到,COUNT是函数之一由于它的使用广泛,我们在这里特别提出来讨论基本上,COUNT让我们能够数出在表格中有多少笔资料被选出来它的语法是SELECTCOUNT”栏位名”FROM”表格名”举例来说,若我们要找出我们的范例表格中有几笔storc.namc栏不是空白的资料时,Store_Information表格我们就键入SELECTCOUNTstore_nameFROMStore_InformationWHEREstore_namcisnotNULL结果Countstorc_namc4“isnotNULL”是“这个栏位不是空白”的意思COUNT和DISTINCT经常被合起来使用,目的是找出表格中有多少笔不同的资料至于这些资料实际上是什么并不重要举例来说,如果我们要找出我们的表格中有多少个不同的store_name我们就键入,SELECTCOUNTDISTINCTstore_nameFROMStore_Information结果CountDISTTNCTstore_nameGROUPBY我们现在回到函数上记得我们用SUM这个指令来算出所有的Sales(营业额)吧!如果我们的需求变成是要算出每一间店(storc_namc)的营业额(sales)那怎么办呢?在这个情况下我们要做到两件事第一,我们对于storjname及Sales这两个栏位都要选出第二,我们需要确认所有的sales都要依照各个storc_namc来分开算这个语法为SELECT”栏位1”SUM“栏位2”FROM”表格名”GROUPBY”栏位1”在我们的范例上Store_lnfbrmation表格我们就键入SELECTstore_nameSUMSalesFROMStore_InformationGROUPBYstore_namc结果store_nameSUMSalesLosAngeles51800SanDiego5250Boston5700当我们选不只一个栏位,且其中至少一个栏位有包含函数的运用时,我们就需要用到GROUPBY这个指令在这个情况下,我们需要确定我们有GROUPBY所有其他的栏位换句话说,除了有包括函数的栏位外,我们都需要将其放在GROUPBY的子句中HAVING那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些店的营业额有超过$1500在这个情况下,我们不能使用WHERE的指令那要怎么办呢?很幸运地,SQL有提供一个HAVING的指令,而我们就可以用这个指令来达到这个目标HAVING子句通常是在一个SQL句子的最后一个含有HAVING子句的SQL并不一定要包含GROUPBY子句HAVING的语法如下SELECT”栏位VSUM(”栏位2”)FROM”表格名”GROUPBY”栏位1”HAVING(函数条件)请读者注意如果被SELECT的只有函数栏,那就不需要GROUPBY子句在我们Store_lnformation表格这个例子中,Store_Infbrmation表格若我们要找出Sales大于$1500的store_name我们就键入SELECTstore_nameSUMsalesFROMStore_InformationGROUPBYstore_nameHAVINGSUMsales1500结果store_nameSUMSalesLosAngeles$1800ALIAS接下来,我们讨论alias(别名)在SQL上的用处最常用到的别名有两种栏位别名及表格别名O简单地来说,栏位别名的目的是为了让SQL产生的结果易读在之前的例子中,每当我们有营业额总合时,栏位名都是SUMsaleso虽然在这个情况下没有什么问题,可是如果这个栏位不是一个简单的总合,而是一个复杂的计算,那栏位名就没有这么易懂了若我们用栏位别名的话,就可以确认结果中的栏位名是简单易懂的第二种别名是表格别名要给一个表格取一个别名,只要在FROM子句中的表格名后空一格,然后再列出要用的表格别名就可以了这在我们要用SQL由数个不同的表格中获取资料时是很方便的这一点我们在之后谈到连接join时会看到我们先来看一下栏位别名和表格别名的语法SELECT”表格别名“J栏位1”“栏位别名”FROM“表格名”“表格别名”基本上,这两种别名都是放在它们要替代的物件后面,而它们中间由一个空白分开我们继续使用Store_Information这个表格来做例子Store_Information表格我们用跟SQLGROUPBY那一页一样的例子这里的不同处是我们加上了栏位别名以及表格别名SELECTAl.storc_nameStoreSUMA
1.SalesHTotalSales11PROMStore_InfbrmationAlGROUPBYAl.store_name结果在结果中,资料本身没有不同不同的是栏位的标题这是运用栏位别名的结果在第二个栏位上,原本我们的标题是“SumSalcs”,而现在我们有一个很清楚的叮otalSales%很明显地,“TotalSales”能够比”SumSalcs”更精确地阐述这个栏位的含意用表格别名的好处在这里并没有显现出来,不过这在下一页就会很清楚了表格链接现在我们介绍连接join的概念要了解连接,我们需要用到许多我们之前已介绍过的指令我们先假设我们有以下的两个表格,Storc_Information表格Geography表格区有哪些店,而Store.Information告诉我们每一个店的营业额若我们要知道每一区的营业额,我们需要将这两个不同表格中的资料串联起来当我们仔细了解这两个表格后,我们会发现它们可经由一个相同的栏位,storjnamc连接起来我们先将SQL句列出,之后再讨论每一个子句的意义SELECTAl.region_nameREGIONSUMA
2.SalesSALESFROMGeographyAlStore_InformationA2WHEREAl.store_name=A
2.store_nameGROUPBYAl.regionname结果REGIONSALESEast5700West$2050在第一行中,我们告诉SQL去选出两个栏位第一个栏位是Geography表格中的region_name栏位我们取了一个别名叫做REGION;第二个栏位是Store_Information表格中的sales栏位别名为SALESo请注意在这里我们有用到表格别名Geography表格的别名是AlStorjlnformation表格的别名是A2若我们没有用表格别名的话,第一行就会变成SELECTGeography.region_nameREGIONSUMStore_lnformation.SalesSALES很明显地,这就复杂多了在这里我们可以看到表格别名的功用它能让SQL句容易被了解,尤其是这个SQL句含盖好几个不同的表格时接下来我们看第三行,就是WHERE子句这是我们阐述连接条件的地方在这里,我们要确认Geography表格中store._name栏位的值与Stre_Information表格中store_name栏位的值是相等的这个WHERE子句是一个连接的灵赢人物,因为它的角色是确定两个表格之间的连接是正确的如果WHERE子句是错误的,我们就极可能得到一个笛卡儿连接Cartesianjoin笛卡儿连接会造成我们得到所有两个表格每两行之间所有可能的组合在这个例子中,笛卡儿连接会让我们得到4x4=16行的结果外部链接之前我们看到的左连接leftjoin又称内部连接innerjoino在这个情况下,要两个表格内都有同样的值,那一笔资料才会被选出那如果我们想要列出一个表格中每一笔的资料无论它的值在另一个表格中有没有出现,那该怎么办呢?在这个时候,我们就需要用到SQLOUTERJOIN外部连接的指令外部连接的语法是依数据库的不同而有所不同的举例来说,在Oracle上,我们会在WHERE子句中要选出所有资料的那个表格之后加上一个+”来代表说这个表格中的所有资料我们都要假设我们有以下的两个表格:Store_Infbrmation表格Geography表格我们需要知道每一间店的营业额如果我们用一个普通的连接,我们将会漏失掉NewYork,这个店,因为它并不存在于Storejnformation这个表格所以,在这个情况下,我们需要用外部连接来串联这两个表格SELECTAl.store_nameSUMA
2.SalesSALESFROMGeorgraphyAlStore_InfbrmationA2WHEREAl.store_namc=A
2.store_namc+GROUPBYAl.storc_namc我们在这里是使用了Oracle的外部连接语法结果store_nameSALESBoston$70NewYorkLosAngeles$1800SanDiego$25请注意当第二个表格没有相对的资料时,SQL会传回NULL值在这一个例子中,NewYork并不存在于Store_Information表格,所以它的“SALES”栏位是NULL.CONCATENATE有的时候,我们有需要将由不同栏位获得的资料串连在一起每一种数据库都有提供方法来达到这个目的MySQL:CONCATQOracle:CONCATQ11SQLServer:+CONCATQ的语法如下CONCAT(字符串1字符串2字符串
3...)将字符串
1、字符串
2、字符串3等字符串连在一起请注意,Oracle的CONCAT只允许两个参数;换言之,一次只能将两个字符串串连起来不过,在Oracle中,我们可以用“来一次串连多个字符串来看一个例子假设我们有以下的表格Geography表格例子1:MySQL/Oracle:SELECTCONCATregion_namestore_nameFROMGeographyWHEREstore_name=Boston;结果EastBoston例子2:Oracle:SELECTregion_name11*f11store_nameFROMGeographyWHEREstore_namc=Boston;结果EastBoston1例子3:SQLServer:SELECTregion_name++store_nameFROMGeographyWHEREstorename=Boston;结果EastBostonSUBSTRINGSQL中的substring函数是用来抓出一个栏位资料中的其中一部分这个函数的名称在不同的数据库中不完全一样MySQL:SUBSTRQSUBSTRINGQOracle:SUBSTRSQLServer:SUBSTRINGQ最常用到的方式如下在这里我们用SUBSTRO为例SUBSTRstrpos:由<str>中,选出所有从第vpos>位置开始的字符请注意,这个语法不适用于SQLServer_hoSUBSTRstrposJen:由<str>中的第vpos>位置开始,选出接下去的vlcn>个字符假设我们有以下的表格Geography表格例1:SELECTSUBSTRstore_name3FROMGeographyWHEREstore_name=LosAngeles*;结果sAngeles例2:SELECTSUBSTRstore_name24FROMGeographyWHEREstore_name=SanDiego;结果anDTRIMSQL中的TRIM函数是用来移除掉一个字符串中的字头或字尾最常见的用途是移除字首或字尾的空白这个函数在不同的数据库中有不同的名称算中位数算总合百分比算累积总合百分比SQL语法无论症是一位SQL的新手,或是一位只是需要对SQL复习一下的资料仓储业界老将,您就来对地方了这个SQL教材网站列出常用的SQL指令包含以下几个部分SQL指令:SQL如何被用来储存、读取、以及处理数据库之中的资料表格处理:SQL如何被用来处理数据库中的表格进阶SQL:介绍SQL进阶概念,以及如何用SQL来执行一些较复杂的运算SQL语法:这一页列出所有在这个教材中被提到的SQL语法对于每一个指令,我们将会先列出及解释这个指令的语法,然后用一个例子来让读者了解这个指令是如何被运用的当您读完了这个网站的所有教材后,您将对SQL的语法会有一个大致上的了解另外,您将能够正确地运用SQL来由数据库中获取信息笔者本身的经验是,虽然要对SQL有很透彻的了解并不是一朝一夕可以完成的,可是要对SQL有个基本的了解并不难希望在看完这个网站后,您也会有同样的想法SQL指令SELECT是用来做什么的呢?一个最常用的方式是将资料从数据库中的表格内选出从这一句回答中,我们马上可以看到两个关键字从(FROM)数据库中的表格内选出(SELECT(表格是一个数据库内的结构,它的目的是储存资料在表格处理这一部分中,我们会提到如何使用SQL来设定表格)我们由这里可以看到最基本的SQL架构SELECT”栏位名“FROM”表格名”我们用以下的例子来看看实际上是怎么用的假设我们有以下这个表格MySQL:TRIM,RTRIM,LTRIMQOracle:RTRIMQLTRIMQSQLServer:RTRIMQLTRIMQ各种trim函数的语法如下TRIM[位置][要移除的字符串]FROM]字符串)[位置]的可能值为LEADING(起头)TRAILING(结尾)orBOTH(起头及结尾)这个函数将把[要移除的字符串]从字符串的起头、结尾,或是起头及结尾移除如果我们没有列出[要移除的字符串]是什么的话,那空白就会被移除LTRIM(字符串)将所有字符串起头的空白移除RTRIM(字符串)将所有字符串结尾的空白移除例1:SELECTTRIMfSample,);结果Sample例2:SELECTLTRIMfSample);结果Sample例3:SELECTRTRIMfSamplef);结果Sample1表格处理CREATETABLE表格是数据库中储存资料的基本架构在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格虽然许多数据库工具可以让您在不需用到SQL的情况下建立表格,不过由于表格是一个最基本的架构,我们决定包括CREATETABLE的语法在这个网站中在我们跳入CREATETABLE的语法之前,我们最好先对表格这个东西有些多一点的了解表格被分为栏位(column)及列位(row)o每一列代表一笔资料,而每一栏代表一笔资料的一部份举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日…等等当我们对表格下定义时,我们需要注明栏位的标题,以及那个栏位的资料种类那,资料种类是什么呢?资料可能是以许多不同的形式存在的它可能是一个整数(例如1),、一个实数(例如
0.55)>一个字符串(例如,sqV)、一个日期/时间(例如
2000.JAN-2503:22:22%或甚至是以二进法(binary)的状态存在当我们在对一个表格下定义时,我们需要对每一个栏位的资料种类下定义(例如,姓,这个栏位的资料种类是char
(50)——代表这是一个50个字符的字符串)我们需要注意的一点是不同的数据库有不同的资料种类,所以在对表格做出定义之前最好先参考一下数据库本身的说明CREATETABLE的语法是CREATETABLE”表格名””栏位1口栏位1资料种类””栏位2心栏位2资料种类”,…若我们要建立我们上面提过的顾客表格,我们就键入以下的SQL CREATETABLEcustomerFirst_Namechar50Last_Namechar50Addresschar50Citychar50Countrychar25Birth_DatcdateCONSTRAINT我们可以限制哪一些资料可以存入表格中这些限制可以在表格初创时藉由CREATETABLE语句来指定,或是之后藉由ALTERTABLE语句来指定常见的限制有以下儿种NOTNULLUNIQUECHECK主键PrimaryKey外来键ForeignKey以下对这几种限制分别做个介绍NOTNULL在没有做出任何限制的情况下,一个栏位是允许有NULL值得如果我们不允许一个栏位含有NULL值,我们就需要对那个栏位做出NOTNULL的指定举例来说,在以下的语句中,CREATETABLECustomerSIDintegerNOTNULLLast_Namevarchar30NOTNULLFirst_Namevarchar30;nSlDn和HLast_Namen这两个栏位是不允许有NULL值,而nFirst_Namen这个栏位是可以有NULL值得UNIQUEUNIQUE限制是保证一个栏位中的所有资料都是有不一样的值举例来说,在以下的语句中CREATETABLECustomerSIDintegerUniqueLast_Namevarchar30First_Namcvarchar30;SID栏位不能有重复值存在,而LasjNamc及nFirst_Namcn这两个栏位则是允许有重复值存在请注意,一个被指定为主键的栏位也一定会含有UNIQUE的特性相对来说,一个UNIQUE的栏位并不一定会是一个主键CHECKCHECK限制是保证一个栏位中的所有资料都是符合某些条件举例来说,在以下的语句中,CREATETABLECustomerSIDintegerCHECKSID0Last_Namevarchar30First_Namevarchar30;“S1D”拦只能包含大于0的整数请注意,CHECK限制目前尚未被执行于MySQL数据库上主键and外来键将于下两页中讨论主键主键PrimaryKey中的每一笔资料都是表格中的唯一值换言之,它是用来独一无二地确认一个表格中的每一行资料主键可以是原本资料内的一个栏位,或是一个人造栏位与原本资料没有关系的栏位主键可以包含一或多个栏位当主键包含多个栏位时,称为组合键CompositeKey主键可以在建置新表格时设定运用CREATETABLE语句,或是以改变现有的表格架构方式设定运用ALTERTABLEo以下举儿个在建置新表格时设定主键的方式:MySQL:CREATETABLECustomerSIDintegerLast_Namevarchar30First_Namevarchar30PRIMARYKEYSID;Oracle:CREATETABLECustomerSIDintegerPRIMARYKEYLast_Namevarchar30First_Namevarchar30;SQLServer:CREATETABLECustomerSIDintegerPRIMARYKEYLast_Namevarchar30First_Namevarchar30;以下则是以改变现有表格架构来设定主键的方式MySQL:ALTERTABLECustomerADDPRINIARYKEYSID;Oracle:ALTERTABLECustomerADDPRIMARYKEYSID;SQLServer:ALTERTABLECustomerADDPRIMARYKEYSID;请注意,在用ALTERTABLE语句来添力口主键之前,我们需要确认被用来当做主键的栏位是设定为『NOTNULL』;也就是说,那个栏位一定不能没有资料外来键外来键是一个或数个指向另外一个表格主键的栏位外来键的目的是确定资料的参考完整性referentialintegrity换言之,只有被准许的资料值才会被存入数据库内举例来说,假设我们有两个表格一个CUSTOMER表格,里面记录了所有顾客的资料;另一个ORDERS表格,里面记录了所有顾客订购的资料在这里的一个限制,就是所有的订购资料中的顾客,都一定是要跟在CUSTOMER表格中存在在这里,我们就会在ORDERS表格中设定一个外来键,而这个外来键是指向CUSTOMER表格中的主键这样一来,我们就可以确定所有在ORDERS表格中的顾客都存在CUSTOMER表格中换句话说,ORDERS表格之中,不能有任何顾客是不存在于CUSTOMER表格中的资料这两个表格的结构将会是如下:CUSTOMER表格ORDERS表格在以上的例子中,ORDERS表格中的customer_SID栏位是一个指向CUSTOMERS表格中SID栏位的外来键以下列出几个在建置ORDERS表格时指定外来键的方式:MySQL:CREATETABLEORDERSOrder_IDintegerOrderDatedateCustomer_SlDintegerAmountdoublePrimatyKeyOrder_IDForeignKeyCustomer_SIDreferencesCUSTOMERSID;Oracle:CREATETABLEORDERSOrder_IDintegerprimarykeyOrderDatedate.Customer_SIDintegerreferencesCUSTOMERSIDAmountdouble;SQLServer:CREATETABLEORDERSOrdcr_IDintegerprimarykeyOrderDatedatetimeCustomcr_SIIDintegerreferencesCUSTOMERSIDAmountdouble;以下的例子则是藉着改变表格架构来指定外来键这里假设ORDERS表格已经被建置,而外来键尚未被指定MySQL:ALTERTABLEORDERSADDFOREIGNKEYcustomcr_sidREFERENCESCUSTOMERsid;Oracle:ALTERTABLEORDERSADDCONSTRAINTfl_orderslFOREIGNKEYcustomer_sidREFERENCESCUSTOMERsid;SQLServer:ALTERTABLEORDERSADDFOREIGNKEYcustomcr_sidREFERENCESCUSTOMERsid;CREATEVIEW视观表(Views)可以被当作是虚拟表格它跟表格的不同是,表格中有实际储存资料,而视观表是建立在表格之上的一个架构,它本身并不实际储存资料建立一个视观表的语法如下CREATEVIEWHVIEW_NAMEnAS“SQL语句”“SQL语句”可以是任何一个我们在这个教材中有提到的SQLo来看一个例子假设我们有以下的表格TABLECustomerFirst_Namechar50Last_Namechar50Addresschar50Citychar50Countrychar25Birth_Datedate若要在这个表格上建立一个包括First_NameLasjName和Countty这三个栏位的视观表,我们就打入,CREATEVIEWV_CustomerASSELECTFirst_NameLast_NameCountryFROMCustomer现在,我们就有一个叫做V_Customcr的视观表ViewV_CustomerFirst_Namechar50Last_Namechar50Counttychar25我们也可以用视观表来连接两个表格在这个情况下,使用者就可以直接由一个视观表中找出她要的信息,而不需要由两个不同的表格中去做一次连接的动作假设有以下的两个表格Store_Information表格Geography表格我们就可以用以下的指令来建一个包括每个地区region销售额sales的视观表:CREATEVIEWV_REGION_SALESASSELECTAl.region_nameREGIONSUMA
2.SalesSALESFROMGeographyAlStore_InfbrmationA2WHEREAl.storc_name=A
2.storc_namcGROUPBYAl.region_name这就给我们有一个名为V_REGION_SALES的视观表这个视观表包含不同地区的销售哦如果我们要从这个视观表中获取资料,我们就打入,SELECT*FROMV_REGION_SALES结果REGIONSALESEast$700CREATEINDEX索引Index可以帮助我们从表格中快速地找到需要的资料举例来说,假设我们要在一本园艺书中找如何种植青椒的讯息若这本书没有索引的话,那我们是必须要从头开始读,直到我们找到有关种直青椒的地方为止若这本书有索引的话,我们就可以先去索引找出种植青椒的信息是在哪一页,然后直接到那一页去阅读很明显地,运用索引是一种有效且省时的方式从数据库表格中寻找资料也是同样的原理如果一个表格没有索引的话,数据库系统就需要将整个表格的资料读出这个过程叫做Hblescan%若有适当的索引存在,数据库系统就可以先由这个索引去找出需要的资料是在表格的什么地方,然后直接去那些地方抓资料这样子速度就快多了因此,在表格上建立索引是一件有利于系统效率的事一个索引可以涵盖一或多个栏位建立索引的语法如下CREATEINDEX”INDEX_NAME”ONnTABLE_NAMEnCOLUMN_NAME现在假设我们有以下这个表格,TABLECustomerFirst_Namcchar50Last_Namechar50Addresschar50Citychar50Countrychar25Birth_Datedate若我们要在Last_Name这个栏位上建一个索引,我们就打入以下的指令,CREATEINDEXIDX_CUSTOMER_LAST_NAMEonCUSTOMERLast_Name我们要在City及Countty这两个栏位上建一个索引,我们就打入以下的指令CREATEINDEX1DX_CUSTOMER_LOCAT1ONonCUSTOMERCityCountry索引的命名并没有一个固定的方式通常会用的方式是在名称前加一个字首,例如“IDX_”,来避免与数据库中的其他物件混淆另外,在索引名之内包括表格名及栏位名也是一个好的方式请读者注意,每个数据库会有它本身的CREATEINDEX语法,而不同数据库的语法会有不同因此,在下指令前,请先由数据库使用手册中确认正确的语法ALTERTABLE在表格被建立在数据库中后,我们常常会发现,这个表格的结构需要有所改变常见的改变如下加一个栏位删去一个栏位改变栏位名称改变栏位的资料种类以上列出的改变并不是所有可能的改变ALTERTABLE也可以被用来作其他的改变,例如改变主键定义ALTERTABLE的语法如下ALTERTABLEntable_namen[改变方式]「改变方式]的详细写法会依我们想要达到的目标而有所不同再以上列出的改变中,[改变方式]如下加一个栏位:ADD”栏位V”栏位1资料种类”删去一个栏位:DROP”栏位1”改变栏位名称:CHANGE”原本栏位名”新栏位名口新栏位名资料种类”改变栏位的资料种类:MODIFY“栏位1””新资料种类”以下我们用在CREATETABLE一页建出的customer表格来当作例子customer表格若要选出所有的店名store_Name我们就打入:SELECTstore_nameFROMStorcjnfbrmation我们一次可以读取好几个栏位,也可以同时由好几个表格中选资料DISTINCTSELECT指令让我们能够读取表格中一个或数个栏位的所有资料这将把所有的资料都抓出,无论资料值有无重复在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况换句话说,我们需要知道这个表格/栏位内有哪些不同的值,而每个值出现的次数并不重要这要如何达成呢?在SQL中,这是很容易做到的我们只要在SELECT后加上一个DISTINCT就可以了DISTINCT的语法如下SELECTDISTINCT”栏位名”FROM”表格名”举例来说,若要在以下的表格,Store_Information找出所有不同的店名时,Store_Information表格我们就键入SELECTDISTINCTstorenameFROMStoreInformation第一,我们要加入一个叫做群nder”的栏位这可以用以下的指令达成:ALTERtablecustomeraddGendercharl这个指令执行后的表格架构是customer表格接下来,我们要把“Address栏位改名为Addr这可以用以下的指令达成:ALTERtablecustomerchangeAddressAddrchar50这个指令执行后的表格架构是customer表格再来,我们要将Addr”栏位的资料种类改为char30o这可以用以下的指令达成:ALTERtabiccustomermodifyAddrchar30这个指令执行后的表格架构是customer表格最后,我们要删除“Gender栏位这可以用以下的指令达成:ALTERtablecustomerdropGender这个指令执行后的表格架构是customer表格DROPTABLE有时候我们会决定我们需耍从数据库中清除一个表格事实上,如果我们不能这样做的话那将会是一个很大的问题,因为数据库管理师DatabaseAdministrator—DBA势必无法对数据库做有效率的管理还好,SQL有提供一个DROPTABLE的语法来让我们清除表格DROPTABLE的语法是DROPTABLE”表格名”我们如果要清除在上一页中建立的顾客表格,我们就键入DROPTABLEcustomer.TRUNCATETABLE有时候我们会需要清除一个表格中的所有资料要达到者个目的,一种方式是我们在上一页看到的DROPTABLE指令不过这样整个表格就消失,而无法再被用了另一种方式就是运用TRUNCATETABLE的指令在这个指令之下,表格中的资料会完全消失,可是表格本身会继续存在TRUNCATETABLE的语法为下TRUNCATETABLE”表格名”所以,我们如果要清除在SQLCreateTable那一页建立的顾客表格之内的资料,我们就键入TRUNCATETABLEcustomer.INSERTINTO到目前为止,我们学到了将如何把资料由表格中取出但是这些资料是如果进入这些表格的呢这就是这一页(INSERTINTO)和下一页(UPDATE)要讨论的基本上,我们有两种作法可以将资料输入表格中内一种是一次输入一笔,另一种是一次输入好几笔我们先来看一次输入一笔的方式依照惯例,我们先介绍语法一次输入一笔资料的语法如下INSERTINTO”表格名”(”栏位栏位2”...)VALUES(“值V”值
2...)假设我们有一个架构如下的表格Storc_Information表格而我们要加以下的这一笔资料进去这个表格在January101999LosAngeles店有$900的营业额我们就打入以下的SQL语句INSERTINTOStore_lnformationstore_nameSalesDateVALUESfLosAngeles;900JJan-l0-1999第二种INSERTINTO能够让我们一次输入多笔的资料跟上面刚的例子不同的是,现在我们要用SELECT指令来指明要输入表格的资料如果您想说,这是不是说资料是从另一个表格来的,那您就想对了一次输入多笔的资料的语法是INSERTINTO”表格1“栏位1”“栏位2”...SELECT”栏位3“,“栏位4”...FROM”表格2以上的语法是最基本的这整句SQL也可以含有WHEREGROUPBY及HAVING等子句,以及表格连接及别名等等举例来说,若我们想要将1998年的营业额资料放入Storejnformation表格,而我们知道资料的来源是可以由Sales」nfQrmatim表格取得的话,那我们就可以键入以下的SQL INSERTINTOStore_Informationstore_nameSalesDateSELECTstorenameSales.DateFROMSalcs_InformationWHEREYearDate=1998在这里,我用了SQLServer中的函数来由日期中找出年不同的数据库会有不同的语法举个例来说,在Oracle上,您将会使用WHEREto_chardatc;yyy/=1998UPDATE我们有时候可能会需要修改表格中的资料在这个时候,我们就需要用到UPDATE指令这个指令的语法是UPDATE”表格名”SET”栏位1”=[新值]WHERE{条件}最容易了解这个语法的方式是透过一个例子假设我们有以下的表格:Store_Infrmatin表格我们发现说LosAngeles在01/08/1999的营业额实际上是$500而不是表格中所储存的$300因此我们用以下的SQL来修改那一笔资料UPDATEStore_InformationSETSales=500WHEREstore_name=LosAngelesANDDate=Jan-08-1999”现在表格的内容变成St()re_Information表格在这个例子中,只有一笔资料符合WHERE子句中的条件如果有多笔资料符合条件的话每一笔符合条件的资料都会被修改的我们也可以同时修改好几个栏位这语法如下UPDATE”表格”SET”栏位1”=[值1]“栏位2”二[值2]WHERE{条件}DELETEFROM在某些情况下,我们会需要直接由数据库中去除一些资料这可以藉由DELETEFROM指令来达成它的语法是DELETEFROM”表格名”WHERE{条件}以下我们用个实例说明假设我们有以下这个表格:Store_Information表格而我们需要将有关LosAngeles的资料全部去除在这里我们可以用以下的SQL来达到这个目的DELETEFROMStorejnformationWHEREstore_name=LosAngeles11现在表格的内容变成Storc_Information表格进阶SQL在这一部分,我们将介绍以下的SQL概念及关键字:SQLUNIONSQLUNIONALLSQLINTERSECTSQLMINUSSQLSubquerySQLEXISTSSQLCASE我们并介绍如何用SQL来做出以下的运算:排名(Rank)中位数(Median)累积总计(RunningTotal)总合百分比(PercenttTotal)累积总合百分比CumulativePercenttoTotalUNIONUNION指令的目的是将两个SQL语句的结果合并起来从这个角度来看,UNION跟JOIN有些许类似,因为这两个指令都可以由多个表格中撷取资料UNION的一个限制是两个SQL语句所产生的栏位需要是同样的资料种类另外,当我们用UNION这个指令时,我们只会看到不同的资料值(类似SELECTDISTINCT)oUNION的语法如下[SQL语句1]UNION[SQL语句2J假设我们有以下的两个表格,Store_Information表格Internet_Sales表格而我们要找出来所有有营业额(sales)的日千要达到这个U的,我们用以下的SQL语句:SELECTDateFROMStore_InformationUNIONSELECTDateFROMIntcrnet_Sales结果DateJan-05-1999an-07-1999Jan-08-1999Jan-10-1999Jan-11-1999Jan-12-1999有一点值得注意的是,如果我们在任何一个SQL语句(或是两句都一起)用“SELECTDISTINCTDateH的话,那我们会得到完全一样的结果UNIONALLUNIONALL这个指令的目的也是要将两个SQL语句的结果合并在一起UNIONALL和UNION不同之处在于UNIONALL会将每一笔符合条件的资料都列出来,无论资料值有无重复UNIONALL的语法如下[SQL语句1]UNIONALL[SQL语句2]我们用和上一页同样的例子来显示出UNIONALLUNION的不同同样假设我们有以下两个表格,Store_Inf()rmation表格Internet_Sales表格而我们要找出有店面营业额以及网络营业额的日子要达到这个目的,我们用以下的SQL语句SELECTDateFROMStorc_InformationUNIONALLSELECTDateFROMInternetSales结果:DateJan-05-1999Jan-07-1999Jan-08-1999Jan-08-1999Jan-07-1999Jan-10-1999Jan-11-1999Jan-12-1999INTERSECT和UNION指令类似,INTERSECT也是对两个SQL语句所产生的结果做处理的不同的地方是,UNION基本上是一个OR(如果这个值存在于第一句或是第二句,它就会被选出),而INTERSECT则比较像AND(这个值要存在于第一句和第二句才会被选出)UNION是联集,而INTERSECT是交集INTERSECT的语法如下[SQL语句1]INTERSECT[SQL语句2]假设我们有以下的两个表格Store_Information表格Internet_Sales表格而我们要找出哪几天有店面交易和网络交易要达到这个目的,我们用以下的SQL语句:SELECTDateFROMStorc_InformationINTERSECTSELECTDateFROMInternet_Sales结果DateJan-07-1999请注意,在INTERSECT指令下,不同的值只会被列出一次MINUSMINUS指令是运用在两个SQL语句上它先找出第一个SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃MINUS的语法如下[SQL语句1]MINUS[SQL语句2]我们继续使用一样的例子Store_Information表格Intemet_Sales表格结果store_nameLosAngelesSanDiegoBostonWHERE我们并不一定每一次都要将表格内的资料都完全抓出在许多时候,我们会需要选择性地抓资料就我们的例子来说,我们可能只要抓出营业额超过$1000的资料要做到这一点,我们就需要用到WHERE这个指令这个指令的语法如下SELECT”栏位名”FROM”表格名”WHERE”条件”若我们要由以下的表格抓出营业额超过$1000的资料Store_Information表格我们就键入SELECTstore_nameFROMStore_InformationWHERESales1000结果store_nameLosAngeles而我们要知道有哪几天是有店面营业额而没有网络营业额的要达到这个目的,我们用以下的SQL语句SELECTDateFROMStore_InformationMINUSSELECTDateFROMInternet_Sales结果DateJan-05-1999Jan-08-1999nJan-05-1999n“Jan-07-1999”andnJan-08-1999n是SELECTDateFROMStorc_Informationn所产生的结果在这里面,”Jan-07/999”是存在于SELECTDateFROMInternet_Salesn所产生的结果中因此“Jan-07-1999”并不在最后的结果中请注意,在MINUS指令下,不同的值只会被列出一次子查询我们可以在一个SQL语句中放入另一个SQL语句当我们在WHERE子句或HAVING子句中插入另一个SQL语句时,我们就有一个子查询(subquery)的架构子查询的作用是什么呢?第一,它可以被用来连接表格另外,有的时候子查询是唯一能够连接两个表格的方式子查询的语法如下SELECT”栏位1”FROM”表格”WHERE”栏位21比较运算素](SELECT”栏位1”FROM”表格”WHERE[条件])[比较运算素]可以是相等的运算素,例如=,〈二这也可以是一个对文字的运算素,例如“LIKE”绿色的部分代表外查询,红色的部分代表内查询我们就用刚刚在阐述SQL连接时用过的例子:Store_Infrmation表格Geography表格们的目的SELECTSUMSalesFROMStore_InformationWHEREStore_nameINSELECTstore_nameFROMGeographyWHEREregion_name=West1结果SUMSales2050在这个例子中,我们并没有直接将两个表格连接起来,然后由此直接算出每一间西区店面的营业额我们做的是先找出哪些店是在西区的,然后再算出这些店的营业额总共是多少在以上的例子,内部查询本身与外部查询没有关系这一类的子查询称为『简单子查询』SimpleSubquery如果内部查询是要利用到外部查询提到的表格中的栏位,那这个字查询就被称为『相关子查询』CorrelatedSubquery以下是一个相关子查询的例子SELECTSUMal.SalesFROMStorcjnformationalWHEREal.Store_nameINSELECTstore_nameFROMGeographya2WHEREa
2.store_name=alstorc_namc红色部分即是外部查询提到的表格中的栏位EXISTS在上一页中,我们用IN来连接内查询和外查询另外有数个方式,例如及=都可以用来连接内查询和外查询EXISTS也是其中一种方式这一页我们将讨论EXISTS的用法基本上,EXISTS是用来测试内查询有没有产生任何结果如果有的话,系统就会执行外查询中的SQLo若是没有的话,那整个SQL语句就不会产生任何结果EXISTS的语法是SELECT”栏位lnFROM”表格1WHEREEXISTS(SELECT*FROM”表格TWHERE[条件])在内查询中,我们并不一定要用*来选出所有的栏位我们也可以选择表格2中的任何栏位这两种做法最后的结果是一样的来看一个例子假设我们有以下的两个表格:Store_Information表格Geography表格而我们打入的SQL是:SELECTSUMSalesIROMStore_InformationWHEREEXISTSSELECT*FROMGeographyWHEREregion_name=West我们会得到以下的答案SUMSales2750乍看之下,这个答案似乎不太正确,因为内查询有包含一个[region_name=West1]的条件,可是最后的答案并没有包含这个条件实际上,这并没有问题在这个例子中,内查询产生了超过一笔的资料,所以EXISTS的条件成立,所以外查询被执行而外查询本身并没有包含[region_name=fWestf]这个条件CASECASE是SQL用来做为if-then-else之类逻辑的关键字CASE的语法如下:SELECTCASE(”栏位名”)WHEN”条件1“THEN“结果1”WHEN”条件2“THEN“结果2”•••[ELSE”结果Nn]ENDFROM”表格名””条件”可以是一个数值或是公式ELSE子句则并不是必须的在我们的Storc_Information中Store_Information表格若我们要将fLosAngeles*的Sales数值乘以2以及将*SanDiego*的Sales数值乘以
1.5我们就键入以下的SQL SELECTstorenameCASEstorenameWHEN*LosAngelesTHENSales*2WHENSanDiegoTHENSales*
1.5ELSESalesEND“NewSalesDateFROMStore_Information“NewSales”是用到CASE那个栏位的栏位名结果:算排名列出每一行的排名是一个常见的需求,可惜SQL并没有一个很直接的方式达到这个需求要以SQL列出排名,基本的概念是要做一个表格自我连结selfjoin将结果依序列出,然后算出每一行之前包含那一行本身有多少行数这样讲读者听得可能有点困惑,所以最好的方式是用一个实例来介绍假设我们有以下的表格Total_Sales表格要找出每一行的排名,我们就打入以下的SQL语句:SELECTal.Nameal.SalesCOUNTa
2.salesSales_RankFROMTotalSalesalTotalSalesa2WHEREal.Sales=a
2.Salesoral.Sales=a
2.Salesandal.Name=a
2.NameGROUPBYal.Nameal.SalesORDERBYal.SalesDESCal.NameDESC;我们先来看WHERE子句在字句的第一部分al.Sales=a
2.Sales我们算出有多少笔资料Sales栏位的值是比自己本身的值小或是相等如果在Sales栏位中没有同样大小的资料,那这部分的WHERE子句本身就可以产生出正确的排名子句的第二部分,al.Sales=a
2.Salesandal.Name=a
2.Name则是让我们在Sales栏位中有同样大小的资料时像Stella及Jeff这两笔资料,仍然能够产生正确的排名算中位数要算出中位数,我们必须要能够达成以下几个目标将资料依序排出,并找出每一行资料的排名找出『中间』的排名为何举例来说,如果总共有9笔资料,那中间排名就是5有4笔资料比第5笔资料大,有4笔资料比第5笔资料小找出中间排名资料的值来看看以下的例子假设我们有以下的表格Total_Sales表格要找出中位数,我们就键入:SELECTSalesMedianFROMSELECTal.Nameal.SalesCOUNTal.SalesRankFROMTotalSalesalTotalSalesa2WHEREal.Salesa
2.SalesORal.Sales=a
2.SalesANDal.Namc=a
2.Namcgroupbyal.Nameal.Salesorderbyal.Salesdesca3WHERERank=SELECTCOUNT*+1DIV2FROMTotal_Sales;结果Median20读者将会发现,第2行到第6行是跟产生排名的语句完全一样第7行则是算出中间的排名DIV是在MySQL中算出商的方式在不同的数据库中会有不同的方式求商第1行则是列出排名中间的资料值算累积总计算出累积总计是一个常见的需求,可惜以SQL并没有一个很直接的方式达到这个需求要以SQL算出累积总计,基本上的概念与列出排名类似第一是先做个表格自我连结(selfjoin)然后将结果依序列出在做列出排名时,我们算出每一行之前(包含那一行本身)有多少行数;而在做累积总计时,我们则是算出每一行之前(包含那一行本身)的总合来看看以下的例子假设我们有以下的表格Total_Sales表格要算出累积总计,我们就键入:SELECTal.Nameal.SalesSUMa
2.SalesRunning_TotalFROMTotal_SalesalTotal_Salesa2WHEREal.Sales=a
2.salesoral.Sales=a
2.Salesandal.Name=a
2.NameGROUPBYal.Nameal.SalesORDERBYal.SalesDESCal.NameDESC;结果:算总合百分比要用SQL算出总合百分比,我们需要用到算排名和累积总计的概念,以及运用子查询的做法在这里,我们把子查询放在外部查询的SELECT子句中让我们来看以下的例子Total_Salcs表格要算出总合百分比,我们键入:SELECTal.Nameal.Salesal.Sales/SELECTSUMSalesFROMTotal_SalesPct_To_TotalFROMTotalSalesalTotalSalesa2WHEREal.Sales=a
2.salesoral.Sales=a
2.Salesandal.Name=a
2.NameGROUPBYal.Nameal.SalesORDERBYal.SalesDESCal.NameDESC;结果:SELECTSUMSalesFROMTotal_Salesn这一段子查询是用来算出总合总合算出后,我们就能够将每一行一一除以总合来求出每一行的总合百分比算累积总合百分比要用SQL累积总合百分比算出,我们运用类似总合百分比的概念两者的不同处在于在这个情况下,我们要算出到目前为止的累积总合是所有总合的百分之几,而不是光看每一笔资料是所有总合的百分之几让我们来看看以下的例子Total_Sales表格要算出累积总合百分比,我们键入:SELECTal.Nameal.SalesSUMa
2.Sales/SELECTSUMSalesFROMTotal_SalesPct_To_TotalFROMTotal_SalesalTotal_Salesa2WHEREal.Sales=a
2.salesoraLSales=a
2.SalesandaLName=a
2.NameGROUPBYal.Nameal.SalesORDERBYal.SalesDESCfaLNameDESC;结果:NameSalesPct_To_TotalGreg
500.3226Sophia
400.5806Stella
200.7097Jeff
200.8387Jennifer
150.9355John
101.0000^SELECTSUMSalesFROMTotal_Salesn这一段子查询是用来算出总合我们接下来用累积总计nSUMa
2.SalesH除以总合来求出每一行的累积总合百分比SQL语法SelectSELECT”栏位“FROM”表格名”DistinctSELECTDISTINCT”栏位”FROM”表格名”WhereSELECT”栏位”FROM”表格名”WHEREcondition”And/OrSELECT”栏位”FROM”表格名”WHERE”简单条件”{[AND|OR]”简单条件}+InSELECT”栏位”FROM”表格名”WHERE”栏位”IN(,值17值2\…)BetweenSELECT”栏位”FROM”表格名”WHERE”栏位”BETWEEN,值1AND,值2ANDOR在上一页中,我们看到WHERE指令可以被用来由表格中有条件地选取资料这个条件可能是简单的(像上一页的例子),也可能是复杂的复杂条件是由二或多个简单条件透过AND或是OR的连接而成一个SQL语句中可以有无限多个简单条件的存在复杂条件的语法如下SELECT”栏位名”FROM”表格名”WHERE”简单条件”{[AND|OR]”简单条件}+{}+代表{}之内的情况会发生一或多次在这里的意思就是AND加简单条件及OR加简单条件的情况可以发生一或多次另外,我们可以用0来代表条件的先后次序举例来说,我们若要在Store_Information表格中选出所有Sales高于$1000或是Sales在$500及$275之间的资料的话,Store_Infbrmation表格我们就键入SELECTstore_nameFROMStore_InfrmationWHERESales1000ORSales500ANDSales275结果store_nameLosAngelesSanFranciscoLikeSELECT”栏位”FROM”表格名”WHERE”栏位”LIKE{模式}OrderBySELECT”栏位”FROM”表格名”[WHERE”条件”]ORDERBY”栏位”[ASCDESC]CountSELECTCOUNT(“栏位”)FROM”表格名”GroupBySELECT”栏位lnSUM(”栏位2”)FROM”表格名”GROUPBY”栏位1HHavingSELECT”栏位1”,SUM(栏位2”)FROM”表格名”GROUPBY”栏位1HHAVING(函数条件)CreateTableCREATETABLE”表格名”(,,栏位i,,“栏位1资料种类:“栏位2””栏位2资料种类;…)DropTableDROPTABLE”表格名”TruncateTableTRUNCATETABLE”表格名”InsertIntoINSERTINTO”表格名”(“栏位1”“栏位2”...)VALUES(”值11值
2、...)UpdateUPDATE”表格名”SET栏位=[新值]WHERE{条件}DeleteFromDELETEFROM”表格名”WHERE{条件}在SQL中,在两个情况下会用到IN这个指令;这一页将介绍其中之一与WHERE有关的那一个情况在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入IN这个子句IN指令的语法为下SELECT”栏位名”FROM”表格名”WHERE”栏位名”IN值一/值二...在括号内可以有一或多个值,而不同值之间由逗点分开值可以是数目或是文字若在括号内只有一个值,那这个子句就等于WHERE”栏位名“二值一,举例来说,若我们要在Store_Information表格中找出所有含盖LosAngeles或SanDiego的资料,Store_Infrmation表格我们就键入SELECT*FROMStore_InformationWHEREstore_nameINLosAngeles丁SanDiego结果BETWEENIN这个指令可以让我们依照一或数个不连续discrete的值的限制之内抓出资料库中的值,而BETWEEN则是让我们可以运用一个范围range内抓出资料库中的值BETWEEN这个子句的语法如下SELECT”栏位名”FROM”表格名”WHERE”栏位名“BETWEEN值—AND值二,这将选出栏位值包含在值一及值二之间的每一笔资料举例来说,若我们要由Store_Information表格中找出所有介于January61999及JanuarylO1999中的资料Store_Information表格我们就键入SELECT*FROMStore_InformationWHEREDateBETWEENJan-06-1999ANDJan-10-1999!请读者注意在不同的数据库中,日期的储存法可能会有所不同在这里我们选择了其中一种储存法结果LIKELIKE是另一个在WHERE子句中会用到的指令基本上,LIKE能让我们依据一个模式pattern来找出我们要的资料相对来说,在运用IN的时候,我们完全地知道我们需要的条件;在运用BETWEEN的时候,我们则是列出一个范围LIKE的语法如下SELECT”栏位名”FROM”表格名”WHFRF”栏位名“LIKE{模式}{模式}经常包括野卡wildcard.以下是几个例子A_Z,:所有以A起头,另一个任何值的字原,且以Z为结尾的字符串ABZ,和,A2Z,都符合这一个模式,而,AKIZ,并不符合因为在A和Z之间有两个字原,而不是一个字原,ABC%所有以贸BC起头的字符串举例来说,,ABCD和fABCABC都符合这个模式f%XYZ:所有以,XYZ,结尾的字符串举例来说,,WXYZ,和•ZZXYZ都符合这个模式%AN%,所有含有,AN,这个模式的字符串举例来说,[OSANGELES,和SANFRANCISCO都符合这个模式我们将以上最后一个例子用在我们的Store_Information表格上Store_Inf()rmation表格我们就键入SELECT*FROMStore_InformationWHEREstore_nameLIKE%AN%结果ORDERBY到目前为止,我们已学到如何藉由SELECT及WHERE这两个指令将资料由表格中抓出不过我们尚未提到这些资料要如何排列这其实是一个很重要的问题事实上,我们经常需要能够将抓出的资料做一个有系统的显示这可能是由小往大ascending或是由大往小descendingo在这种情况下,我们就可以运用ORDERBY这个指令来达到我们的目的ORDERBY的语法如下SELECT”栏位名”FROM”表格名”[WHERE”条件”]ORDERBY”栏位名”[ASCDESC][]代表WHERE子句不是一定需要的不过,如果WHERE子句存在的话,它是在ORDERBY子句之前ASC代表结果会以由小往大的顺序列出,而DESC代表结果会以由大往小的顺序列出如果两者皆没有被写出的话,那我们就会用ASCo我们可以照好几个不同的栏位来排顺序在这个情况下,ORDERBY子句的语法如下(假设有两个栏位)ORDERBY”栏位一”[ASCDESC]“栏位二”[ASCDESC]若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据“栏位一“由小往大排若有好几笔资料”栏位一的值相等,那这儿笔资料就依据“栏位二“由小往大排举例来说,若我们要依照Sales栏位的由大往小列出Store_Information表格中的资料Store_Inf()rmati()n表格我们就键入SELECTstore_nameSalesDateFROMStore_InformationORDERBYSalesDESC结果:在以上的例子中,我们用栏位名来指定排列顺序的依据除了栏位名外,我们也可以用栏位的顺序(依据SQL句中的顺序)在SELECT后的第一个栏位为1第二个栏位为2以此类推在上面这个例子中,我们用以下这句SQL可以达到完全一样的效果SELECTstore_nameSalesDateFROMStorc_lnformationORDERBY2DESCstore_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$25Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngelesSI50Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$25Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999storc_namcSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiego而我们要知道每一区region_name的营业密\salesoGeography这个表格告诉我们母一store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiegoS25OJan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999regionnamestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiegoregion_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiegoregion_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiegostore_nameSalesDateLosAngeles$1500Jan-05-1999栏位名性质SID主键Last_NameFirst_Name栏位名性质Ordcr_ID主键Ordcr_DatcCustomer_SlD外来键Amountstore_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiego栏位名称资料种类First_Namechar50Last_Namechar50Addresschar50CitvJchar50CountryJchar25SanDiegoS250Jan-07-1999LosAngeles$300Jan-08-1999BostonS70CJan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$25Jan-07-1999LosAngeles$300Jan-08-1999BostonS700Jan-08-1999Birth_Datedate栏位名称资料种类First_Namechar50Last_Namechar50Addresschar50Citychar50Countrychar25Birth_DatedateGendercharl栏位名称资料种类FirsjNamechar50Last_Namechar50Addrchar50Citychar50CountryJchar25Birth_DatedateGendercharl栏位名称资料种类First_Namechar50Last_Namechar50Addrchar30Citychar50Countrychar25Birth_DatedateGendercharl栏位名称资料种类First__Namcchar50Last_Namechar50Addrchar30Citychar50Countrychar25Birth_DatedateColumnNameDataTypestore_namechar50SalesfloatDatedatetimestore_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$25Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$25Jan-07-1999LosAngeles$500Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999storc_namcSalesDateSanDiego$250Jan-07-1999Boston$700Jan-08-1999store_nameSalesDateLosAngelesSI500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$30Jan-08-1999Boston$700Jan-08-1999DateSalesJan-07-1999$250Jan-10-1999$535Jan-11-1999$320Jan-12-1999$750store_nameSalesDateLosAngelesSI500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999DateSalesJan-07-1999$250Jan-10-1999$535Jan-11-1999$320Jan-12-1999$750store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999DateSalesJan-07-1999$250Jan-10-1999$535Jan-11-1999$320Jan-12-1999$750store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$25Jan-07-1999LosAngeles$300Jan-08-1999Boston5700Jan-08-1999DateSalesJan-07-1999$250Jan-10-1999$535store_nameSalesDateLosAngelesSI500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999BostonS700Jan-08-1999Jan-11-1999$320Jan-12-1999$750store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiego我们要运用subquery来找出班有在西部的店E勺营业额我们可以用卜面的SQL来达到我store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$25Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiegostore_nameNewSalesDateLosAngeles$3000Jan-05-1999SanDiego$375Jan-07-1999SanFrancisco$300Jan-08-1999Boston§700Jan-08-1999NameSalesJohn10Jennifer15Stella20Sophia40Greg50Jeff20结果NameSalesSales_RankGreg501Sophia402Stella203Jeff203Jennifer155John106NameSalesJohn10Jennifer15Stella20Sophia40Greg50Jeff20NameSalesJohn10Jennifer15Stella20Sophia40Greg50Jeff20NameSalesJohn10Jennifer15Stella20Sophia40Greg50Jeff20NameSalesPct_To_TotalGreg
500.3226Sophia
400.2581Stella
200.1290Jeff
200.1290Jennifer
150.0968John
100.0645NameSalesJohn10Jennifer15Stella20Sophia40Greg50Jeff20storc_namcSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999SanFranciscoS300Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999SanFrancisco$30Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999SanFrancisco$300Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateSanDiego$25Jan-07-1999SanFrancisco$300Jan-08-1999Boston$700Jan-08-1999store_nameSalesDateLOSANGELES$1500Jan-05-1999SANDIEGO$250Jan-07-1999SANFRANCISCO$300Jan-08-1999BOSTONS700Jan-08-1999store_nameSalesDateLOSANGELES$1500Jan-05-1999SANFRANCISCO$300Jan-08-1999SANDIEGO$250Jan-07-1999store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999SanFrancisco$300an-08-1999Boston$700Jan-08-1999store_nameSalesDateLosAngeles$1500Jan-05-1999Boston$70Jan-08-1999SanFrancisco$300Jan-08-1999SanDiego$250Jan-07-1999。
个人认证
优秀文档
获得点赞 0