Sql 有人能解释一下为什么在这个查询中使用NULL吗?

Sql 有人能解释一下为什么在这个查询中使用NULL吗?,sql,Sql,另外,使用此查询的场景是什么 select * from TableA where exists (select null from TableB where TableB.Col1=TableA.Col1) 由于查询位于EXISTS中,因此可以返回任何内容。它甚至没有被评估 事实上,您可以用(1/0)替换空值,它甚至不会产生被零除的错误。空值没有意义。这就是糟糕的SQL exists子句应该使用SELECT* 人们编造关于SELECT*成本的故事。他们声称它做了一个“额外的”元数

另外,使用此查询的场景是什么

select * from TableA where exists  
    (select null from TableB where TableB.Col1=TableA.Col1)

由于查询位于EXISTS中,因此可以返回任何内容。它甚至没有被评估


事实上,您可以用(1/0)替换空值,它甚至不会产生被零除的错误。

空值没有意义。这就是糟糕的SQL

exists
子句应该使用
SELECT*


人们编造关于
SELECT*
成本的故事。他们声称它做了一个“额外的”元数据查询。没有。他们声称这是一个“宏扩展”,需要大量额外的解析时间。这是一种选择表a中所有记录的俗气方法,这些记录在表B中有一个匹配的记录(Col1=Col1)。例如,他们可能同样选择了“1”或“*”

实现这一目标的一种更具可读性的方法是

SELECT * FROM TableA WHERE Col1 IN ( SELECT Col1 IN TableB )

如果子查询返回至少一行,则认为EXISTS条件“已满足”

EXISTS条件的语法为:

选择列 从桌子上 存在的位置(子查询)

请注意,“Select Null from mytable”将返回mytable中的行数,但所有行在单元格中只包含一个Null列,因为外部查询的要求只是检查是否有任何行符合给定的条件,就像您的例子中的“TableB.Col1=TableA.Col1”


可以将null更改为1、0或表中可用的任何列名。1/0可能不是个好主意:)

请,请,全部

存在
返回布尔值,即TRUE或FALSE。如果结果集非空,则返回TRUE。子查询的相关性与上述情况一样重要

i、 e给我A中的所有行,其中B中至少存在一个col1


选择列表中的内容并不重要。这只是风格的问题。

发布问题时,您可以在页面右侧查看使代码看起来像代码所需的标记文档。如果您遵循这些标记准则使您的问题易于阅读,这会有所帮助。NULL不是坏sql,它与select*完全相同。它是坏sql,因为它不是
select*
<代码>选择*是这里所期望的。我真的不认为这更有可读性。它使用IN而不是EXISTS,但它仍然隐藏正在进行的连接。我更喜欢这样的方式:从TableA中选择TableA.*在TableA.Col1=TableB上内部连接TableB。Col1@AHM:如果TableB是TableA的子表,则重写会更改结果。+1 1/0,这是最终结果中存在的SELECT(1、0、NULL、字段等)无关紧要的确定点。+1表示该1/0和“如果存在,那么您可以返回任何内容。它甚至没有被评估“罗宾·戴的
1/0
证明了这一点。关键是它不会返回一系列经过计算的
1/0
方程,就像OP的查询不会返回一组空值一样。如果select出现在
exists
之外,那么会选择什么呢。本质上,在这种情况下选择1/0并不比选择null或*更糟糕。是的,你是绝对正确的,没有关于这一点的争论,但我只是告诉提问者不要接受你字面上的建议:)仅此而已