编程之道

无论是批评的,赞扬的,指着的都请EMAIL给我,你的建议将是我前进的动力! 联系我

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



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






posted on 2005-10-10 22:48 疯流成性 阅读(1260) 评论(0)  编辑  收藏 所属分类: 数据库


只有注册用户登录后才能发表评论。


网站导航: