假设我们现在有user和org两张表:
1、user用户表 字段包含:id、name、orgId 其中orgId标示该用户所属的组织
2、org组织表 字段包含:id、name
两表之间的关系很简单,一个组织下会拥有多个用户,一个用户属于某个组织。
在解析之前先普及一下数据库空值(null)的概念:
有很多时候我们都能碰到某表中某字段值为空的情况,空值不等同于字符串中的空格、空串
也不等同于数字类型的0,所以,一般我们用IS NULL 关键字来检索有空值字段的记录。而不是用!=、<>这些判断符。
接下来,我们给示例库表中做上一些测试数据,如下图:
有了这些数据,咱们就可以进入正题啦:
一、左连接、右连接
A Left join(左连接)优先解出左表中所有的记录,包含右表中没有匹配到得记录。
A Right join(右连接)优先解出右表中所有的记录,包含左表中没有匹配到得记录。
左右连接是相互对应的,所以在这里一并解释。
罗嗦一句如何区分左表和右表:
在JOIN的左边出现的表叫左表,在JOIN的右边出现的表叫右表
具体体现在SQL语句上即:(以左连接为例)
左连接语句:SELECT user.name,org.name FROM user
LEFT JOIN org ON user.orgId = org.id
右链接语句:SELECT user.name,org.name FROM user
RIGHT JOIN org ON user.orgId = org.id
显而易见,该SQL中,user为左表、org为右表
下面我们来看看这两个语句分别执行后的效果:
为了更好的看出左右连接的效果,我们再来看看内连接查询出来的效果
内连接:SELECT user.name,org.name FROM user JOIN org ON user.orgId = org.id
内连接语句执行后的效果:
很明显:
内连接与左连接相比,检索结果集中漏掉了user表的user3数据
内连接与右连接相比,检索结果集中漏掉了org表的org4数据