选择mysql返回0行

选择mysql返回0行,mysql,sql,select,Mysql,Sql,Select,我有一个类似以下的问题: SELECT lp - prev_close_price AS ch, (lp - prev_close_price) / prev_close_price AS chp, short_name, exchange, description, lp, IFNULL(ask, 0) AS ask, IFNULL(bid, 0) AS bid, IFNULL(ask - bid, 0) AS spread, IFNULL(open_

我有一个类似以下的问题:

SELECT 
  lp - prev_close_price AS ch,
  (lp - prev_close_price) / prev_close_price AS chp,
  short_name,
  exchange,
  description,
  lp,
  IFNULL(ask, 0) AS ask,
  IFNULL(bid, 0) AS bid,
  IFNULL(ask - bid, 0) AS spread,
  IFNULL(open_price, prev_close_price) AS open_price,
  IFNULL(high_price, prev_close_price) AS high_price,
  IFNULL(low_price, prev_close_price) AS low_price,
  prev_close_price,
  volume
FROM
  metaTQEjY,
  lpTQEjY,
  askTQEjY,
  bidTQEjY,
  open_todayTQEjY,
  highlowTQEjY,
  prevcloseTQEjY;
它返回0行,而所有表肯定都有值

然后我试了这个

SELECT 
  prevcloseTQEjY.prev_close_price
FROM
  metaTQEjY,
  lpTQEjY,
  askTQEjY,
  bidTQEjY,
  open_todayTQEjY,
  highlowTQEjY,
  prevcloseTQEjY;
还是0行。但是

SELECT 
  prevcloseTQEjY.prev_close_price
FROM
  prevcloseTQEjY;

正确返回上一个收盘价。为什么会这样?

您正在执行这些表的笛卡尔乘积。如果其中一个为空,则得到一个空集。

当您在FROM子句中列出所有表时,它将生成这些表的笛卡尔乘积

如果您选择的是您知道存在的特定数据,那么这很好。但是,如果其中一个表为空,笛卡尔积将返回一个空集

下面是一个SQL版本:

如您所见,共有三个表,我从一个表中选择了一个值,但由于我的from语句包含所有三个表(包括一个空表),因此没有数据可供选择,因此它返回0行

但在本例中:

我选择了相同的列,但我的FROM语句只包含包含数据的表,这将按预期返回行


有很多方法可以修复您的查询,其中一种方法可能是使用左连接,如下面的回答所述:

这个怎么样?从metaTQEjY、lpTQEjY、askTQEjY、bidTQEjY、open_todayTQEjY、highlowTQEjY、prevcloseTQEjY中选择prev CloseTQY.prev_close_price;它也不会产生任何结果,但上一个关闭价格绝对不是空的。如果列表中至少有一个空表,则结果集将是空的(就像将数据集“乘以”0)@AlexanderHo
metaTQEjY、lpTQEjY、askTQEjY、bidTQEjY、open\uTodayTQEJY、highlowTQEjY中的一个表,prevcloseTQEjY
集为空。我们谈论的是空表,而不是空属性值。请参阅: