|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
提供用于管理、检查、优化数据库操作的管理工具。良多SQLServer程序员对子查询(subqueries)的利用感应狐疑,特别关于嵌套子查询(即子查询中包括一个子查询)。如今,就让我们追根究底地探求这个成绩。
有两种子查询范例:尺度和相干。尺度子查询实行一次,了局反应给父查询。相干子查询每行实行一次,由父查询找回。在本文中,我将重点会商嵌套子查询(nestedsubqueries)(我将在今后先容相干子查询)。
试想这个成绩:你想天生一个卖平垫圈的发卖职员列表。你必要的数据分离在四个表格中:职员.接洽体例(Person.Contact),人力资本.员工(HumanResources.Employee),发卖.发卖定单题目(Sales.SalesOrderHeader),发卖.发卖定单概况(Sales.SalesOrderDetail)。在SQLServer中,你从内压式(outside-in)写程序,但从外压式(inside-out)入手下手思索十分有匡助,便可以一次办理必要的一个语句。
假如从内到外写起,能够反省Sales.SalesOrderDetail表格,在LIKE语句中婚配产物数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格毗连,从中能够取得发卖职员IDs(SalesPersonIDs)。然后利用SalesPersonID毗连SalesPersonID表格。最初,利用ContactID毗连Person.Contact表格。
以下为援用的内容:
USEAdventureWorks;
GO
SELECTDISTINCTc.LastName,c.FirstName
FROMPerson.ContactcJOINHumanResources.Employeee
ONe.ContactID=c.ContactIDWHEREEmployeeIDIN
(SELECTSalesPersonID
FROMSales.SalesOrderHeader
WHERESalesOrderIDIN
(SELECTSalesOrderID
FROMSales.SalesOrderDetail
WHEREProductIDIN
(SELECTProductID
FROMProduction.Productp
WHEREProductNumberLIKEFW%)));
GO
这个例子展现了有关SQLServer的几个尽妙事变。你能够发明,能够用IN()参数替换SELECT语句。在本例中,有两次使用,因而创立了一个嵌套子查询。
我是尺度化(normalization)的发热友,只管我不承受其荒唐的长度。因为尺度化具有各类查询而增添了庞大性。在这些情形下子查询就显得十分有效,嵌套子查询乃至加倍有效。
当你必要的成绩分离于良多表格中时,你必需再次将它们拼在一同,这时候你大概发明嵌套子程序就很有效。
如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,MySQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKEabc%‘,MySQL将使用索引;如果查询条件是LIKE%abc’,MySQL将不使用索引。 |
|