这到底是什么 SQL 语句

2021-07-12 21:32:24 +08:00
 movq

有点看不懂下面的第一段语句。

SELECT 后面不是接一个 output 吗?为什么可以在里面再写一个 SELECT ?

SELECT (SELECT S.name FROM student AS S
	WHERE S.sid = E.sid) AS sname
   
FROM enrolled as E
WHERE cid='15-455'

第二段语句和第一段语句的效果是一样的,但是第二段就很好理解。把第二个 SELECT 的 output 作为 input 传递给 IN 函数。

SELECT name FROM student

WHERE sid IN ( 
	SELECT sid FROM enrolled
    WHERE cid = '15-445'
)

这里面是原始表格:

5473 次点击
所在节点    程序员
33 条回复
yolee599
2021-07-13 12:37:57 +08:00
这叫子查询,基本操作
huigeer
2021-07-13 12:39:06 +08:00
万物皆可子查询
levon
2021-07-13 15:44:38 +08:00
order by (select ....)
landfill
2021-07-13 16:21:41 +08:00
这是 andy pavlo 的课吗 我今天也刚看到这里
movq
2021-07-13 16:35:52 +08:00
snw
2021-07-13 17:37:36 +08:00
其实吧,SQL 真实的逻辑顺序是:
FROM ... //从某个表中
WHERE ... //筛选出某些行
SELECT ... //返回这些行的某些列的数据

只是为了迎合英文的语法习惯所以规定成了 SELECT ... FROM ... WHERE ...

所以改写一下就比较符合人类阅读了(虽然 SQL 会报错):

FROM enrolled as E
WHERE cid='15-455'
SELECT (
FROM student AS S
WHERE S.sid = E.sid
SELECT S.name
) AS sname
zxCoder
2021-07-13 18:08:01 +08:00
楼上的解释就比较清楚了
zhangysh1995
2021-07-13 18:17:55 +08:00
上面都没回答到点上。。
楼主应该问的是为什么我们在一个子语句使用了外层的 E.sid 。
这里需要知道表是否存在 index 。
在有 index 的情况下,第一条语句首先 cid 过滤,然后再比较 S.did = E.sid 的时候,可以直接使用 index,速度比第二条的 IN 要快非常多。因为有 E.sid 的值可以直接 hash index 看 S.sid 的数据置是否存在,只有 E.sid 数量的比较次数 O(E.sid)。
但是对于 IN 来说,它需要比每一条 S.sid 是否在 IN 后面的结果里面,没有 index 情况下 IN 的复杂度是 O(E.sid * S.sid),有 index 情况下 IN 的复杂度是 O(E.sid) 。
这里说的都是理论的复杂度,实际数据库实现中 IN 不一定可以用 index 。
另外一个区别是,因为第一条用了 scalar function, 在进行 cid 过滤的时候,满足的一行会直接送给子查询去判断 S.sid = E.sid 是否存在(这里是因为行变量的值可以传递到子查询),第二条是做完了过滤才去用 IN 查询,所以速度会变慢。
zhangysh1995
2021-07-13 18:21:16 +08:00
楼主如果要知道更多一些关于 SQL 的理论知识,可以考虑看 https://db.inf.uni-tuebingen.de/team/TorstenGrust.html 这位教授的课程,youtube 有视频。CMU 的课程重点是数据库系统本身和现代系统应用,而不是 SQL 。
Divinook
2021-07-13 18:51:21 +08:00
@zhangysh1995 exists 也使用外层的字段,楼主应该问的就是 select 为什么也可以用子语句
no1xsyzy
2021-07-14 09:51:12 +08:00
@snw 准确地说不是为了迎合英文语法,而是因为它是拟似数学上的集合推导式 comprehension

Y = { x | x ∈ X, x < 10 }
SELECT x FROM X WHERE x < 10

但是显然从数据流式处理角度描述要清晰准确地多,我不知道这语法是否存在歧义的情况,没有的话为什么各 SQL 引擎不进行两种语法同时支持呢?
zbinlin
2021-07-18 19:35:29 +08:00
@no1xsyzy 因为 `∈` 符号不好打 😹
no1xsyzy
2021-07-19 08:30:28 +08:00
@zbinlin 我说的支持两种语法是
SELECT ... FROM ... WHERE ...

FROM ... WHERE ... SELECT ...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/789122

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX