MYSQL中’ON‘和’WHERE‘的使用

环境

数据库:MYSQL V5.7 for Linux on x86_64

使用

1、

SELECT Ta.*, Tb.* FROM Ta 
  LEFT JOIN Tb ON Ta.FPrimaryKey = Tb.FPrimaryKey;

该查询语句会先在`Tb`表中根据关键字’ON‘条件,来查询相关条目(如果没有找到匹配条目,将会根据查询字段填充NULL数据)。然后把在`Tb`表中查出的结果与`Ta`整张表作笛卡尔积作为最终查询结果。

2、如果在上述SQL语句后面接'WHERE'条件——

WHERE Ta.FPrimaryKey = 'x';

那么在上述1步骤查询结果基础上,根据WHERE条件筛选出相应条目;

3、如果从三张表里查询主键相同的条目,最后与第四表左联立,

CREATE TEMPORARY TABLE tmp AS (
  SELECT Ta.FteKey, Tb.FKey, Tc.* FROM Ta, Tb, Tc
    WHERE Ta.FPrimaryKey = Tb.FPrimaryKey AND Tb.FPrimaryKey = Tc.FPrimaryKey;
);
SELECT * FROM tmp 
  LEFT JOIN Td ON tmp.FPrimaryKey = Td.FPrimaryKey;

临时表会在当前MYSQL连接关闭后释放掉,之后将不占用数据库空间。

4、上述3中,`Td`表中可能没有匹配’ON‘条件的条目,将会向查询结果的相应字段填充NULL,结果大致如下图所示:

 

                          图一

  此时如果通过PHP获取查询结果的`FPrimaryKey`字段,将取`Td`部分`FPrimaryKey`的值。

  为解决这个问题,可以在上述3基础上,使用改字段名的方法,

SELECT *, tmp.FPrimaryKey AS FTmpPrimaryKey FROM tmp 
  LEFT JOIN Td ON tmp.FTmpPrimaryKey = Td.FPrimaryKey;

  PHP取`FTmpPrimaryKey`这个字段名就好。

 

另外如果仅考虑以下SQL语句:

SELECT Ta.FKey, Tb.FKey, Tc.*, Td.* FROM Ta, Tb, Tc
  LEFT JOIN Td ON Tc.FKey = Td.FKey;

经测试,`ON`条件里只能使用`Tc`表,而不能使用Ta、Tb表,这应该跟`FROM`关键词后表的顺序有关。

参考:

1. https://www.cnblogs.com/zjfjava/p/6041445.html     ——  关于 MySQL LEFT JOIN 你可能需要了解的三点

posted @ 2019-06-04 13:46  一吃  阅读(3474)  评论(0编辑  收藏  举报