SQL语言最佳实践

为单位制订的SQL规范,分享一下。

首先说一下,这是公司用的一个规范,给到程序员做参考的。

其实,这个规范是建立在对SQL有一定熟悉程序的基础上的,所以规范本身并不涉及SQL语法学习的相关内容。

1. 绝对避免使用 SELECT *

SELECT * 查询会返回所有列的记录。这样的查询会有很多问题:

  • 很多情况不需要检索所有的字段,使用 SELECT * 会消耗过多的带宽;

  • 在考虑到修改表结构的前题并存在脏数据的情况,SELECT * 出现意想不到的结果;

  • SELECT * 比 SELECT [字段] 要慢,因为后者可以使用列索引;

  • SELECT * 返回的列顺序不可控。

因此,要求查询时逐个列表需要查询的字段。包括查询全部字段,也需要将字段逐个写出来,并按照需要的方式排序字段的先后次序。

2. 区分使用 WHERE 和 HAVING

SQL 中 WHERE 和 HAVING 从语法上可以在一定范围内混着用,但两个词的语义截然不同,在实际编程时,需要按语义分开使用。

  • WHERE 用于全部CRUD,HAVING只用于查询 SELECT;

  • WHERE 用在聚合操作之前过滤数据,HAVING 用在聚合之后;

  • HAVING 子句中可以使用聚合函数,如SUM、MIN、MAX、COUNT,而 WHERE 子句不能使用聚合函数,除非该子句是 HAVING 子句中包含的子查询的一部分。

3. 表连接查询使用 INNER JOIN

JOIN 是使用非常多的SQL查询之一,允许用户从多个表中选择数据。WHERE 也可以连接两个表并获取聚合数据,但开发中禁止使用。

一个主要的原因是 WHERE 返回的是 CROSS JOIN,返回的记录数是两个表记录的乘积。例如两个表A和B,各有1000条数据,用 WHERE 子句,将会返回一个 1000 x 1000 = 1000000条记录的 CROSS JOIN,然后再从这个数据集里提取满足条件的数据。这在性能上不可接受。

而上面的例子,在 INNER JOIN 时仅返回 1000 条记录,然后从这个数据集中提取满足条件的数据。

虽然有些数据库会在内部将 JOIN 查询中的 WHERE 转换为 INNER JOIN,但规则要求显式使用 INNER JOIN,而不是 WHERE。

4. 使用 EXISTS 和 NOT EXISTS 代替 IN 和 NOT IN

在检索某个值在表中存在与否时,EXISTS 子句的执行进程会在找到值后停卡,而 IN 子句会在找到值后继续扫描所有的值。

NOT EXISTS 和 NOT IN 的执行也一样。

这个规则也是性能原因。

5. 使用 = 代替 LIKE

两个方式都可以用来匹配字符串,但 LIKE 用于匹配通配符,而 = 用来进行精确匹配。

在 SQL 中,= 操作符可以使用索引,会比 LIKE 更快。

6. 使用 LIMIT 子句限制检索结果数量

查询数据时,尽可能使用 LIMIT 子句,来限制查询结果数量。大多数情况下,查询没有必要返回所有行。限制查询返回的数量,也可以提高查询性能。

7. 查询多表时使用表别名

多表查询时,使用表别名,避免混淆,并防止数据库在搜索列表所属的表时解析列名。这不会增加工作量,但很有效。

8. 避免使用 “sp_” 作为存储过程的名称前缀

原则上,避免使用存储过程。

如果必须使用存储过程,那必须禁止使用 sp_ 作为前缀的存储过程名称。SQL Server 中,会首先在主数据库中查询名称以 sp_ 开头的存储过程,然后再搜索其它地方。因此,避免 sp_ 打头的存储过程名称可以节省大量时间,SQL Server将直接检查 DBO 作为存储过程的所有者,而不是在主数据库中查找存储过程。

9. 采用规范的查询代码风格

这算是一个建议,但是,使用良好规范的代码风格是必要的:

  • 完整的注释。需要帮助其它团队成员理解查询的目的,并提醒开发者做的是什么;

  • 使用明显的命名约定。数据库、表名、字段名,包括临时表和变量名都应该是可读和清楚的;

  • 尽可能缩进查询语句。通过缩进来确保清晰的代码外观,并提高查询的可读性。

SQL是一种非常灵活的语言,提供了多种方法在数据库上执行所需的任务。在编程中,性能瓶颈大多来自数据库操作和响应。以上这些建议,可能有效地帮助加快性能,消除不必要的延时,并可避免长期积累的数据库问题。

喜欢就来个三连,让更多人因你而受益

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有哪些经济学理论可以用在谈恋爱上?

全世界有3.14 % 的人已经关注了数据与算法之美大概两周前回加拿大的航班上,我在机舱尾部跟一位空姐聊了很久。大概两周前回加拿大的航班上,我在机舱尾部跟一位空姐聊了很久。看到浮标沉下去了,我却把鱼竿放回地上,难道我是素食主义…

python 局部变量 占内存吗_Python中全局变量和局部变量的理解与区别

前言学过编程的人应该对全局变量与局部变量这两个名词并不陌生,Python也同多数编程语言一样,也有全局变量与局部变量的概念但是与其他编程语言又有所不同全局变量与局部变量两者的本质区别就是在于作用域用通俗的话来理解的话,全局变量是在整…

port wifi to ICS(4.0.3)

去年移植了2.2。最近又刚刚移植了4.0.3。使用的是broadcom的bcm4329网卡。现把移植经历分享一下 1.该android.hardware.wifi.xml复制到out目录下 在相应的.mk文件中。添加 PRODUCT_COPY_FILES \ frameworks/base/data/etc/android.hardware.wifi.xml:$(PRODUCT_OUT)system/etc…

C# 离线使用nuget

正常在我们使用nuget进行程序集下载的时候,直接在vs编辑器中直接进行操作,下载自己想要的各种程序,但是某些时候,在进行一些办公时,公司要求本机编码不能进行联网操作,那么这种情况下我们怎么进行nuget程序…

21个令程序员泪流满面的瞬间

「1」公司实习生找 Bug「2」在调试时,将断点设置在错误的位置「3」当我有一个很棒的调试想法时 「4」偶然间看到自己多年前写的代码「5」当我第一次启动我的单元测试时「6」数据库的Delete语句忘了使用限定词where... 「7」明明是个小bug但就是死活修不好......「8…

python气象数据处理与绘图_Python气象数据处理与绘图:纬高图的另一种思路

前言有些时候为了研究不同高度上气象要素之间的联系,纬度-高度作为xy轴的图在一些SCI论文中比较常见。这是我研究的CMIP6数据中ua,va,wap,ta这几个气象要素在纬度-高度图上的不同。读取数据的地方就略去了,需要注意的是需要进行平均,温度转为…

新的一年

1、学习一种新语言,框架或方法 2、让你掌握的内容更精深 3、探索一个新的领域 4、参与社区 5、教导他人 6、更好地照顾自己 7、更好的管理自己的时间(以及其他资源)

.Net Core 集成 Kafka

最近维护的一个系统并发有点高,所以想引入一个消息队列来进行削峰。考察了一些产品,最终决定使用kafka来当做消息队列。以下是关于kafka的一些知识的整理笔记。kafkakafka 是分布式流式平台。它由linkedin开发,后贡献给了Apache开源组织并成为…

如果生活中没有数学,那么。。。

随着科技的快速发展,人工智能的重要性日渐显现。对于大多数新手来说,弄清楚入门人工智能需要哪些数学基础、需要熟悉什么框架等,都至关重要。机器学习是一个异常丰富的研究领域,有大量未解决的问题:公正、可解释性、易…

mysql5.6查看归档_MySQL5.6 使用 pt-archiver 分批删除、归档数据

pt-archiver是一个十分高效的表数据归档工具,归档数据可以分批进行事务处理,减少性能消耗;如果实例开启了GTID,因为GTID不支持CTAS创建表的语法,可以使用pt-archiver处理;对于跨实例或者跨服务器的表数据归…

Python学习笔记整理(三)Python中的动态类型简介

Python中只有一个赋值模型 一、缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明。这意味着没有必要事声明变量。只要记住,这个概念实质上对变量,对象和它们之间的关系都适用。那么这个概念也…

Microsoft宣布将停止支持多个 .NET Framework版本

Microsoft 宣布,使用传统的、不安全的安全哈希算法1(SHA-1)签名的多个 .NET 框架版本将在明年停止支持。据 .NET 首席工程经理 Jamshed Damkewala 表示,.NET 框架 4.5.2、4.6 和 4.6.1 将在 2022 年 4 月 26 日后停止支持&#xf…

算法有偏见?总比人类识别强吧!

在讨伐算法导致的偏见和产生的作用时,更重要的问题是:与完全没有使用算法的情况相比是怎样的?我们应该比较算法的缺陷与人类的缺陷,而不是简单地询问算法是否存在缺陷。一场革命正在悄然进行。这场革命与大部分新闻报道中出现的人…

no ip domain-lookup 什么意思

no ip domain-lookup 是什么意思? 当你敲入一个不能识别的命令时,它不会去向查找域名一样,去搜DNS服务器。如果在你的网络中没有DNS服务器的话,那么在配置router的时候最好写上该句,因为我们都不是专业的打字员&#x…

如何将mysql文件导入MySQL_如何将mysql5的sql文件导入到mysql4?

1、将mysql5里导出的sql文件导入到mysql5中。 2、用mysqldump -uroot -p1234 --opt --compatiblemysql40 -A -re:/localhost.sql --compatiblename参数描述如下: --compatiblename Change the dump to be compatible with a given mode. By default tables are dump…

通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪

Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的目录:一、通过Dapr实现一个简单的基于.net的微服务电商系统二、通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架…

21副酷炫的动图让你了解各种数学概念

数学是很难的科学,但因为它是科学家用数学来解释宇宙的语言,我们无可避免的要学习它。看看下面的这些GIF动图,它们提供了视觉的方式来帮助你理解各种数学技巧。1椭圆的画法2杨辉三角问题(Pascal triangles)解法3使用“FOIL”轻松的解决二项式…

VMware 虚拟机(linux)增加根目录磁盘空间

今天查看学校的监控报修系统,不能访问了!!!系统运行很慢,用top命令查看发现内存使用率90%,用"df -h ”查看“/”目录使用率已达到80%,导致系统运行很慢。我用以下方法扩大根目录磁盘空间。…

阅读Java_如何阅读 Java 开源代码?

最近正在学习阅读源码,看到的大神许鹏的方法,感觉很有用,分享给大家源码阅读其实是一个逆向的工程,这期间必须会遇到种种问题。一般来说,我会遵循这样一个思维范式——Problem domain→model→architecture&implem…

网关Ocelot功能演示完结,久等了~~~

前言关于网关(Ocelot)的分享,还遗留一些功能没演示呢,接着来聊聊;这次重点针对网关Ocelot使用缓存、集成Polly做服务治理、集成IdentityServer4做认证授权来详细说说;如果对上一篇感兴趣,点这里(网关Ocelot功能演示安排…