(精品)SQL知识-SQL2005子句.ppt
SQL内部培训内部培训第二天第二天更多信息请登陆:http:/4006343551用友软件核心合作伙伴http:/ 总体内容介绍总体内容介绍SQL 中的子句中的子句表的联合表的联合子查询:内嵌的子查询:内嵌的SQL 子句子句操作数据操作数据 SQL 中的子句中的子句WHEREWHERE子句子句SELECT Tab1.name,Tab2.id FROM Tab1,Tab2 WHERE Tab1.id*=Tab2.id From tab1 as a,tab2 as b SQL 中的子句中的子句 ORDER BY ORDER BY order_by_expressionorder_by_expression ASC|DESC ASC|DESC ,.,.n n Select Select From From Where Where Order by Order by SQL 中的子句中的子句 Group by 子句 GROUP BY ALL group_by_expression ,.n WITH CUBE|ROLLUP 查询存货明细表中仓库01中存货010201所有的入库数量USE ufdata_888_2004SELECT cwhcode,cinvcode,sum(isnull(iainquantity,0)as iquantityFROM ia_subsidiaryWHERE cwhcode=01 and cinvcode=010201GROUP BY cwhcode,cinvcode SQL 中的子句中的子句下面是结果集:下面是结果集:Cwhcode cinvcode iquantityCwhcode cinvcode iquantity-01 010201 560.0(1 row(s)affected)SQL 中的子句中的子句HAVING HAVING 子句子句HAVING 使用使用 HAVING HAVING 子句选择行子句选择行HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。查询出仓库01中,所有入库金额超过1000000的存货的入库数量USE ufdata_888_2004 SELECT cwhcode,cinvcode,sum(isnull(iainquantity,0)FROM ia_subsidiary GROUP BY cwhcode,cinvcodeHAVING SUM(isnull(iainprice,0)1000000 SQL 中的子句中的子句下面是结果集:下面是结果集:Cwhcode cinvcode iquantityCwhcode cinvcode iquantity-0403011100.0040303850.00403061220.0040308700.00403091350.00403101540.00403112180.00808017000.008080214000.00808033000.0 SQL 中的子句中的子句以下是没有聚合函数的 HAVING 子句的示例。查询存货明细表中供应商编码以03开头的各存货的采购入库数USE ufdata_888_2004 select cvencode,cinvcode,sum(isnull(iainquantity,0)as iquantityfrom ia_subsidiary where cvoutype=01group by cvencode,cinvcodehaving cvencode like 03%SQL 中的子句中的子句下面是结果集:cvencode cinvcode iquantitycvencode cinvcode iquantity-030190101017000.800000000000203019010102176.42000000000002030010101033520.0030040101035216.0030050101055216.0030080101052380.0030020101078821.003006010107120.00300601010880.003015010109165.0030150101109161.0030100101128879.0030100101139021.003015010114445.00301501011575.003013010116635.003013010117365.0030130101182995.0030150301125.0 SQL 中的子句中的子句如果HAVING中包含多个条件,那么这些条件将通过AND、OR或NOT组合在一起以下显示的是存货明细表中供应商编码以03开头并且入库数量超过3000的各存货的采购入库数USE ufdata_888_2004 select cvencode,cinvcode,sum(isnull(iainquantity,0)as iquantityfrom ia_subsidiary where cvoutype=01group by cvencode,cinvcodehaving cvencode like 03%and sum(isnull(iainquantity,0)3000 SQL 中的子句中的子句ORDER BY 可以用来为查询的结果按某种顺序排序(默认为升序)下面的示例显示使用 ORDER BY 子句将查询返回中的行按日期进行降序排序:select cwhcode,cinvcode,dvoudate,sum(iainquantity)as iquantity from ia_subsidiary where cvoutype=01group by cwhcode,cinvcode,dvoudate order by dvoudate desc SQL 中的子句中的子句理解应用理解应用 WHEREWHERE、GROUP BY GROUP BY 和和 HAVING HAVING 子句的正确序列对编写高效的查询代码子句的正确序列对编写高效的查询代码会有所帮助:会有所帮助:WHERE WHERE 子句用来筛选子句用来筛选 FROM FROM 子句中指定的操作所产生的行。子句中指定的操作所产生的行。GROUP BY GROUP BY 子句用来分组子句用来分组 WHERE WHERE 子句的输出。子句的输出。HAVING HAVING 子句用来从分组的结果中筛选行。子句用来从分组的结果中筛选行。SQL 中的子句中的子句对于可以在分组操作之前应用的搜索条件,在 WHERE 子句中指定它们更有效。这样可以减少必须分组的行数。应当在 HAVING 子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。SQL Server查询优化器可处理这些条件中的大多数。如果查询优化器确定 HAVING 搜索条件可以在分组操作之前应用,那么它就会在分组之前应用。查询优化器可能无法识别所有可以在分组操作之前应用的 HAVING 搜索条件。建议将所有这些搜索条件放在 WHERE 子句中而不是 HAVING 子句中。表的联合(表的联合(JoinJoin)又时所需的资料并不是放在同一个表中,在这个时候,你就要用到Join,如我们U8中的主子表 当然Join如何将不同的数据库的资料结合,还要看你如何使用它。一共有四种不同的Join的方式:INNER JoinFULL OUTER JoinLEFT OUTER JoinRIGHT OUTER Join 表的联合(表的联合(JoinJoin)INNERINNER指定返回每对匹配的行。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。FULL OUTERFULL OUTER指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补充。LEFT OUTERLEFT OUTER指定在结果集中包含左表中所有不满足联接条件的行,且在由内联接返回所有的行之外,将另外一个表的输出列设为 NULL。RIGHT OUTERRIGHT OUTER指定在结果集中包含右表中所有不满足联接条件的行,且在由内联接返回的所有行之外,将与另外一个表对应的输出列设为 NULL。表的联合(表的联合(JoinJoin)SelectFrom On例子Useufdata_888_2004Select*Fromrdrecord InnerJoinrdrecords On rdrecord.id=rdrecords.id 表的联合(表的联合(JoinJoin)OuterJoin的语法 SelectFrom OuterJoinOn 表的联合(表的联合(JoinJoin)OuterJoin是inclusive(包容性吧)不同于InnerJoin的exclusive(排他性)LeftOuterJoin的查询结果会包含所有Left资料表的资料,对应的Right表的记录用Null填写;RightOuterJoin的查询就会包含所有Right资料表的资料,对应的Left表的记录用Null填写 表的联合(表的联合(JoinJoin)LeftOuterJoin子句Select*Fromap_detail LeftOuterJoininventory On ap_detail.cinvcode=inventory.cinvcode 表的联合(表的联合(JoinJoin)RightOuterJoin子句子句Select*Frominventory RightJoinap_detail Oninventory.cinvcode=ap_detail.cinvcode 表的联合(表的联合(JoinJoin)FULL OUTER Join子句子句FULL OUTER Join指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补充。Union运算符UNION 运算符运算符将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。这与使用联接组合两个表中的列不同。使用 UNION 组合两个查询的结果集的两个基本规则是:所有查询中的列数和列的顺序必须相同。数据类型必须兼容。UNION 运算符Table1 和和 Table2 具有相同的两列结构。具有相同的两列结构。UNION 运算符下面的查询在这两个表之间创建下面的查询在这两个表之间创建 UNION 运算:运算:SELECT*FROM Table1 SELECT*FROM Table1 UNION UNION SELECT*FROM Table2 SELECT*FROM Table2 UNION 运算符下面是结果集:下面是结果集:ColumnA ColumnB-abc 1 def 2 ghi 3 jkl 4 mno 5 子查询:内嵌的子查询:内嵌的SQL SQL 子句子句if exists(select*from dbo.sysobjects where id=object_id(Ndbo.PO_Podetails)and OBJECTPROPERTY(id,NIsUserTable)=1)drop table dbo.PO_PodetailsGO 子查询:内嵌的子查询:内嵌的SQL SQL 子句子句USE pubs GO SELECT DISTINCT pub_name FROM publishers WHERE EXISTS(SELECT*FROM titles WHERE pub_id=publishers.pub_id AND type=business)GO 子查询:内嵌的子查询:内嵌的SQL SQL 子句子句USE pubs USE pubs GO GO SELECT distinct pub_name SELECT distinct pub_name FROM publishers FROM publishers WHERE pub_id WHERE pub_id IN(SELECT pub_id FROM titles WHERE type=business)IN(SELECT pub_id FROM titles WHERE type=business)GO GO 子查询:内嵌的子查询:内嵌的SQL SQL 子句子句NOT EXISTSNOT EXISTSNOT EXISTS NOT EXISTS 的作用与的作用与 EXISTS EXISTS 正相反。如果子查询没有返回行,则满足正相反。如果子查询没有返回行,则满足 NOT NOT EXISTS EXISTS 中的中的 WHERE WHERE 子句。本示例查找不出版商业书籍的出版商的名称:子句。本示例查找不出版商业书籍的出版商的名称:USE pubs USE pubs GO GO SELECT pub_name SELECT pub_name FROM publishers FROM publishers WHERE WHERE NOT EXISTS(SELECT*FROM titles WHERE pub_id=NOT EXISTS(SELECT*FROM titles WHERE pub_id=publishers.pub_id AND type=business)publishers.pub_id AND type=business)ORDER BY pub_name ORDER BY pub_name GO GO 操作数据(操作数据(INSERT UPDATE DELETEINSERT UPDATE DELETE)INSERT INTOINSERT INTO子句子句INSERT INTO INSERT INTO titles(title_id,title,type,pub_id,price)titles(title_id,title,type,pub_id,price)VALUES(BU9876,Creating Web Pages,business,1389,VALUES(BU9876,Creating Web Pages,business,1389,29.99)29.99)操作数据(操作数据(INSERT UPDATE DELETEINSERT UPDATE DELETE)UPDATEUPDATE子查询子查询子查询可以嵌套在子查询可以嵌套在 UPDATEUPDATE、DELETE DELETE 和和 INSERT INSERT 语句以及语句以及 SELECT SELECT 语句中。语句中。下面的查询将下面的查询将手机主辅料仓库的出入单的记帐人标志置空手机主辅料仓库的出入单的记帐人标志置空。该查询更新。该查询更新 rdrecord rdrecord 表;其子查表;其子查询引用询引用 warehouse warehouse 表。表。UPDATE rdrecordUPDATE rdrecordSET caccounter=null SET caccounter=null WHERE cwhcode IN(SELECT cwhcode FROM warehouse WHERE cwhname=WHERE cwhcode IN(SELECT cwhcode FROM warehouse WHERE cwhname=手机主辅料手机主辅料仓库仓库)下面是使用联接的等效下面是使用联接的等效 UPDATE UPDATE 语句:语句:UPDATE rdrecordUPDATE rdrecordSET caccounter=null SET caccounter=null FROM rdrecordFROM rdrecordINNER JOIN warehouse INNER JOIN warehouse ON rdrecord.cwhcode=warehouse.cwhcode AND cwhname=ON rdrecord.cwhcode=warehouse.cwhcode AND cwhname=手机主辅料仓库手机主辅料仓库 操作数据(操作数据(INSERT UPDATE DELETEINSERT UPDATE DELETE)DELETEDELETE子句子句通过下面嵌套的查询,可以删除商业书籍的所有销售记录:通过下面嵌套的查询,可以删除商业书籍的所有销售记录:DELETE ia_subsidiaryDELETE ia_subsidiaryWHERE id WHERE id IN(SELECT autoid FROM rdrecords WHERE cinvcode=IN(SELECT autoid FROM rdrecords WHERE cinvcode=0301)0301)操作数据(操作数据(INSERT UPDATE DELETEINSERT UPDATE DELETE)Update使用注意(where后的条件一定要验证)Select*from accinformation where cid=99 and cvalue=8.60Update accinformation set cvalue=8.50where cid=99 and cvalue=8.60 操作数据(操作数据(Select IntoSelect Into)Select into 子句子句SELECT csbvcode,ddate,ccuscode,iquantity,imoney INTO NewShippersFROM salebillvouch JOIN salebillvouchs ON(salebillvouch.sbvid=salebillvouchs.sbvid)总结总结1.SQL 1.SQL 中的子句(中的子句(WHEREWHERE,ORDER BYORDER BY,GROUP BYGROUP BY,HAVINGHAVING),子查询中),子查询中EXISTEXIST如何使用如何使用2.2.表的联合(表的联合(Inner JoinInner Join;Left Out JoinLeft Out Join;Right Out Right Out JoinJoin;Full Out JoinFull Out Join)3.INSERT UPDATE 3.INSERT UPDATE 和和DELETE DELETE 来处理数据来处理数据4.Select into4.Select into语句语句 结束结束