Maison >base de données >tutoriel mysql >Avoir 21 bonnes habitudes pour écrire du SQL dans Mysql
La colonne
Chaque bonne habitude est une fortune Cet article est divisé en trois directions : la médecine des regrets SQL, l'optimisation des performances SQL et l'élégance des spécifications SQL. Partagez et écrivez 21 bonnes habitudes SQL, merci d'avoir lu, continuez votre bon travail ~
Quand. Développer et écrire du SQL dans la vie quotidienne, essayez de le développer autant que possible. C'est une bonne habitude : après avoir écrit le SQL, utilisez l'explication pour l'analyser, en accordant une attention particulière à l'utilisation ou non de l'index.
explain select * from user where userid =10086 or age =18;复制代码
Lors de l'exécution de l'instruction de suppression ou de mise à jour, essayez de ajoutez une limite, comme suit Prenons le SQL suivant comme exemple :
delete from euser where age > 30 limit 200;复制代码
Parce que l'ajout d'une limite présente les principaux avantages suivants :
Cette bonne habitude doit être développée lors de la conception des tables de base de données, de toutes les tables et champs. sont ajoutés avec les commentaires correspondants, ce qui facilite leur maintenance ultérieure.
Exemple positif :
CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id', `name` varchar(255) DEFAULT NULL COMMENT '账户名', `balance` int(11) DEFAULT NULL COMMENT '余额', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';复制代码
Contre-exemple :
CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `balance` int(11) DEFAULT NULL, `create_time` datetime NOT NULL , `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8;复制代码
Exemple positif :
SELECT stu.name, sum(stu.score) FROM Student stu WHERE stu.classNo = '1班' GROUP BY stu.name复制代码
Contre-exemple :
SELECT stu.name, sum(stu.score) from Student stu WHERE stu.classNo = '1班' group by stu.name.复制代码
Évidemment, unifier des mots-clés dans la même casse et utiliser l'alignement d'indentation rendra votre SQL plus beau . Cela a l'air plus élégant ~
Contre-exemple :
insert into Student values ('666','捡田螺的小男孩','100');复制代码
Exemple positif :
insert into Student(student_id,name,score) values ('666','捡田螺的小男孩','100');复制代码
Contre-exemple :
CREATE TABLE `account` ( `name` varchar(255) DEFAULT NULL COMMENT '账户名', `balance` int(11) DEFAULT NULL COMMENT '余额', ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';复制代码
Exemple positif :
CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id', `name` varchar(255) DEFAULT NULL COMMENT '账户名', `balance` int(11) DEFAULT NULL COMMENT '余额', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';复制代码
Raison :
Le manuel de développement d'Alibaba a également mentionné ce point, comme le montre la figure
Contre-exemple :
select * from user where address ='深圳' order by age ;复制代码
Exemple positif :
添加索引 alter table user add index idx_address_age (address,age)复制代码
Si vous souhaitez modifier ou supprimer des données, vous devez sauvegarder les données à modifier avant d'exécuter. SQL, en cas de mauvaise opération , vous pouvez aussi en prendre une bouchéeRegret Medicine~
反例:
//userid 是varchar字符串类型 select * from user where userid =123;复制代码
正例:
select * from user where userid ='123';复制代码
理由:
尤其在操作生产的数据时,遇到修改或者删除的SQL,先加个where查询一下,确认OK之后,再执行update或者delete操作
反例:
select * from employee;复制代码
正例:
select id,name from employee;复制代码
理由:
Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好,所以呢,没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎
统一使用UTF8编码
如果是存储表情的,可以考虑 utf8mb4
反例:
`deptName` char(100) DEFAULT NULL COMMENT '部门名称'复制代码
正例:
`deptName` varchar(100) DEFAULT NULL COMMENT '部门名称'复制代码
理由:
这个点,是阿里开发手册中,Mysql的规约。你的字段,尤其是表示枚举状态时,如果含义被修改了,或者状态追加时,为了后面更好维护,需要即时更新字段的注释。
正例:
begin; update account set balance =1000000 where name ='捡田螺的小男孩'; commit;复制代码
反例:
update account set balance =1000000 where name ='捡田螺的小男孩';复制代码
说明: pk_ 即 primary key;uk _ 即 unique key;idx _ 即 index 的简称。
假设loginTime加了索引
反例:
select userId,loginTime from loginuser where Date_ADD(loginTime,Interval 7 DAY) >=now();复制代码
正例:
explain select userId,loginTime from loginuser where loginTime >= Date_ADD(NOW(),INTERVAL - 7 DAY);复制代码
理由:
反例:
delete from account limit 100000;复制代码
正例:
for each(200次) { delete from account limit 500; }复制代码
理由:
相关免费学习推荐:mysql视频教程
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!