SQL查询语句看不懂阿?

ooolinux 2013-11-25 05:17:47
一个数据库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前面章节较简单的语句能理解,发现这一节不好理解,大脑无法思考。
...全文
210 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-11-26
  • 打赏
  • 举报
回复
引用 5 楼 u010165006 的回复:
[quote=引用 3 楼 yupeigu 的回复:] 一般情况下,你完全可以把查询理解为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语句的形式呢?[/quote] 这个第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中。
ooolinux 2013-11-26
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
一般情况下,你完全可以把查询理解为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语句的形式呢?
十八道胡同 2013-11-25
  • 打赏
  • 举报
回复
根据字面理解 not exists 就是不存在,exists 就是存在
LongRui888 2013-11-25
  • 打赏
  • 举报
回复
一般情况下,你完全可以把查询理解为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循环。
--小F-- 2013-11-25
  • 打赏
  • 举报
回复
EXISTS表示存在 NOT EXISTS就表示不存在了 select * from ktab where not exists (select * from kstab where khh=ktab.khh) 表示ktab表中的不存在于kstab 表的记录 下面的同理
發糞塗牆 2013-11-25
  • 打赏
  • 举报
回复
先查询最里层的数据,然后和第二层匹配,得到的结果集再和最外层匹配,最后显示数据

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧