一般情况下,你完全可以把查询理解为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中。
select * from ktab
where not exists (select * from kstab where khh=ktab.khh)
go就是对于外层循环ktab的没一条记录,用这个记录的khh字段,放到not exists中,与里面的kstab的khh关联,
如果能连接上,那么就不返回外层的ktab的这条记录,如果在内层没有这条记录,那么就返回这条记录。第二个也是一样,可以了解为3层for循环。
查询所用客户都订购了的商品的商品信息:
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中。