LEFT JOIN返回NULL的所有内容

时间:2016-12-06 09:37:43

标签: mysql left-join

我有两张桌子,我通过左连接加入。两个表都是空的。但是当我运行查询时,mysql返回一个包含所有NULLS的行。

我尝试过多次查询,例如

SELECT products.*,SUM(pq_quantity) as quantity
FROM `products` LEFT JOIN `products_quantities` ON `pq_product_idFk` = `p_id` 
WHERE `p_volusion_id` = '37808'

OR

SELECT products.*,SUM(pq_quantity) as quantity
FROM `products` LEFT JOIN `products_quantities` ON `pq_product_idFk` = `p_id` 
WHERE `p_volusion_id` = '37808' AND p_id IS NOT NULL

OR

SELECT products.*,SUM(pq_quantity) as quantity
FROM `products` LEFT JOIN `products_quantities` ON `pq_product_idFk` = `p_id` AND `p_volusion_id` = '37808' AND p_id IS NOT NULL

上述查询似乎没有效果,因为我只想要非空的结果。

由于

1 个答案:

答案 0 :(得分:0)

  

两个表都是空的。但是当我运行查询时,mysql返回一行包含所有NULLS

SELECT子句中GROUP BY aggregate functions的存在也要求GROUP BY子句出现。但是,如果它不存在,则SQL标准指定使用WHERE子句筛选的所有行创建单个组。

由于*子句中使用了SELECT,因此您发布的所有查询都是无效的SQL。

包含GROUP BY子句的查询不会返回表中的行。它使用从表中提取的值创建行。首先,它使用GROUP BY子句中的表达式创建组(和子组)。组中的所有行对于GROUP BY子句中指定的第一个表达式具有相同的值。

如果GROUP BY子句中有两个或更多个表达式,则使用第二个表达式将每个组拆分为子组,然后使用第三个表达式将每个子组进一步拆分为子子组(如果存在)等等。

从每个这样的行组(在最后一次拆分之后),数据库引擎生成一个新行并将其放入结果集中。如果查询在SELECT子句中包含的表达式不是GRUP BY聚合函数的参数,或者也包含在GROUP BY子句中,则很可能这些表达式将包含多个子组中的值。这就是查询无效SQL的原因。直到版本5.7.5,MySQL接受此类无效查询,但保留自己有权从违规表达式返回any value it wants(来自该组)。

回到你的问题,如上所述,即使没有GROUP BY子句,你的查询也会被处理,因为它有一个,而且是由WHERE子句过滤的所有行创建的一个组。

它是一个空组,但这不会阻止数据库引擎从中生成一行。由于没有用于计算SUM(pG_quantity)的值,NULL是它在结果集的列中返回的逻辑值。

NULL是一个特殊值,表示没有任何值或未知值。在你的情况下它是完美的意义。表中没有任何值,人们无法计算SUM(pq_quantity)。它的值不可用(即NULL)。

相关问题