内连接和外连接都是表的连接方式(将两张表连接起来)
内连接:等值连接,非等值连接,自连接
外连接:左连接,右连接
1.笛卡尔积
表一和表二做笛卡尔积,就是将表一的每一行和表二的每一行进行拼接

所有的这些连接都是先将这两张表做笛卡尔积,然后留下其中某些列,删除其他列
2.内连接
3.外连接(左连接,右连接)
(1)Outer是可以省略的
Left Join=Left Outer Join 即左连接就是左外连接
Right Join=Right Outer Join 即右连接就是右外连接
(2)谁是主表?(进行外连接的两张表是有主次关系的)
主表中即使在另一张表中没有匹配的行,也要返回左表中的行
a Right Join b,Join关键字右边的表b表是主表
a Left Join b,Join关键字左边的表a表是主表
举个例子:下面两张表


Persons表和Orders表进行笛卡尔积得到:
运行Mysql语句:
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
- FROM Persons
- LEFT JOIN Orders
- ON Persons.Id_P=Orders.Id_P
- ORDER BY Persons.LastName
就是在上面的笛卡尔积中,只保存Persons.Id_P=Orders.Id_P的行(也就是红色四行)

最后由于是Persons Left Join Orders,所以Persons表是主表,因此Persons表是主表,主表Person表中有些行在Orders表中匹配不到,但是也要添加到最后的结果里面,最后结果为:

如果是右连接:(也就是主表不再是Persons表了,而是Orders表)
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
- FROM Persons
- RIGHT JOIN Orders
- ON Persons.Id_P=Orders.Id_P
- ORDER BY Persons.LastName
此时要保存的就是主表Orders中没有匹配到的行了(而不是Persons表中没有匹配到的行)

leetcode上例题:
力扣183 从不订购的客户

显然2,4号员工是从不订购的客户
将Customers表和Orders表进行外连接,比如:Customers Left Join Orders 得到:

- Select Customers.Name as Customers /* 给最后选出来的列起个别名,否则就叫Name*/
- From Customers Left Join Orders
- on Customers.Id=Orders.CustomerId
得到的是:
+Customers表中没有匹配到的行,也就是:

所以还要添加一个条件:where Orders.CustomerId Is Null;
- Select Customers.Name as Customers /* 给最后选出来的列起个别名,否则就叫Name*/
- From Customers Left Join Orders
- on Customers.Id=Orders.CustomerId
- where Orders.CustomerId Is Null;/*这里where Orders.Id Is Null也是可以的*/