mysql-语句规范
1、减少与数据库交互的次数
比如多次插入、更新的sql语句,不允许在程序里循环和数据库查询,而是先用程序拼接成一条sql,然后再数据库交互。
错误:
for () {
query("insert into `post_comment` ( `post_id`) values ( '1');");
query("insert into `post_comment` ( `post_id`) values ( '2');");
query("insert into `post_comment` ( `post_id`) values ( '3');");
}
正确:
for(){
//拼接sql
sql = "insert into `post_comment` ( `post_id`) values ( '1'),( '2'),( '3');"
}
query(sql);
2、减少查询结果集
举个例子,查询用户手机号15012345678是否已经注册
错误:
SELECT * FROM `user` WHERE phone=15012345678;
以上有三处错误,1、* 查询结果太广 2、phone 查询 没有加引号 3、没有limit 限制
正确:
SELECT id FROM `user` WHERE phone=`15012345678` LIMIT 1;
3、如何使用子查询
一般是避免子查询,但一定要使用子查询,需要分开查询
错误:
SELECT * from post where id IN (
SELECT post_id from post_comment
)
正确:分两步查询
1、SELECT post_id from post_comment,程序查询结果后,将post_id存一个变量中。
2、SELECT * from post where id IN(post_ids)
4、拒绝join联表 如何联表查询?
错误:
SELECT * FROM post left JOIN post_comment on post.id=post_comment.post_id
正确:
1、SELECT * FROM post 结果集,取取对应关联ids
2、SELECT * FROM post_comment WHERE id IN (ids),如果ids结果集过大,可分段再查询
5、order by 常见错误使用讲解
查询最近10篇文章,这是最容易写错的sql ,也是查询范围过大
错误:
SELECT * from post ORDER BY id desc limit 10;
正确:需限制id的取值范围,减少查询范围
SELECT * from post WHERE id>1000 ORDER BY id desc limit 10;
6、禁止在sql语句中使用函数,可以程序先用函数计算好。
7、杜绝危险SQL
错误 where 1=1 这样无意义或恒真的条件,,如果遇到update/delete或遭到sql注入就恐怖了 https://github.com/lifeibest/guide/blob/master/mysql-%E8%AF%AD%E5%8F%A5%E8%A7%84%E8%8C%83.md