## 联结
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的作用个人感觉基本上就是在将两个临时视图的行摞在一起,即使他们的列名不一样
- Django基础
- 模型
- 外键
- Model Manager
- 过滤器函数
- 查询对象
- 字段的细节
- QuerySet的应用
- 视图
- Django类视图
- 权限控制
- Django进阶
- 中间件
- _meta组件
- 信号
- User模块
- prefetch_related和select_related的区别
- 较少被用到的查询对象
- Django的深层设计理念
- Declarative Syntax
- django的migration操作
- 较少用到的Queryset方法的一些坑
- Django配置
- Django环境配置变量
- Django源码阅读
- ORM
- QuerySet源码
- Query源码
- Q&F
- Model和Manager的详解
- Http请求响应
- HttpRequest
- 自建数据结构
- Django开发辅助工具
- Django-rest-framework
- Serializer
- 异步任务调度器Celery
- 数据库补充
- 定义
- 字段
- 事务
- 视图
- 函数
- 联结
- 窗口函数
- GROUPING运算符
- HAVING谓词
- django_bulk_update
- django_bulk_update源码分析
- 项目小功能开发
- Django的一些小细节