left join的情況下,t2表查到了2條數據,和上面的結果是一樣的。t1表根據連接條件會將所有的結果都查出來,因為左連接是以t1表為主的。然后,在where子句過濾之后又只剩下了符合條件的兩條語句了。
綜上所述,關鍵是在where子句。你可以這樣測試一下,使用下面的兩條語句查詢一下:
select * from tdb_goods AS t1 left join ( select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>1 ) AS t2 on t1.goods_name=t2.goods_name;
select * from tdb_goods AS t1 inner join ( select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>1 ) AS t2 on t1.goods_name=t2.goods_name;
2017-01-17
inner join和left join最后刪除的效果是一樣的。但這兩條sql在執行過程中的原理是不一樣的。之所以最后執行的效果相同,是因為where子句把二者查詢的不同數據給過濾掉了。
inner join的情況下,t2表查到了2條數據,這個結果是子查詢 查到的,是固定的。t1表根據連接條件查到了4條數據,在where子句過濾之后就剩下符合條件的兩條語句了。
left join的情況下,t2表查到了2條數據,和上面的結果是一樣的。t1表根據連接條件會將所有的結果都查出來,因為左連接是以t1表為主的。然后,在where子句過濾之后又只剩下了符合條件的兩條語句了。
綜上所述,關鍵是在where子句。你可以這樣測試一下,使用下面的兩條語句查詢一下:
select * from tdb_goods AS t1 left join ( select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>1 ) AS t2 on t1.goods_name=t2.goods_name;
select * from tdb_goods AS t1 inner join ( select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>1 ) AS t2 on t1.goods_name=t2.goods_name;
2017-01-17
因為引用的是自身的表中數據。不牽扯到多表,所以沒有所謂的交集,也就效果相同