SQL联接总结范文.doc_第1页
SQL联接总结范文.doc_第2页
SQL联接总结范文.doc_第3页
SQL联接总结范文.doc_第4页
SQL联接总结范文.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SQL联接总结范文 一内联接查询内部联接是使用比较运算符比较要联接列中的值的联接。 在SQL-92标准中,可以在FROM子句或WHERE子句中指定内部联接。 这是WHERE子句中唯一一种SQL-92支持的联接类型。 WHERE子句中指定的内部联接称为旧式内部联接。 从这句话我们可以知道inner joinon用在from子句后面,而=,=,=则用在where子句中下面的Transact-SQL查询是一个内部联接示例复制代码USE AdventureWorks;GO SELECT*FROM HumanResources.Employee ASe INNER JOIN Person.Contact ASc ONe.ContactID=c.ContactID ORDER BY c.LastName此内部联接称为同等联接。 1。 它返回两个表中的所有列,2。 但只返回在联接列中具有相等值的行。 3.inner默认为缺省(所以可以不用写inner)使用等号以外的运算符的联接也可以联接两个不相等的列中的值。 用于内部联接的运算符和谓词同样也可用于不等联接。 有关可用于联接的运算符和谓词的详细信息,请参阅在表达式中使用运算符和WHERE(Transact-SQL)。 以下示例使用小于()联接查找产品718中小于所建议标价的零售价格。 复制代码USE AdventureWorks;GO SELECTDISTINCT p.ProductID,p.Name,p.ListPrice,sd.UnitPrice ASSelling PriceFROM Sales.SalesOrderDetail ASsd JOIN Production.Product ASp ONsd.ProductID=p.ProductID ANDsd.UnitPrice)。 通常不等联接只有与自联接同时使用才有意义。 例如,使用此不等Transact-SQL联接和自联接查找至少具有两个小于$15的不同价格的子类别复制代码USE AdventureWorks;GO SELECTDISTINCT p1.ProductSubcategoryID,p1.ListPrice FROMProduction.Product p1INNER JOINProduction.Product p2ON p1.ProductSubcategoryID=p2.ProductSubcategoryID AND p1.ListPricep2.ListPrice WHEREp1.ListPrice$15ANDp2.ListPrice$15ORDER BYProductSubcategoryID;注意表达式NOT column_name=column_name与表达式column_namecolumn_name等效。 以下Transact-SQL示例使用不等联接与自联接查找ProductVendor表中的所有行,在此表中两行或多行具有相同的ProductID编号但具有不同的VendorID编号(即产品具有多个供应商)复制代码USE AdventureWorks;GO SELECTDISTINCT p1.VendorID,p1.ProductID FROMPurchasing.ProductVendor p1INNER JOIN Purchasing.ProductVendor p2ON p1.ProductID=p2.ProductID WHEREp1.VendorIDp2.VendorID ORDER BY p1.VendorID总结1.select*from Aa inner join Bb ona.id=b.id anda.xxwhere xxx2.如果使用*号,则返回两个表中的所有列3.仅当两个表中都至少有一个行符合联接条件时,内部联接才返回行。 内部联接消除了与另一个表中的行不匹配的行二外部联接外部联接会返回FROM子句中提到的至少一个表或视图中的所有行,只要这些行符合任何WHERE或HAVING搜索条件。 将检索通过左外部联接引用的左表中的所有行,以及通过右外部联接引用的右表中的所有行。 在完全外部联接中,将返回两个表的所有行左外部联接则左表中的所有行存在于查询结果中,而匹配列中列值不匹配的将用空值填充右外部联接则右表中的所有行存在于查询结果中,而匹配列中列值不匹配的将用空值填充完全外部联接将返回两个表的所有行Microsoft SQL Serverxx对FROM子句中指定的外部联接使用下列SQL-92关键字LEFT OUTERJOIN或LEFT JOINRIGHT OUTERJOIN或RIGHT JOINFULL OUTERJOIN或FULL JOIN使用左外部联接考虑通过ProductID列联接Product表和ProductReview表。 结果只显示已编写审核的产品。 若要包括所有产品,不论是否已编写审核,请使用SQL-92左外部联接。 查询如下复制代码USE AdventureWorks;GO SELECT p.Name,pr.ProductReviewID FROMProduction.Product pLEFT OUTERJOINProduction.ProductReview prON p.ProductID=pr.ProductID不管是否与ProductReview表的ProductID列相匹配,LEFT OUTERJOIN都会在结果中包括Product表的所有行。 请注意,对于结果中没有匹配的产品审核ID的产品,行的ProductReviewID列中则包含一个空值。 使用右外部联接考虑通过TerritoryID列联接SalesTerritory表和SalesPerson表。 结果显示已分配给销售人员的任何区域。 SQL-92右外部联接运算符RIGHT OUTERJOIN指明不管第一个表中是否有匹配的数据,结果中都将包括第二个表中的所有行。 若要在结果中包括所有销售人员,不论是否为他们分配了区域,请使用SQL-92右外部联接。 下面是Transact-SQL查询和右外部联接的结果复制代码USE AdventureWorks;GO SELECTst.Name ASTerritory,sp.SalesPersonID FROMSales.SalesTerritory stRIGHT OUTERJOIN Sales.SalesPerson spON st.TerritoryID=sp.TerritoryID;下面是结果集复制代码Territory SalesPersonID-NULL268Northeast275Southwest276Central277Canada278Southeast279Northwest280Southwest281Canada282Northwest283NULL284United Kingdom285France286Northwest287NULL288Germany289Australia290(17row(s)affected)使用谓词可以进一步限定外部联接。 此示例包含相同的右外部联接,但只包括销售额少于$2,000,000的销售区域复制代码USE AdventureWorks;GO SELECTst.Name ASTerritory,sp.SalesPersonID FROMSales.SalesTerritory stRIGHT OUTERJOIN Sales.SalesPerson spON st.TerritoryID=sp.TerritoryID WHEREst.SalesYTD$2000000;有关谓词的详细信息,请参阅WHERE(Transact-SQL)。 使用完全外部联接若要通过在联接的结果中包括不匹配的行来保留不匹配信息,请使用完全外部联接。 SQLServer提供了完全外部联接运算符FULL OUTERJOIN,它将包括两个表中的所有行,不论另一个表中是否有匹配的值。 考虑通过ProductID列联接Product表和SalesOrderDetail表。 结果只显示有销售订单的产品。 SQL-92FULL OUTERJOIN运算符指明不管表中是否有匹配的数据,结果中都将包括两个表中的所有行。 您可以在完全外部联接中包括WHERE子句,仅返回两表之间没有匹配数据的行。 以下查询只返回没有匹配销售订单的产品以及没有匹配产品的销售订单(虽然本例中所有销售订单都有匹配的产品)。 复制代码USE AdventureWorks;GO-The OUTERkeyword followingthe FULLkeyword isoptional.SELECT p.Name,sod.SalesOrderID FROMProduction.Product pFULL OUTERJOIN Sales.SalesOrderDetail sodON p.ProductID=sod.ProductID WHEREp.ProductID ISNULL ORsod.ProductID ISNULL ORDERBY p.Name; 三、交叉联接没有WHERE子句的交叉联接将产生联接所涉及的表的笛卡尔积。 第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小1交叉连接cross join(不带where条件)2等同于select*from a,b a-m行,b-n行3返回m*n行的记录。 下面的示例显示了Transact-SQL交叉联接。 复制代码USE AdventureWorks;GO SELECTp.SalesPersonID,t.Name ASTerritory FROMSales.SalesPerson pCROSS JOINSales.SalesTerritory tORDERBY p.SalesPersonID;结果集包含170行(SalesPerson具有17行,SalesTerritory具有10行,17乘以10等于170)。 但是,如果添加了WHERE子句,则交叉联接的行为将与内部联接行为相似。 例如,以下Transact-SQL查询生成相同的结果集。 复制代码USE AdventureWorks;GO SELECTp.SalesPersonID,t.Name ASTerritory FROMSales.SalesPerson pCROSS JOINSales.SalesTerritory tWHEREp.TerritoryID=t.TerritoryID ORDERBY p.SalesPersonID;-Or USE AdventureWorks;GO SELECTp.SalesPersonID,t.Name ASTerritory FROMSales.SalesPerson pINNER JOINSales.SalesTerritory tON p.TerritoryID=t.TerritoryID ORDERBYp.SalesPersonID; 四、自联接表可以通过自联接与自身联接。 例如,可以使用自联接查找由多个供应商提供的产品。 1必须在FROM子句中为该表给定两个不同的别名2使用innerjoinon由于此查询涉及ProductVendor表与其自身的联接,因此ProductVendor表将以两种角色出现。 若要区分这两种角色,必须在FROM子句中为ProductVendor表给定两个不同的别名(pv1和pv2)。 这些别名用于限定查询其余部分中的列名。 下面是自联接Transact-SQL语句示例复制代码USEAdventureWorks;GO SELECTDISTINCT pv1.ProductID,pv1.VendorID FROMPurchasing.ProductVendor pv1INNERJOINPurchasing.ProductVendor pv2ON pv1.ProductID=pv2.ProductID ANDpv1.VendorIDpv2.VendorID ORDERBY pv1.ProductID用于比如查重复记录更为通常的,举个例子,员工表,有些记录是经理,其他是员工,员工和经理是多对一关系你如果要查询某经理的下属,肯定需要自连接,通过查询相同的经理ID就可以得到该ID下的下属 五、联接三个或多个表虽然每个联接规范只联接两个表,但FROM子句可包含多个联接规范。 这样一个查询可以联接许多表。 AdventureWorks数据库的ProductVendor表是一个很好的示例,在该示例联接两个以上的表非常有用。 下面的Transact-SQL查询将查找特定子类别的所有产品的名称和产品供应商的名称复制代码SELECTp.Name,v.Name FROMProduction.Product pJOINPurchasing.ProductVendor pv此处的join省掉了inner ONp.ProductID=pv.ProductID JOINPurchasing.Vendor vON pv.VendorID=v.VendorID WHEREProductSubcategoryID=15ORDERBYv.Name下面是结果集复制代码Name NameLL Mountain Seat/Saddle ChicagoCity SaddlesML MountainSeat/Saddle ChicagoCity SaddlesHL MountainSeat/Saddle ChicagoCity SaddlesLL Road Seat/Saddle ChicagoCity SaddlesML RoadSeat/Saddle ChicagoCity SaddlesHL RoadSeat/Saddle ChicagoCity SaddlesLL TouringSeat/Saddle ChicagoCity SaddlesML TouringSeat/Saddle ChicagoCity SaddlesHL TouringSe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论