SQL等于运算符隐式转换?

时间:2018-04-13 18:01:21

标签: sql

select count(ID)
from student
where dept_name = (select dept_name
                   from instructor
                   where ID = '14364'
                  );

我知道select运算符返回一个关系。但是,dept_name应该等于值(varchar)。 那么,为什么这个查询有效呢? 隐式转换意味着与值的关系(上下文中的varchar)

1 个答案:

答案 0 :(得分:2)

这是一个关于SQL机制的好问题。

您正在使用单个值的上下文中使用子查询。这样的子查询称为标量子查询。标量子查询返回一个值,如果在期望标量的表达式中使用它,则SQL会将此值视为单个变量。 FROM子句中的相同查询将返回关系。

这样的子查询通常有两个属性:

  • 正好返回1列(虽然这在某些数据库中是放宽的)
  • 返回0或1行

如果子查询返回多行,则会出现错误。如果它返回零行,则值为NULL

每当您在查询中引用多个表时,我强烈建议您始终使用表别名和限定列名:

select count(s.ID)
from student s
where s.dept_name = (select i.dept_name
                     from instructor i
                     where i.ID = 14364
                    );

此外,如果ID是数字,则不要使用单引号。