MSDN对子查询的定义是这样的:函数

     能够将一个查询的结果用做另外一个查询的输入。能够将子查询的结果用做使用 IN( ) 函数、EXISTS 运算符或 FROM 子句的语句。

     一条好的值得称赞的规则是尽可能用链接代替全部的子查询。优化器有时能够自动将子查询“扁平化”,而且用常规或外链接代替。但那样也不老是有效。明确的链接对选择表的顺序和找到最可能的计划给出了更多的选项。当你优化一个特殊查询时,了解一下是否去掉自查询可产生很大的差别。这段话出自http://www.innovatedigital.com/htm_speek/SQLServerOpt.shtml它显然告诉咱们在查询的时候最好不要用子查询,当时我并不太在乎,至到我有一次遇到了这样的状况。  
      
     如今的网站主要的压力都来自于数据库,频繁的数据库访问常常会使服务器死机。个人原则就是尽可能减小数据库的链接,能一次性取出的决很少链接数据库一次,可是有时候并不彻底是这样。郁闷,无解。    
 
     下面一条SQL语句里面有一个子查询,info.RESOURCE_VOLUMECOUNT,它是指一个电影共有多少集.这个字段是int类型的.子查询的目的就是计算出一个电影在资源表中总共有多少集(实际存在的), 二者作减法操做就能够计算出这个电影共缺多少集(lastCount)咱们知道在这条语句执行的时候,外层记录查询一次在计算 lastCount字段的时候又要查询表:电影表一次.若是最外层有10条记录,那么执行此次查询一共要扫描电影表11次,链接数据库1次.
      优化

    基于有的朋友看不明白我写的SQL语句,多是由于我写的有些字段和本案例没有太大关系的缘由,如今特将它们作一个替换.网站

 

通过我的实践,证实子查询效率特别低,而通常的子查询均可以由关连查询来实现相同的功能,关联查询的效率要提升不少,因此建议在数据查询时避免使用子查询(尤为是在记录不少时),而最好用关联查询来实现。
      如今举例说明。
     我作的是简单的北京公交查询系统,用的是MySQL数据库,数据库包含两张表,line表和track表。line表有lid和lname两个属性,分别表示线路id和线路名称。track表有lid,seq,sname,lo,la五个属性,分别表示站点所在的线路id,站点在线路上的顺序,站点名称,站点的经度和纬度。如今要查询某一给定线路名称的线路上全部站点的经度和纬度。其中line中有1112条记录,track中约有20万条记录。
     子查询sql语句:select  lo,la  from  track where lid in (select lid from line where lname like '%lname%');
     关联查询sql语句:select lo,la from track,line where line.lname like  '%lname%' and line.lid=track.lid;
     子查询运行时间为5分48秒;而关联查询耗时不足一秒。事实胜于雄辩,关联查询的优点不言而喻。
    在关联查询时要注意:where子句中必定要包含表之间的链接条件,如 line.lid=track.lid,不然查询结果会彻底超乎咱们的想象,形成没必要要的麻烦。