# 数据库补充
**TIP1:所有包含NULL的计算结果都是NULL**
**TIP2:count函数不会计算指定列值为NULL的行**
**TIP3:聚合函数都会将NULL排除在外**
**TIP4:GROUP BY子句不能使用别名**
**TIP5:HAVING子句必须在GROUP BY之后**
子句书写顺序:
~~~
SELECT->FROM->WHERE->GROUP BY->HAVING->ORDER BY
~~~
<br>
子句执行顺序:
~~~
FROM->WHERE->GROUP BY->聚合函数->HAVING->SELECT->ORDER BY
~~~
<br>
一个不太容易理解的规则:
~~~
WHERE子句 = 指定行所对应的条件
HAVING子句 = 指定组所对应的条件
~~~
<br>
**TIP6:WHERE和HAVING中都可以写的条件写在WHERE里更好,这是为运行速度考虑**
三类删除的不同
1. DELETE FROM <table_name> 是删除表中的所有数据但不删除表,且因为它可以加上限定谓词WHERE,所以运行速度较TRUNCATE慢
2. TRUNCATE <table_name> 是删除表中所有数据但不删除表,且因为无法加限定条件,所以它执行删除的速度要比DELETE快
3. DROP <table_name> 是直接连带表一起删除了,和上面两个命令有显著不同
<br>
**TIP7:LIKE谓词中下划线代表任意一个字符**
CASE的使用
CASE表达式分为简单CASE和搜索CASE两种,实际上就是switch case和if else语法的区别,如下
搜索CASE
<br>
~~~
SELECT product_name,
CASE
WHEN product_type='衣服'
THEN CONCAT('A: ', product_type)
WHEN product_type='办公用品'
THEN CONCAT('B: ', product_type)
WHEN product_type='厨房用品'
THEN CONCAT('C: ', product_type)
ELSE NULL
END AS abc_product_type
FROM Product;
~~~
<br>
简单CASE
~~~
SELECT product_name,
CASE product_type
WHEN '衣服'
THEN CONCAT('A: ', product_type)
WHEN '办公用品'
THEN CONCAT('B: ', product_type)
WHEN '厨房用品'
THEN CONCAT('C: ', product_type)
ELSE NULL
END AS abc_product_type
FROM Product;
~~~
<br>
**TIP8:PARTITION BY和GROUP BY的区别是GROUP BY会对指定列进行聚合,而PARTITION BY只是单纯的划分分组而已**
SQL的三值逻辑,小写的unknown为第三个值,同时SQL的三值逻辑优先顺序为
<br>
~~~
AND: false > unknown > true
OR: true > unknown > false
~~~
<br>
运算靠优先级高的值决定结果
**TIP9:因为SQL奇葩的三值逻辑,常理上等同的两个谓词IN和EXISTS在NOT IN和NOT EXISTS时却不一样了,NOT IN 在有NULL值时会计算出奇怪的结果,NOT EXISTS不会**
- 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的一些小细节