资源描述:
《数据库原理及应用8》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、3.8SQL中行的分组SQL允许select语句根据某些列值的共性把一个表所包含的全部行分成若干个子集,然后对每个子集执行集合函数。例:selectpid,sum(qty)astotalfromordersgroupbypid;pidtotal….……这里很重要的一点是:选择列表中的所有属性都必须以单个原子值来对应有groupby分得的每一组。例如,下面select是无效的。Selectpid,cid,sum(qty)fromordersgroupbypid我们无法在与每个pid值相对应的单独一行上检
2、索出多个不同的cid值。譬如:p01可能被顾客c001、c002、c004订购过。但select语句的groupby本身能包含多个列名。例3.8.1创建一个计算每样商品被每个代理商代理的总量的查询。Selectpid,aid,sum(qty)astotalfromordersgroupbypid,aid;pidaidtotal………若同时使用where和groupby,应该先执行where再按照groupby分组。求解的概念性步骤为:1、对from中的所有表做乘积2、删除不满足where条件的行3、根
3、据guoupby对剩余行进行分组4、求出选择列表中表达式的值考虑:假如我们想创建这样的一个查询:计算每样商品被订购的总量,并将总量超过1000的商品pid和对应的数量检索出来。selectpid,sum(qty)fromorderswheresum(qty)>1000groupbypid;对吗?分析:首先集合函数不能直接出现在where子句中,另外,groupby是在where之后执行的,所以上面的实现是错误的。那么,如何对分组之后的行集进行有条件的筛选呢?基本SQL为select提供了一种新的约束子
4、句:having子句。例3.8.3当某个代理商所代理的某种商品的总量超过了1000时,检索出所有满足这个条件的商品和代理商的编号以及这个总量。selectpid,aid,sum(qty)astotalfromordersgroupbypid,aidhavingsum(qty)>1000Having子句的操作在groupby之后执行,注意:having子句只能对各个分组相对应的单值(也就是能合法出现在选择序列中的值)进行测试。例3.8.4求出被至少两个顾客订购的所有商品的pidSelectpidfrom
5、ordersgroupbypidhavingcount(distinctcid)>=2这里,我们所介绍的基本SQL的select语句不允许集合函数的嵌套。譬如:selectavg(selectmax(dollars)fromorders)groupbyaid是非法的!orderby子句orderbyresult_column[asc
6、desc]{,result_column[asc
7、desc]…..}asc对指定的result_column按升序排列,desc对指定的result_column按降序排
8、列,缺省为ascselect*fromordersorderbyqty则对订购记录按照订购商品的数量,由底到高排列。selectpid,aid,sum(qty)astotalfromordersgroupbypid,aidhavingsum(qty)>1000orderbytotal,aiddesc则对得到的结果表按订购的数量升序排列,当数量一样时,再对代理商编号按降序排列。到目前为止,select语句的整个概念性步骤如下:1、对from中的所有表做乘积2、删除不满足where条件的行3、根据guou
9、pby对剩余行进行分组4、删除不满足having子句的组5、求出select选择列表中表达式的值6、若有关键词distinct,则删除重复的行7、求解union、intersect和except8、若有orderby子句,则按指定的列排序max、min、avg集合函数较简单例3.9.3检索所有顾客的最大折扣值。selectmax(discnt)fromcustomers当然我们也可以这样实现:Selectdistinctdiscntfromcustomerscwherediscnt>all(selec
10、tdiscntfromcustomerswherecid<>c.cid)模糊匹配我们可以使用Like谓词进行模糊匹配,即按关键字搜索。模式串中的字符含义下划线(_)百分号(%)转义字符所有其它字符任意单个字符的统配符包含零个或多个字符的任意序列的统配符用在需要按字面含义引用的字符之前代表它们自己例3.9.4检索cname值以字母“A”打头的顾客的所有信息。select*fromcustomerswherecnamelike’A%’若我们要在模式串中按照字