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或*更糟糕。是的,你是绝对正确的,没有关于这一点的争论,但我只是告诉提问者不要接受你字面上的建议:)仅此而已