Erw*_*ter 12 sql syntax exists
这是一个可读性问题.性能没有区别.
旧版本的SQL Server足以查找元数据,但不再是.
SELECT foo FROM bar WHERE EXISTS (SELECT * FROM baz WHERE baz.id = bar.id);
SELECT foo FROM bar WHERE EXISTS (SELECT 1 FROM baz WHERE baz.id = bar.id);
Run Code Online (Sandbox Code Playgroud)
我不是在考虑对我来说似乎不直观的NULL或"有趣变体".
SELECT foo FROM bar WHERE EXISTS (SELECT NULL FROM baz WHERE baz.id = bar.id);
SELECT foo FROM bar WHERE EXISTS (SELECT 1/0 FROM baz WHERE baz.id = bar.id);
刚刚在评论中提出了这个问题.我研究了最流行的RDBMS的手册:
SELECT * 在手册中受到青睐.SELECT 1.SELECT *的语言参考.SELECT *在参考手册中也SELECT 1有注释.搜索SO以code:"EXISTS (SELECT 1"获得5,048个结果.
搜索SO以code:"EXISTS (SELECT *"获得5,154个结果.
更新的链接和计数07.2015.
因此,SELECT *有民众投票,并在其一侧的大型商业RDBMS.
我觉得SELECT 1更直观.这就像说"如果至少存在一个".
为SELECT *更直观?
直觉是...EXISTS (SELECT * ..因为你真的不在乎
...EXISTS (SELECT 1 ..延续EXISTS的一般神话和迷信(例如对MySQL文档的评论).我仍然使用EXISTS (SELECT * ...),因为历史(gbn:应该是歇斯底里?)的原因.从技术上讲,当然没有区别; 优化器/计划器会将其丢弃并将其减少为一位信息.对于人类读者而言*,它看起来更加特别,它将作为一种特殊的符号而不是价值或常数.此外,我倾向于减少程序中的文字和魔术常量(最终只剩下0和1).
在EXISTS的上下文中,SQL 优化器知道只要返回某些内容,返回什么并不重要。所以对你来说这并不重要。
对于直观的部分:我认为*这是不对的。
最好用语言来问:“检查是否存在哪怕是最微小的部分”——意思1(或其他东西)。