关于SQL的子查询

关于SQL的子查询

      今天组长要我们写SQL语句,我一看.MD大概要牵套5张表,条件还N复杂。而且每个表有几十W数据要考虑性能。说实话我拿着式样书还是不知道从何下手。我发觉自己总是碰到了问题才去解决,而不是尽量去避免问题(组长昨天就通知我们回去看一下SQL语法,我当时就没放在心里Y_Y)。
       PS:本来觉得疯流成性这个名字不雅,不过最近越来越发觉这个名字有性格,所以还是改回来了。 1。什么是子查询?
      将一个查询包含到另一个查询中。
2。工作原理?
      子查询是牵套在另一个select语句中的select语句。内部select语句返回用作于外部select语句的条件的列。首先从最内部的select开始执行。

3。在大多数查询中,子查询并不引用父查询。因此子查询中的值保持不变。例如:
// MSSQL
// 通过IN  OR   NOT  IN引入的子查询结果
// 是一列零值或更多值
// 把(titles)子查询里结果作为
// (publicshers)父查询的条件进行查询
USE  PUBS
SELECT  PUB_NAME TITLE
FROM  PUBLICSHERS
WHERE  PUB_ID  IN (
  
SELECT  PUB_ID  FROM  TITLES
  
WHERE  TYPE  =   ' BUSSINESS ' )

如果子查询引用了父查询,就需要为父查询中的每次迭代重新计算子查询的值。
// 子查询中用到了父查询的值
// 在有大量数据的时候尽量避免使用此类查询
// 它查询数据可是成指数增长的
USE  PUBS
SELECT  A.CITY  FROM  SUPPLIERS A
WHERE  A.SUPPLIERID  IN  (
  
SELECT  B.SUPPLIERID  FROM  PRODUCTS B 
  
WHERE  A.SUPPLIERID  =  B.SUPPLIERID)

4。我要说一下联接和子查询的区别
      联接与子查询处理类似问题不同之处在于,联接可以在结果集中显示多个表的列。
      右联接就是查询包含了右边表的全部记录,即使左边表中没有匹配的值。
      左联和右联正好相反
// 内联接
USE  PUBS
SELECT  A.PUB_NAME, A.TITLE
FROM  PUBLISHERS A  INNER   JOIN  TITLES B
ON  A.PUB_ID  =  B.PUB_ID 
AND  TYPE  =   ' BUSSINESS ' )

5。关于使用EXISTS AND NOT EXISTS的子查询
      使用EXISTS引入一个子查询,就相当于进行一次存在的测试,外部查询的WHERE子句测试子查询
返回的行是否存在。子查询不产生任何结果;它只返回TRUE或FALSE值。
// 查找存在商业书籍的出版商的名字
// 和内联对比下有什么不同
USE  PUBS
SELECT  A.PUB_NAME
FROM  PUBLISHERS A
WHERE   EXISTS  (
  
SELECT   * FROM  TITLES
  
WHERE  PUB_ID  =  A.PUB_ID
  
AND  TYPE  =   ' BUSSINESS ' )

// 子查询,再次对比下
USE  PUBS
SELECT  PUB_NAME
FROM  PUBLISHERS
WHERE  PUB_ID  IN  (
  
SELECT  PUB_ID  FROM  TITLES
  
WHERE  TYPE  =   ' BUSSINESS ' )

      通过测试我猜想EXISTS关键字它的工作原理是:遍历所有的记录,每遍历一条记录,子查询就判断是否存在,存在的话满足条件显示这条记录,然后一直找到最后条记录。(如果有不对的地方或者需要改进的地方,请大家要告诉我啊)



今天就到这里把,象我这么牛的身体也经不起经常熬夜+_+!。






你可能感兴趣的:(关于SQL的子查询)