博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
表连接类型
阅读量:6448 次
发布时间:2019-06-23

本文共 2748 字,大约阅读时间需要 9 分钟。

前言

对于关系型数据库来说,对于复杂的查询表连接是必不可少的,下面妹子就来介绍下表连接的方式

内连接(Inner Join)

Inner指的是 intersect相交,顾名思义就是取两表的交集

SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63条*/SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10条*//*inner-join*/SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a INNER JOIN `b_borrow_deductions` AS b ON a.per_id=b.per_id;/*51条*/复制代码

表a有63条数据,表b有10条数据,两表都有键值per_id,用INNER JOIN取交集为51条

外连接(Outer Join)

Outer指的是 union集合,就是取两表的并集。 其中外连接分为3种:

Full outer join

full outer join 得到两表的乘集,也可叫做笛卡尔乘积。如果a表中的行在b表中没有对应的部分,b的部分将是 null, 反之亦然。

SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63条*/SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10条*//*full-outer-join*/SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a JOIN `b_borrow_deductions` AS b /*630条*/复制代码

取两表的乘集,则a表的行数乘以b表的行数,63*10=630(条)

Left join

左连接,取表a的所有行,和b表中匹配的值,没有匹配的则以null值取代。

SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63条*/SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10条*//*left-join*/SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a LEFT JOIN `b_borrow_deductions` AS b ON a.per_id=b.per_id;/*63条*/复制代码

a表有63行,b表中键值per_id在a表中都有。

Right join

右连接,取表b的所有行,和a表中匹配的值,没有匹配的则以null值取代。

SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63条*/SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10条*//*right-join*/SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a RIGHT JOIN `b_borrow_deductions` AS b ON a.per_id=b.per_id;/*51条*/复制代码

b表有10行,a表中有重复键值per_id,所以有51条

反连接(Anti Join)

Anti指的是 英语词根反对的意思,与inner join正好相反。 多用于!= not in 等查询;如果找到满足条件(!= not in)的不返回,不满足条件(!= not in)的返回。

SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63条*/SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10条*//*anti-join*/SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a ,`b_borrow_deductions` AS b WHERE a.per_id!=b.per_id;/*579条*/复制代码

相当于a表与b表的乘级减去a表与b表的交集,即(63*10)-51=579条

半连接(Semi Join)

半连接多在子查询exists中使用,找到存在的键值之后就不再查找内部其他的键值了。

SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63条*/SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10条*//*semi-join */SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a WHERE EXISTS( SELECT NULL FROM `b_borrow_deductions` AS b  WHERE a.per_id=b.per_id)/*51条*/复制代码

星型连接(Star Join)

是指一张大的事实表和多个小表关联得出所需的数据,往四周发散,所以称为星型链接。 要使用星型转换,必须要求初始化参数star_transforation_enabled设为TRUE。

SELECT ...FROM   really_big_fact f    -- 50 million rows,      dim1 d1              -- 50 rows,      dim2 d2              -- 100 rows,      dim3 d3              -- 10 rows,      dim4 d4              -- 15 rowsWHERE  f.key1 = d1.key1AND    f.key2 = d2.key2AND    f.key3 = d3.key3AND    f.key4 = d4.key4复制代码

现在只有Oracle才有

表链接的方式

表链接的方式有:排序合并连接(Sort Merge join)、嵌套循环连接(Nested Logo join)、哈希连接(Mash join)、笛卡尔链接(Cross join)

参考资料

Happy coding .. :)

转载地址:http://umlwo.baihongyu.com/

你可能感兴趣的文章
SQLServer判断指定列的默认值是否存在,并修改默认值
查看>>
centos7源码编译安装httpd、加入systemctl并设置开机自启动
查看>>
华为路由器下实现浮动路由、备份接口和虚拟模板链路
查看>>
JSP通过隐藏iframe实现异步上传
查看>>
heartbeat+drbd+mysql:实现最廉价的高可用组合
查看>>
Python的安装、pycharm的安装及设置
查看>>
vmware的vmnet-概念的解说
查看>>
解决NGINX+PHP-FPM failed to ptrace(PEEKDATA) Input/output error出错问题
查看>>
splice和sendfile
查看>>
金额的正则表达式校验
查看>>
centos7 maiadb主从复制搭建
查看>>
PhpMyadmin利用Mysql root密码获取webshell
查看>>
MySQL ibdata1占用空间大 释放MySQL ibdata1文件的空间
查看>>
Nginx安装、默认虚拟主机、Nginx用户认证、Nginx域名重定向
查看>>
LODOP打印控件之LODOP.NewPageA()方法
查看>>
从小小题目逐步走进 JavaScript 异步调用
查看>>
基于rsync+inotify实现数据实时同步传输
查看>>
【No.11 默认实参的匹配】
查看>>
一键生成表结构说明文档的参考,数据字典生成方式参考
查看>>
CCNP课堂练习一:详解交换机vlan的介绍及通过交换机从逻辑上划分区域配置
查看>>