1.inner join
A inner join B where 条件, 对于A表中的每一行都会去B表的所有行去查找,去匹配,符合条件的就将这两行连接起来
下面用一个例子来帮助实际理解这句话:
创建下面两个表,customers表orders表
输入以下sql语句:
select customers.id,customers.name,orders.amount,orders.date
from customers inner join orders
on customers.id=orders.id
此时你就站在customers的角度,对于customers表中的每一行的id(比如说是x),都会去另一张表order表中查询所有行,看有没有哪一行的id等于x,如果有id相等的行,就将customers里这行和order里的这一行连接起来
具体来说:对于customer表中id=2的这一行,遍历order表中每一行,发现有一行(也就是第三行)id也等于2,于是按照sql语句中的描述,将customer表中的id,name两列和order表中的amount和date两列进行拼接,得到:
而对于customer表中id=3的这一行,遍历order表中每一行,发现有两行(也就是第一行,第二行)id也等于3,于是按照sql语句中的描述,将customer表中的id,name两列和order表中的amount和date两列进行拼接,得到:
最终查询结果:
2.left join
A left join B where 条件
和inner join一样,对于A表中的每一行,都会去和B表中的每一行进行比较,符合条件的就将表A中的行和表B的行进行连接
另外,表A中的每一行都会被保存(即使在B表中没有与其匹配的行,表A的这一行也要保存下来)
举个例子:左边是student表学生表,右边是grade表成绩表
执行sql语句:
SELECT student.student_id,student.name,student.age,grade.score,grade.course_name
FROM student LEFT JOIN grade
ON student.student_id=grade.student_id
站在学生表student表的角度,对于这个表中的每一行去成绩表中查找,是否有student.student_id=grade.student_id的行
显然对于student表中的student_id=1这一行,可以在grade表中匹配到两行,得到:
而student表中的student_id=2这一行,在grade表中没有与之匹配的行,但是由于是左连接,所以student表的所有行都需要保存,于是最终结果还要加上一行:
最后的结果是:
力扣183 从不订购的客户
订单表中显示只有1号和3号客户下过订单,所以显然customers表中的2号和4号员工从来不订购
Select Customers.Name as Customers /* 给最后选出来的列起个别名,否则就叫Name*/
From Customers Left Join Orders
on Customers.Id=Orders.CustomerId
将customers客户表和orders订单表进行左连接,对于customers客户表中的每一行都会去orders订单表中进行查找匹配·
所以选出Orders.CustomerId Is Null的行就行了,最后的sql语句:
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也是可以的*/
3.右连接
右连接和左连接刚好相反
左连接是保留左表中所有行
右连接是保留右表中所有行
左连接可以改写成右连接,右连接可以改写成左连接,无非交换一下两个表的顺序即可