日期:2014-05-17  浏览次数:20752 次

SQL查询语句看不懂阿?
一个数据库3个表格:
ktab客户信息表,主键khh客户号
stab商品信息表,主键sph商品号
kstab订货表,主键khh和sph,属性dhl订货量

查询没有订货的客户的个人信息:
select * from ktab 
  where not exists (select * from kstab where khh=ktab.khh)
go

查询所用客户都订购了的商品的商品信息:
select * from stab
  where not exists (select * from ktab
    where not exists (select * from kstab
      where sph=stab.sph and khh=ktab.khh ))
go

上面的语句怎么理解呢?假如把它们转化成类C语言的算法描述,大概的嵌套和步骤是怎样的?我只有对具体的算法描述才能理解一些,SQL前面章节较简单的语句能理解,发现这一节不好理解,大脑无法思考。

------解决方案--------------------
先查询最里层的数据,然后和第二层匹配,得到的结果集再和最外层匹配,最后显示数据
------解决方案--------------------
EXISTS表示存在 NOT EXISTS就表示不存在了

select * from ktab 
   where not exists (select * from kstab where khh=ktab.khh)

表示ktab表中的不存在于kstab 表的记录

下面的同理
------解决方案--------------------
一般情况下,你完全可以把查询理解为2层的for循环。

比如第一个:
select * from ktab 
  where not exists (select * from kstab where khh=ktab.khh)
go

就是对于外层循环ktab的没一条记录,用这个记录的khh字段,放到not exists中,与里面的kstab的khh关联,
如果能连接上,那么就不返回外层的ktab的这条记录,如果在内层没有这条记录,那么就返回这条记录。

第二个也是一样,可以了解为3层for循环。

------解决方案--------------------
根据字面理解 not exists  就是不存在,exists 就是存在

 
------解决方案--------------------
引用:
Quote: 引用:

一般情况下,你完全可以把查询理解为2层的for循环。

比如第一个:
select * from ktab 
  where not exists (select * from kstab where khh=ktab.khh)
go

就是对于外层循环ktab的没一条记录,用这个记录的khh字段,放到not exists中,与里面的kstab的khh关联,
如果能连接上,那么就不返回外层的ktab的这条记录,如果在内层没有这条记录,那么就返回这条记录。

第二个也是一样,可以了解为3层for循环。

第一个好像能理解,第2个:查询所用客户都订购了的商品的商品信息,这句话怎么变换成SQL语句的形式呢?


这个第2个语句:
查询所用客户都订购了的商品的商品信息:
select * from stab
  where not exists (select * from ktab
    where not exists (select * from kstab
      where sph=stab.sph and khh=ktab.khh ))

就是对stab中的每一个商品,在ktab表中不存在一个客户,与这个商品的对应关系,是不在 kstab表中的。
也就是这个商品和每个客户的对应关系,都存在于kstab中。