第1章 数据模型设计 1
第1条:确保所有表都有主键 1
第2条:避免存储冗余数据 4
第3条:消除重复数据组 7
第4条:每列只存储一个属性 9
第5条:理解为什么存储计算列通常有害无益 13
第6条:定义外键以确保引用完整性 16
第7条:确保表间关系的合理性 19
第8条:当第三范式不够时,采用更多范式 22
第9条:非规范化数据仓库 27
第2章 可编程性与索引设计 30
第10条:创建索引时空值的影响 30
第11条:创建索引时谨慎考虑以最小化索引和数据扫描 35
第12条:索引不只是过滤 37
第13条:不要过度使用触发器 41
第14条:使用过滤索引包含或排除数据子集 45
第15条:使用声明式约束替代编码校验 47
第16条:了解数据库使用的SQL方言并编写相应的代码 48
第17条:了解何时在索引中使用计算结果 51
第3章 当你不能改变设计时 55
第18条:使用视图来简化不能更改的内容 55
第19条:使用ETL将非关系数据转换为有用的信息 60
第20条:创建汇总表并维护 64
第21条:使用UNION语句将非规范化数据列转行 66
第4章 过滤与查找数据 72
第22条:了解关系代数及其如何在SQL中实现 72
第23条:查找不匹配或缺失的记录 78
第24条:了解何时使用CASE解决问题 79
第25条:了解解决多条件查询的技术 83
第26条:如需完美匹配,先对数据进行除操作 88
第27条:如何按时间范围正确地过滤日期和时间的列 91
第28条:书写可参数化搜索的查询以确保引擎使用索引 94
第29条:正确地定义“左”连接的“右”侧 97
第5章 聚合 100
第30条:理解GROUP BY的工作原理 100
第31条:简化GROUP BY子句 106
第32条:利用GROUP BY或HAVING解决复杂的问题 109
第33条:避免使用GROUP BY来查找最大值或最小值 113
第34条:使用OUTER JOIN时避免获取错误的COUNTO 117
第35条:测试HAVING COUNT(x)<某数时包含零值记录 121
第36条:使用DISTINCT获取不重复的计数 123
第37条:知道如何使用窗口函数 126
第38条:创建行号与排名 129
第39条:创建可移动聚合函数 131
第6章 子查询 136
第40条:了解在何处使用子查询 136
第41条:了解关联和非关联子查询的差异 140
第42条:尽可能使用公共表表达式而不是子查询 145
第43条:使用连接而非子查询创建更高效的查询 151
第7章 获取与分析元数据 154
第44条:了解如何使用系统的查询分析器 154
第45条:学习获取数据库的元数据 164
第46条:理解执行计划的工作原理 168
第8章 笛卡儿积 175
第47条:生成两张表所有行的组合并标示一张表中间接关联另一张表的列 175
第48条:理解如何以等分量排名 177
第49条:知道如何对表中的行配对 181
第50条:理解如何列出类别与前三偏好 185
第9章 计数表 189
第51条:根据计数表内定义的参数生成空行 189
第52条:使用计数表和窗口函数生成序列 193
第53条:根据计数表内定义的范围生成行 196
第54条:根据计数表定义的值范围转换某个表中的值 199
第55条:使用日期表简化日期计算 205
第56条:创建在某个范围内所有日期的日程表 209
第57条:使用计数表行转列 212
第10章 层次数据建模 217
第58条:从邻接列表模型开始 218
第59条:对不常更新的数据使用嵌套集以提升查询性能 220
第60条:使用存储路径简化设置与搜索 222
第61条:使用祖先遍历闭包做复杂搜索 224
附录 日期与时间类型、运算符和函数 228