带你了解MySQL数据库小技巧( 四 )


16、DISTINCT可以应用于所有的列吗?查询结果中 , 如果需要对列进行降序排序 , 可以使用DESC , 这个关键字只能对其前面的列 进行降序排列 。 例如 , 要对多列都进行降序排序 , 必须要在每一列的列名后面加DESC关键字 。而DISTINCT不同 , DISTINCT不能部分使用 。 换句话说 , DISTINCT关键字应用于所有列而不 仅是它后面的第一个指定列 。 例如 , 查询3个字段s_id , f_name , f_price , 如果不同记录的这3个字段的组合值都不同 , 则所有记录都会被查询出来 。
17、ORDER BY可以和LIMIT混合使用吗?在使用ORDER BY子句时 , 应保证其位于FROM子句之后 , 如果使用LIMIT , 则必须位 于ORDER BY之后 , 如果子句顺序不正确 , MySQL将产生错误消息 。
18、什么时候使用引号?在查询的时候 , 会看到在WHERE子句中使用条件 , 有的值加上了单引号 , 而有的值未加 。单引号用来限定字符串 , 如果将值与字符串类型列进行比较 , 则需要限定引号;而用来与数值进 行比较则不需要用引号 。
19、在WHERE子句中必须使用圆括号吗?任何时候使用具有AND和OR操作符的WHERE子句 , 都应该使用圆括号明确操作顺序 。如果条件较多 , 即使能确定计算次序 , 默认的计算次序也可能会使SQL语句不易理解 , 因此使 用括号明确操作符的次序 , 是一个好的习惯 。
20、更新或者删除表时必须指定WHERE子句吗?在前面章节中可以看到 , 所有的UPDATE和DELETE语句全都在WHERE子句中指定了条 件 。 如果省略WHERE子句 , 则UPDATE或DELETE将被应用到表中所有的行 。 因此 , 除非 确实打算更新或者删除所有记录 , 否则要注意使用不带WHERE子句的UPDATE或DELETE 语句 。 建议在对表进行更新和删除操作之前 , 使用SELECT语句确认需要删除的记录 , 以免造 成无法挽回的结果 。
21、索引对数据库性能如此重要 , 应该如何使用它?为数据库选择正确的索引是一项复杂的任务 。 如果索引列较少 , 则需要的磁盘空间和维护开销 都较少 。 如果在一个大表上创建了多种组合索引 , 索引文件也会膨胀很快 。 而另一方面 , 索引较多 可覆盖更多的查询 。 可能需要试验若干不同的设计 , 才能找到最有效的索引 。 可以添加、修改和删 除索引而不影响数据库架构或应用程序设计 。 因此 , 应尝试多个不同的索引从而建立最优的索引 。
22、尽量使用短索引 。 对字符串类型的字段进行索引 , 如果可能应该指定一个前缀长度 。 例如 , 如果有一个 CHAR(255)的列 , 如果在前10个或30个字符内 , 多数值是惟一的 , 则不需要对整个列进行索引 。短索引不仅可以提高查询速度而且可以节省磁盘空间、减少I/O操作 。
23、MySQL存储过程和函数有什么区别?在本质上它们都是存储程序 。 函数只能通过return语句返回单个值或者表对象;而存储过程 不允许执行return , 但是可以通过out参数返回多个值 。 函数限制比较多 , 不能用临时表 , 只能用表变量 , 还有一些函数都不可用等等;而存储过程的限制相对就比较少 。 函数可以嵌入在SQL语句中使用 , 可以在SELECT语句中作为查询语句的一个部分调用;而存储过程一般是作为一个独立的部分来执行 。
24、存储过程中的代码可以改变吗?目前 , MySQL还不提供对已存在的存储过程代码的修改 , 如果必须要修改存储过程 , 必须使用DROP语句删除之后 , 再重新编写代码 , 或者创建一个新的存储过程 。
25、存储过程中可以调用其他存储过程吗?存储过程包含用户定义的SQL语句集合 , 可以使用CALL语句调用存储过程 , 当然在存储 过程中也可以使用CALL语句调用其他存储过程 , 但是不能使用DROP语句删除其他存储过程 。
26、存储过程的参数不要与数据表中的字段名相同 。 在定义存储过程参数列表时 , 应注意把参数名与数据库表中的字段名区别开来 , 否则将出 现无法预期的结果 。