这是我的面试问题
在Area表中有两列名为Length和Breadth
Length Breadth Length*Breadth
20 NULL ?
30 ?
21.2 1 ?
我尝试在插入时在MYSQL上运行相同的问题,为了插入一个空值,我尝试了下面的查询。我在MYSQL中插入空值时是否遗漏了任何内容。
插入test.new_table值(30,);
答案:使用Null,结果为空。 使用float和int乘法结果是float
答案 0 :(得分:3)
根据您的问题,预期结果如下。
SELECT LENGTH,BREADTH,LENGTH*BREADTH AS CALC_AREA FROM AREA;
LENGTH BREADTH CALC_AREA
20
30 0 0
21.2 1 21.2
对于SQL SERVER中的任何(第一个)记录,如果使用NULL进行计算,答案将为NULL。
对于SQL SERVER中的任何(第二个)记录,如果在非空值和空值之间进行乘积计算,则结果将为零,因为空值被视为零。
对于SQL SERVER中的任何(第三个)记录,如果在两个非空数据类型值之间进行计算,则答案将是NON-EMPTY值。
检查SQL小提琴以供参考 - http://sqlfiddle.com/#!3/f250a/1
答案 1 :(得分:0)
除非呼吸是VARCHAR,否则不能发生空白呼吸(第二排)。假设,答案将是:
NULL(因为NULL时间为NULL)
引发错误(因为空字符串不是数字。在Sql Server中,错误是“将数据类型varchar转换为数字时出错。”)
21.20(例如,在Sql Server中,转换为数字类型是自动的,因此SELECT 21.2 * '1'
返回21.20)。
答案 2 :(得分:0)
任何值和NULL的乘积都是NULL。如果你想谷歌它,这称为“空传播”。要在面试中获得积分,您可能要提到NULL不是值;这是一个特殊的标记。
事实上,广度列有一个条目“NULL”,一个条目是空白的(在第二行)是误导性的。在特定行中没有值的数字列表示该行为NULL。所以第二列也应该显示“NULL”。
第三行的答案21.2 * 1取决于“Length * Breadth”列的数据类型。如果它是一个数据类型,如float,double或numberic(16,2),答案是21.2。如果它是整数列(整数,长整数等),答案是21。
更讽刺的答案可能是“没有答案。字符串”Length * Breadth“不是合法的SQL列名。”
答案 3 :(得分:0)
假设Length和Breadth是某种类型的数字类型,则第二条记录不包含可能的值 - Breadth必须为0或NULL。
在任何情况下,SQL中涉及NULL值的任何数学运算都将返回值NULL,表示无法计算表达式。答案是NULL,不可能,21.2。
答案 4 :(得分:0)
在标准SQL中,它们都会产生错误,因为您正在比较不同类型的值(或空值):
CAST ( 20 AS FLOAT ) * CAST ( NULL AS INTEGER ) -- mismatched types error
CAST ( '' AS INTEGER ) -- type conversion error
CAST ( AS INTEGER ) -- type conversion error
CAST ( 21.2 AS FLOAT ) * CAST ( 2 AS INTEGER ) -- mismatched types error
另一方面,大多数SQL产品在根据类型优先级比较不同类型的值(或空值)时会隐式地转换值。将float值与整数值进行比较实际上会将整数转换为float并导致float。在产品层面,最有趣的问题是当你将integer类型的null与float类型的值(甚至是null)进行比较时会发生什么...
......但是,坦率地说,并不是非常有趣。在一次采访中,您将看到一个框架(以您提出的问题的形式),向您展示您的知识,技能和经验。这里的'答案'是讨论空值(例如,指出空值很难以不直观的方式定义和表现,导致频繁的错误和完全避免空值的愿望等)以及隐式转换是否是一件好事。 / p>