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 你可能需要了解的三点】