🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 联结 UNION:求两张表的并集 UNION ALL:UNION求并集不会保留重复行,使用UNION ALL可以保留 INTERSECT:求两表交集(MySQL没有这个关键字) EXCEPT:差集(MySQL没有这个关键字) ### 自连接 例1 如下表格 https://sindwerra.gitbooks.io/django/content/assets/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-02-08%20%E4%B8%8A%E5%8D%8811.48.58.png![](https://sindwerra.gitbooks.io/django/content/assets/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-02-08%20%E4%B8%8A%E5%8D%8811.48.58.png) <br> 现在希望按照价格的顺序倒叙排列,同时显示排列的排名表,一种是顺序排名,一种是跳过排名 实现方式上有两种,一种利用窗口函数 ~~~ SELECT name, price, RANK() OVER (ORDER BY price DESC) AS rank_1, DENSE_RANK() OVER (ORDER BY price DESC) AS rank_2 FROM Products; ~~~ <br> 但是MySQL不支持窗口函数,所以这里有一种更通用的方法,即通过自连接来进行排序 ~~~ SELECT P1.name, P1.price, (SELECT COUNT(P2.price) FROM Products P2 WHERE P2.price > P1.price) + 1 AS rank_1 FROM Products P1 ORDER BY rank_1; ~~~ <br> 上面这种实现比较难理解,必须要画图交叉图才能想明白,不过上面两种的最终效果都是下面这样 ~~~ name price rank ----- ------ ------ 橘子 100 1 西瓜 80 2 苹果 50 3 葡萄 50 3 香蕉 50 3 柠檬 30 6 ~~~ 连接对我个人来说是一个很难理清楚的概念,尤其是使用了ON介词之后一直不理解代表的是什么意思,现在要我个人来解释,也就是最简单的乘法这种情况去解释,ON介词中的条件满足的情况下去进行乘法,而这个乘法是行对行的乘法,当两张表进行连接时,需要合并的列只有ON介词中出现了限定条件的列,如果没有ON介词,实际上进行的操作就是全外连接了,比如一个有5行的表和一个有4行的表进行全外连接,我们得到的数据行就是20行的一个临时表. ## UNION UNION的作用个人感觉基本上就是在将两个临时视图的行摞在一起,即使他们的列名不一样