1、SQL中的字符串都要用单引号
不用单引号也可能会执行,但是会有类型转换,而类型转换设计函数操作,引起索引失效或逻辑错误的问题。
2、SQL书写顺序和逻辑顺序要一致
- order by要放在句末
- select a,b from t order by c ,c不在select项中,数据库引擎是怎么处理的?
MySQL进行数据的逻辑存储,以page为单位,会抽取所有数据。 - select id1 as fid from t where fid = 2 能执行吗?
不能;执行顺序是先where,再select。
3、内连接与外链接
-
内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)
包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。 -
外联接
外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 -
考虑这个SQL语句:
select count(*) from a2 left join b2 on a2.id = b2.id
这个语句没有意义:因为a2作为左表,数据项都会被显示,而count将每次都得到相同的结果。
-
外链接的内部处理方式:(可以从扩展执行计划中查看具体的执行过程,类似于单步调试)
有where条件的left join查询,内部将以内连接处理。
4、语法细节
-
update同时更新多条,以逗号“,”将update的值分隔,一并执行:
update a1 set a = 1,b = 2 where ...
-
delete from t where id;
可以正常执行:id有值的数据都满足。 -
truncate和delete *
truncate是原子事务,没有日志记录(或者说只有一条语句执行的日志),所以不能进行事务回滚。
delete操作将产生详细的日志,IO频繁,支持事务回滚。
5、Quanr数据库命名规范
库、表、字段命名
- 必须使用小写字母,并采用下划线分割;
- 不超过32个字符;
- 必须见名知意,与事务、产品线相关;
- 禁用MySQL保留字;
- 临时表以tmp_做前缀,日期做后缀,如:tmp_hourse_xxx_20170301
- 备份表以bak_做前缀,日期做后缀,如:bak_hourse_xxx_20170301
索引命名
- 小写字母,下划线分割,禁用驼峰式;
- 非唯一索引:idx_字段名称[_字段名称]
- 唯一索引:uniq_字段名称[_字段名称]
6、Quanr数据操作基础规范
- 使用INNODB存储引擎并且使用业务不相关自增ID为主键;
- 使用UTF8 / UTFMB4字符集;
- 所有表、字段都要加注释;
- 禁止在数据库中存放图片、文件等;
- 每张数据表数据量控制在5000W以内;
- 禁止在线上做数据库压力测试;
- 禁止从测试、开发环境直连数据库。
网友评论