sql中的连接查询有inner join(内连接)、left join(左连接)、right join(右连接)、full join(全连接)四种方式。
一、inner join(内连接)
在两张表进行连接查询的时候,会保留两张表完全匹配ON后查询条件的结果集。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
查询结果集:
此种连接方式Orders表中Id_P字段在Persons表中找不到匹配的,则不会列出来。
二、left join(左连接)
在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。没有匹配的记录用Null表示。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
查询结果如下:
可以看到,左表(Persons表)中LastName为Bush的行的Id_P字段在右表(Orders表)中没有匹配,但查询结果仍然保留该行。
三、right join(右连接)
在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
四、full join(全连接)
在两张表进行连接查询时,返回左表和右表中所有没有匹配的行。即返回所有的数据。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
查询结果如下:
查询结果是left join和right join的并集。
图片示例
sql 连接之后 可以在 on后面跟多个筛选查询条件,有利于提高查询需要的数据,比在where后面更加提高查询速度,需要注意的是on后查询条件如果A左连接B,ON后跟着B表的查询条件如果B表没有数据将返回null,如果是where后跟着查询条件,如果没有数据则不会返回数据。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P AND OrderNo = '123'
ORDER BY Persons.LastName
查询结果如下:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
WHERE OrderNo = '123'
ORDER BY Persons.LastName
查询结果为空!