1. 各种join用法
    例表:

    1.1 inner join(内连接)
    当用两张表进行查询时,只保留两张表中完全匹配的记录。
    例:
SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
INNER JOIN Orders o
ON p.Id_P=o.Id_P 
ORDER BY p.LastName

结果:

mysql inner join性能 mysql inner join用法_数据库


笛卡尔乘积:select * from a,b 若a表有5条数据,b表有3条数据,则笛卡尔乘积有15条数据

mysql inner join性能 mysql inner join用法_mysql inner join性能_02


但是如果对两个表进行关联:select * from a,b where a.id = b.id 意思就变了,此时就等价于:

select * from a inner join b on a.id = b.id。即就是内连接。

但是这种写法并不符合规范,可能只对某些数据库管用,如sqlserver。推荐最好不要这样写。最好写成inner join的写法。

1.2 left join(左连接)

用两张表查询时,会返回左表所有的行,即使在右表没有匹配的记录。

例:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
LEFT JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

结果:

mysql inner join性能 mysql inner join用法_mysql_03


左表(Person表)中Id_P为2的记录在右表中没有,但它还是会被查询出来。

1.3 right join(右连接)
两张表查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
例:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
RIGHT JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

结果:

mysql inner join性能 mysql inner join用法_数据库_04


右表中Id_P为65的记录在左表中没有,但是它还是会被查询出来。

1.4 Full join(全连接)

Mysql不支持全连接

查询两表时,会返回左表和右表中没有匹配的行(也就是所有记录都会返回)

例:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
FULL JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

结果:

mysql inner join性能 mysql inner join用法_oracle_05


结果也就是left join 和right join的并集

  1. 使用连接时条件加在on和where后面的区别
    例表:
    address表:

    test_on_position表:

    2.1 Left join
    条件在where后面:
SELECT
    *
FROM
    test_on_position
LEFT JOIN address ON test_on_position.address = address.id
WHERE
    test_on_position.address IS NOT NULL

结果:

mysql inner join性能 mysql inner join用法_mysql inner join性能_06


条件在on后面:;

SELECT
    *
FROM
    test_on_position
LEFT JOIN address ON test_on_position.address = address.id AND test_on_position.address IS NOT NULL

结果:

mysql inner join性能 mysql inner join用法_oracle_07


分析:条件在on后面使用left join时,即使不符合on后面加的条件也会返回左表中的记录;条件在where后面时,只有满足条件的记录才会被返回。右连接同理。

2.2 inner join

条件在on后面:

SELECT
    *
FROM
    test_on_position
INNER JOIN address ON test_on_position.address = address.id AND test_on_position.address IS NOT NULL

结果:

mysql inner join性能 mysql inner join用法_mysql_08


条件在where后面:

SELECT
    *
FROM
    test_on_position
INNER JOIN address ON test_on_position.address = address.id
WHERE
    test_on_position.address IS NOT NULL

结果:

mysql inner join性能 mysql inner join用法_mysql_09


分析:使用内连接时,不管条件加在on后面还是where后面都会返回满足条件的结果。

总结:不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。