欢迎参考 SQL反模式(前言)的数据库设计

此文章只是给自己做一个小抄,如有冒犯,还忘见谅


1. 对未知的恐惧

目标: 辨别悬空值

mysql dns反向解析报错 mysql反模式_mysql dns反向解析报错


反模式: 将 NULL 作为普通的值,反之亦然

Mysql的空值与NULL的区别


解决方案: 将 NULL 视为特俗值

1. 在标量表达式中使用 NULL

mysql dns反向解析报错 mysql反模式_sql_02

2. 在布尔表达式中使用 NULL

mysql dns反向解析报错 mysql反模式_默认值_03

3. 检索 NULL 值

mysql dns反向解析报错 mysql反模式_sql_04

4. 声明 NOT NULL 的列

mysql dns反向解析报错 mysql反模式_mysql dns反向解析报错_05


mysql dns反向解析报错 mysql反模式_子查询_06

5. 动态默认值

mysql dns反向解析报错 mysql反模式_sql_07

2. 模棱两可的分组

背景

mysql dns反向解析报错 mysql反模式_默认值_08


目标: 获取每组的最大值


反模式: 引用非分组列

1. 单值规则

mysql dns反向解析报错 mysql反模式_子查询_09


mysql dns反向解析报错 mysql反模式_解决方案_10

2. 我想要的查询

mysql dns反向解析报错 mysql反模式_mysql dns反向解析报错_11


识别反模式

mysql dns反向解析报错 mysql反模式_mysql dns反向解析报错_12


解决方案: 无歧义的使用列

1. 只查询功能依赖的列

mysql dns反向解析报错 mysql反模式_默认值_13

2. 使用关联子查询

mysql dns反向解析报错 mysql反模式_解决方案_14

3. 使用衍生表

mysql dns反向解析报错 mysql反模式_解决方案_15


mysql dns反向解析报错 mysql反模式_默认值_16


mysql dns反向解析报错 mysql反模式_mysql dns反向解析报错_17

4. 使用 JOIN

mysql dns反向解析报错 mysql反模式_子查询_18


mysql dns反向解析报错 mysql反模式_sql_19

5. 对额外的列使用聚合函数

mysql dns反向解析报错 mysql反模式_解决方案_20

6. 连接同组所有值

mysql dns反向解析报错 mysql反模式_解决方案_21


mysql dns反向解析报错 mysql反模式_解决方案_22

3. 随机选择

背景

mysql dns反向解析报错 mysql反模式_子查询_23


目标: 获取样本记录

mysql dns反向解析报错 mysql反模式_子查询_24


mysql dns反向解析报错 mysql反模式_子查询_25


反模式: 随机排序

mysql dns反向解析报错 mysql反模式_sql_26


mysql dns反向解析报错 mysql反模式_解决方案_27


识别反模式

mysql dns反向解析报错 mysql反模式_sql_28


解决方案: 没有具体的顺序

1. 从 1 到最大值之间随机选择
这是一种避免所有数据进行排序的方法,就是在 1 到最大值之间随机选择一个。

mysql dns反向解析报错 mysql反模式_sql_29

2. 选择下一个最大值

mysql dns反向解析报错 mysql反模式_sql_30

3. 获取所有的键值,随机选择一个

mysql dns反向解析报错 mysql反模式_sql_31


mysql dns反向解析报错 mysql反模式_mysql dns反向解析报错_32

4. 使用偏移量选择随机行

mysql dns反向解析报错 mysql反模式_sql_33

5. 专有解决方案

mysql dns反向解析报错 mysql反模式_mysql dns反向解析报错_34