目标:辨别并使用Null值 反模式:将Null值作为普通的值,反之亦然 1.在表达式中使用Null: Null值与空字符串是不一样的,Null值参与任何的加.减.乘.除等其他运算,结果都是Null: Null值与False也不同.And.Or和Not三个bool操作如果设计Null,结果很迷惑. 2.搜索运行为空的列:任何与Null的比较逗返回“未知”,既不是True,也不是False. 在Where表达式中只能使用 Is Null 或者 Is Not Null,其他操作都查询不到结果. 3.不…
目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_Type单独一列中,有时候这样的设计被称作:混合数据与原数据. 查询示例: select * from A as a left join B as b on a.xId=b.Id and a.xType='b' lefe join C as c…
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处于一些必要的因素, 浮点数通常是舍入到了一个非常接近的值. 举例:select rate from A where id=123 --Result:59.95 select * from A where ra…
目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段 反模式:引用非分组列 单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值. select ProductId,Max(DateReported) as Latest from Bugs as b Join BugProducts as bp on b.BugId = bp.BugId Group by ProductId; 在Group By字句中出现的列能够保证他们…
目标:随机排序,使用高效的SQL语句查询获取随机数据样本. 反模式:使用RAND()随机函数 SELECT * FROM Employees AS e ORDER BY RAND() Limit 1 缺点:无法利用索引,每次选择的时候都不同且不可预测.进行全表遍历,性能极差. 如何识别反模式:当出现以下情况时,可能是反模式 1.在SQL中,返回一个随机行速度非常慢: 2.要获取所有的记录然后随机一个.要如何增加程序可使用的内存大小? 3.有些列出现的频率比别的列要高一些,这个随机算法不是很随机.…
一.目标:编写SQL动态查询 SQL常常和程序代码一起使用.我们通常所说的SQL动态查询,是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. string sql = SELECT * FROM Person WHERE Id = $Id 我们期望$Id是一个整型,因此当数据库接收到这个请求时,$Id的值就是查询语句的一部分. SQL动态查询是有效利用数据库很自然的方法.当你使用程序内的变量来指定如何进行查询时,就是将SQL作为连接程序和数据库的桥梁.程序和数据库之间通过这种方式进行“…
//把数据库导出到脚本文件mysqldump -uroot -p1234 --databases abc > d:/a/abc.sql CREATE TABLE stud( id INT PRIMARY KEY, NAME VARCHAR(32) NOT NULL, score NUMERIC(4,1));//把所有名字都设成"Mike"了UPDATE stud SET NAME="Mike" //只设置分数>=70的记录的NameUPDATE stud…