join概述和7种join模式应用

join概述:

A JOIN B ON 连接条件;表示A和B通过某一连接条件进行相连

如果此处没有  ON 连接条件 ,系统也不会报错,而是直接用笛卡尔积的方式进行连接,可能会和自己本身连接表的想法不同。

 

 

将以上的集合分为三个区域:

1.AB交集区域:此处表示A和B的连接属性都不为NULL的元组部分。直接用join连接两表即是得到该区域。

2.A的独立区域:A不为NULL,B为NULL的部分。先左连接,即可得到1,2两个区域,然后再用where b.primarykey is null;即可去掉A,B交集的区域

3.B的独立区域:B不为NULL,A为NULL的部分。先右链接,即可得到1,3两个区域,然后再用where a.primarykey is null;即可去掉A,B交集的区域

 

区域的链接:

1.union为去重型连接,即连接时会将重复的区域清除,此方法因为要检测重复区域,所以效率会低一些。

2.union all非去除型连接,即连接不去重,重复部分计算多次,因直接连接,所以效率会高一些。

 

Mysql不支持full join 满连接,所以要用union来实现该功能。

 

实例:

复制代码
 1 #设A为表t_emp(人员表),B为表t_dept(门派表)
 2 
 3 #1.所有有门派的人员信息
 4 #A、B两表共有
 5 select te.* ,td.*
 6 from t_emp te join t_dept td
 7 on te.deptId = td.id;
 8 #2.列出所有用户,并显示其机构信息
 9 #A的全集
10 select te.*
11 from t_emp te left join t_dept td  
12 on td.id = te.deptId ;
13 #3.列出所有门派
14 #B的全集
15 select td.*
16 from t_emp te right join t_dept td 
17 on td.id = te.deptId ;
18 #4.所有不入门派的人员
19 #A的独有
20 select te.*
21 from t_emp te left join t_dept td 
22 on td.id = te.deptId 
23 where td.id is null;
24 #5.所有没人入的门派
25 #B的独有
26 select td.*
27 from t_emp te right join t_dept td 
28 on td.id = te.deptId 
29 where te.id is null;
30 #6.列出所有人员和机构的对照关系
31 #AB全有
32 select *
33 from t_emp te left join t_dept td 
34 on td.id = te.deptId 
35 where td.id is null  #A的独有
36 union all 
37 select * 
38 from t_emp te right join t_dept td 
39 on td.id = te.deptId; #B的独有加公有
40 #7.列出所有没入派的人员和没人入的门派
41 #A的独有 + B的独有
42 select *
43 from t_emp te left join t_dept td 
44 on td.id = te.deptId 
45 where td.id is null
46 union all 
47 select *
48 from t_emp te right join t_dept td 
49 on td.id = te.deptId 
50 where te.deptId is null;
复制代码

 

SQL99加入了新特性:

1.NATURAL JOIN(自然连接)

实例:

1 SELECT e.employee_id,d.department_name
2 FROM employees e NATURAL JOIN departments d;

NATURAL JOIN会自动去构建两个表的连接条件(找出所有的公共属性做为连接的连接条件)

 

2.USING:

实例:

1 SELECT e.employee_id,d.department_name
2 FROM employees e JOIN departments d
3 USING (department_id);

要保证两个属性的表的连接条件同名,此处实例的含义就是用department_id进行连接

 

posted @   jue1e0  阅读(454)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示