开发人员应该了解哪些 SQL 知识?

2024-01-21

SQL(结构化查询语言)是数据库的通用语言,它无处不在、功能强大,并且对于开发人员来说理解非常重要。从这些技巧开始。

作者:Charly Batista

本文和封面来源: https://www.infoworld.com/,爱可生开源社区翻译。

本文约 2700 字,预计阅读需要 9 分钟。

自 20 世纪 70 年代初发明 SQL 以来,它一直是管理与数据库交互的默认方式。根据 Stack Overflow 的数据 SQL 仍然是排名前五的编程语言之一,大约 50% 的开发人员在工作中使用它。 尽管 SQL 无处不在,但它仍然以困难或令人生畏而闻名。只了解 SQL 是什么,还是远远不够的。

同时,由于当今的企业越来越重视他们的数据,因此熟练使用 SQL 将为你提供更多机会,让你成为一名优秀的软件开发人员并推动职业发展。那么应该了解 SQL 哪些知识,以及应该避免哪些问题呢?

不要害怕 SQL

SQL 很容易使用,因为它是结构化的。SQL 严格定义了如何将查询组合在一起,使它们更易于阅读和理解。如果你正在查看其他人的 SQL,应该很容易理解他的的查询目标。

然而,许多开发人员对复杂 SQL 望而却步,可能是因为当初学到的第一个命令: SELECT 。开发人员在开始编写 SQL 时最常犯的错误就是 SELECT *

使用 SELECT 查询内容太多,会对性能产生很大影响,并且随着时间的推移,它可能会导致优化查询变得困难。查询内容是否有必要,或者是否可以更具体?这会对现实世界产生影响,因为它可能会导致大量 ResultSet 响应,从而影响服务器高效运行所需的内存占用。如果查询涵盖太多数据,最终可能会为其分配超出所需的内存,特别是在云服务中运行数据库时。 云资源需要花钱,错误的 SQL 编写会让你浪费更多的钱。

合适的数据类型

开发人员在使用 SQL 时另一个常见问题是数据类型不合适。 常用的两种主要类型的数据:INT 和 VARCHAR。INT 类型包含数字,而 VARCHAR 类型字段可以包含数字、字母或其他字符。如果处理数据时期望一种类型,然后获取另一种类型,则结果中可能会出现数据类型不匹配的情况。

为了避免此问题,请谨慎处理可能经常使用的语句命令和准备好的语句脚本。这将帮助你避免出现期望一种结果却得到其他结果的情况。同样,将任何数据库表放在一起时,应该评估 JOIN 语句。检查数据可以帮助您避免 JOIN 执行此操作时发生任何数据丢失,例如字段中的数据值被截断或隐式转换为不同的值。

另一个经常被忽视的问题是字符集。 这很容易被忽视,但请务必检查您的应用程序和数据库在工作中是否使用相同的字符集。使用不同的字符集可能会导致编码不匹配,这可能会完全扰乱您的应用程序视图并阻止您使用特定的语言或符号。在最坏的情况下,这可能会导致数据丢失或难以调试的奇怪错误。

数据顺序很重要

许多开发人员在开始研究数据库时做出的一个假设是,列的顺序不再重要。 毕竟,我们有许多数据库提供商告诉我们,我们不需要了解具体的数据库,他们的工具可以为我们处理所有这些事情。然而,虽然看起来没有影响,但我们的基础设施可能会产生相当大的计算成本。当使用按使用量收费的云服务时,这一费用会迅速增加。

重要的是要知道,并非所有数据库都是相同的,也不是所有索引都是相同的。例如,列的顺序对于组合索引非常重要,因为这些列是从索引创建顺序的最左边开始计算的。因此,随着时间的推移,这确实会对潜在性能产生影响。

但是,在子句中声明列的顺序 WHERE 不会产生相同的影响。这是因为数据库具有查询计划和查询优化器等组件,它们尝试以最佳执行方式重新组织查询。他们可以重新组织和更改子句中列的顺序 WHERE,但它们仍然依赖于索引中列的顺序。

所以,事情并不像听起来那么简单。了解数据顺序将影响操作和索引的位置可以为提高整体性能和优化设计提供机会。为了实现这一点,数据和运算符的基数非常重要。了解这一点将帮助您制定更好的设计并获得更多的长期价值。

注意编程语言差异

对于刚开始使用 SQL 的人来说,一个常见问题是 NULL 对于使用 Java 的开发人员, Java 数据库连接器(JDBC) 提供了一个 API 将其应用程序连接到数据库。然而,虽然 JDBC 确实将 SQL 映射 NULL 到 Java 的 null,但它们并不是一回事。SQL 中的命令 NULL 也可以称为 UNKNOWN,这意味着 SQLNULL = NULL 是 FALSE,与 Java 中的 null == null 不一样。

最终结果是算术运算 NULL 可能不会产生期望的结果。了解这一差异后,就可以避免从应用程序的一个元素转换为数据库和查询设计时出现的潜在问题。

在 Java 和数据库方面还有一些其他常见模式需要避免。这些都涉及操作如何以及在何处进行和处理。例如,您可以将来自单独查询的表加载到映射中,然后将它们连接到 Java 内存中进行处理。然而,这在内存中执行要复杂得多,计算成本也高。看看排序、聚合或执行任何数学运算,以便它可以由数据库处理。在绝大多数情况下,用 SQL 编写这些查询和计算比在 Java 内存中处理它们更容易。

让数据库完成工作

除了使解析和检查这项工作变得更容易之外,数据库执行计算的速度可能比算法更快。仅仅因为您可以在内存中处理结果并不意味着您应该这样做。出于整体速度的原因,不值得这样做。同样,在内存云服务上的支出比使用数据库提供结果的成本更高。

这也适用于分页。分页涵盖了如何在多个页面而不是一页中对查询结果进行排序和显示,并且可以在数据库或 Java 内存中执行。就像数学运算一样,分页结果应该在数据库中而不是在内存中进行。原因很简单——内存中的每个操作都必须将所有数据带到内存中,进行事务,然后返回到数据库。这一切都通过网络进行,每次执行都会增加一次往返,并增加交易延迟。使用数据库进行这些事务比尝试在内存中执行工作要高效得多。

数据库还有许多有用的命令,可以使这些操作更加高效。通过利用 LIMIT、OFFSET、TOP、START AT,和 FETCH 等命令,可以使分页请求在处理正在使用的数据集的方式方面更加高效。同样,我们可以避免过早的行查找以进一步提高性能。

使用连接池

在建立连接和执行事务之前,将应用程序链接到数据库需要工作和时间。因此,如果您的应用程序定期处于活动状态,这将是您想要避免的开销。标准方法是使用连接池,其中一组连接随着时间的推移保持打开状态,而不必在每次需要事务时打开和关闭它们。这是标准化的 JDBC 3.0 的一部分。

但是,并非每个开发人员都实现连接池或在其应用程序中使用它。这可能会导致应用程序性能下降,而这一点很容易避免。与没有连接池的相同系统相比,连接池极大地提高了应用程序的性能,并且还减少了总体资源使用。它还减少了连接创建时间并提供了对资源使用的更多控制。当然,重要的是要检查您的应用程序和数据库组件是否遵循有关关闭连接并将其交还给资源池的所有 JDBC 步骤,以及应用程序的哪个单元将在实践中负责此操作。

利用批处理

今天,我们看到人们非常重视实时交易。您可能认为整个应用程序应该实时运行才能满足客户需求或业务需求。然而,情况可能并非如此。与运行多个操作相比,批处理仍然是处理多个事务的最常见和最有效的方法。

使用 JDBC 确实可以提供帮助,因为它支持批处理。例如,您可以使用单个 SQL 语句和多个绑定值集创建批处理 INSERT ,这比独立操作更高效。需要记住的一个因素是在事务非高峰时段加载数据,这样就可以避免对性能造成任何影响。如果这是不可能的,那么您可以定期查看较小的批量操作。这将使您的数据库更容易保持最新,并保持事务列表较小并避免潜在的数据库锁定或竞争条件。

总结

无论您是 SQL 新手还是已经使用它多年,它仍然是未来的一项关键语言技能。通过将上述经验教训付诸实践,您应该能够提高应用程序性能并利用 SQL 提供的功能。

更多技术文章,请访问: https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型 地址
版本库 https://github.com/actiontech/sqle
文档 https://actiontech.github.io/sqle-docs/
发布信息 https://github.com/actiontech/sqle/releases
数据审核插件开发文档 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发人员应该了解哪些 SQL 知识? 的相关文章

  • 寻找多列索引的最佳顺序

    假设我有一个包含两个索引的表 一个位于 a 列 一个位于 a b 和 c 列 我注意到 根据索引定义中列的顺序 MySQL 可能最终使用单列索引而不是多列索引 即使多列索引中的所有三列都在 ON 中引用JOIN 的一部分 这有点引出了一个问
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • 数据包无序。得到:80 预期:0 node.js

    这是我的 非常简单 代码 var connection mysql createConnection infosDB connection connect connection query SELECT FROM action functi
  • 如何使用Python高效地将CSV文件数据插入MYSQL?

    我有一个带有 aprox 的 CSV 输入文件 400 万条记录 插入已运行超过 2 小时 但仍未完成 数据库仍然是空的 关于如何实际插入值的任何建议 使用insert into 并且更快 比如将插入物分成块 我对 python 还很陌生
  • 澄清创建临时表的连接顺序

    我在 mysql 中有一个大型查询 涉及将多个表连接在一起 它太慢了 所以我做了 解释 发现它正在创建一个临时表 我怀疑它占用了大部分执行时间 我找到了一些相关资料 mysql 文档 http dev mysql com doc refma
  • MySQL按总和连接表问题

    我在连接表时遇到问题 以下是示例表 表A 30行 ID Name Description 1 Type Unicode Art 2 Header Spreadsheet 3 Auto Align Off 表B 100行 ID Name De
  • 使用单个查询和每用户密码盐进行用户登录

    我决定使用存储在数据库中的每用户盐来实现用户登录 盐作为密码的前缀 该密码使用 SHA 进行哈希处理并存储在数据库中 过去 当我不使用盐时 我会使用典型的方法 使用用户输入的用户名和密码来计算查询返回的行数 然而 对于每个用户的盐 您需要先
  • MySQL 如何使用返回多行的 SELECT 子查询插入表?

    MySQL 如何使用返回多行的 SELECT 子查询插入表 INSERT INTO Results People names VALUES SELECT d id FROM Names f JOIN People d ON d id f i
  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • 查询中的存储过程

    有一个程序获取文件列表 顾名思义 返回一个文件列表以及更多选项 那么是否可以在查询选择中使用此过程 像这样的东西 select Field1 from Image where Field2 IN call GetFileList 你应该把它
  • 我可以让 MySQL 数据库在插入语句后自动为列分配值吗?

    给定一个具有 ID pk 和 name 列的员工表 ID name 1 John 2 James 3 Tom Can I do INSERT INTO employee name VALUES Jack 并以某种方式让数据库自动分配下一个可
  • 删除重复的 SQL 记录以允许唯一键

    我在 MYSQL 数据库中有一个表 销售 该表理应强制执行唯一约束以防止重复 事实证明 首先删除欺骗并设置约束有点棘手 表结构 简化 id 唯一 autoinc 产品编号 目标是强制product id 的唯一性 我想要应用的重复数据删除策
  • 如何在MySQL选择查询中编写正则表达式?

    我尝试过这个表达 b word w b i比较一个word对照其他单词列表来查找重复项 我用了preg math all 效果很好 我想做同样的事情 但这次检查从 mysql 数据库检索到的单词 这是我写的 SELECT FROM tabl
  • BigDecimal 的 JPA @Size 注释

    我该如何使用 SizeMySQL 的注释DECIMAL x y 列 我在用着BigDecimal 但是当我尝试包括 Size max它不起作用 这是我的代码 Size max 7 2 Column name weight private B
  • 从本地 html/javascript 网站插入 mySQL 数据库

    我正在尝试做什么 我的程序的目的是插入数据local HTML JS网站变成online 非本地 mySQL数据库 到目前为止我尝试过的 我试图用来实现此目的的原始方法是让我的本地网站使用 javascript 通过在线发布数据PHP文件
  • MySQL ALTER TABLE 挂起

    我知道这个问题已经被问过好几次了 但我的问题发生在我刚刚创建的表上 它只有 10 列和 1 行 因此 与通常的挂起问题不同 这不是具有大量数据的大表的情况 但它仍然挂着 这是我正在运行的 SQL ALTER TABLE db Search
  • TCPDF - 来自 mysql 的打印表显示重复的第一行

    我是 TCPDF 的新手 我面临的小问题是所有输出数据都显示同一行 我的意思是第一条记录重复数据库中存在的总数据 行 的次数 这是我的代码 tbl header
  • 未找到教义列:1054“字段列表”中未知列“s.features”

    我在站点表中添加了一个新列 features 并使用 Doctrine 重新生成了模型 此代码导致错误 siteTable Doctrine Core getTable Site site siteTable gt findOneByNam
  • Mysql案例不工作

    SELECT SQL CALC FOUND ROWS a zn name AS zone name c name AS carrier name CASE type WHEN type 1 THEN General day ELSE Spe

随机推荐

  • 毕业设计- 基于深度学习的小样本时间序列预测算法 - Attention

    目录 前言 课题背景与意义 课题实现 一 数据集 二 设计思路 三 相关代码示例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校
  • 毕业设计:基于卷积神经网络的验证码识别系统 机器视觉 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 字符分割算法 2 2 深度学习 三 检测的实现 3 1 数据集 3 2 实验环境搭建 3 3 实验及结果分析 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • 毕业设计:基于深度学习的微博谣言检测系统 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 三 检测的实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有
  • 还在手工标注数据集?快来试一试自动化多模型标注大模型-gui交互式标注(部署运行教程-高效生产力)

    快速入门指南 先看一下自动化标注的强大 简直医学图像处理的福音呀 不仅如此 任何区域都可以识别到 面对任意开集数据 都可以达到良好的效果 运行模式 目前 X AnyLabeling 支持两种运行方式 一种是下载源码直接运行 另一种是直接下载
  • 【毕业设计选题】复杂背景下的无人机(UVA)夜间目标检测系统 python 人工智能 深度学习

    前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大家顺利通过和节省时间
  • 无人机视角、多模态、模型剪枝、国产AI芯片部署

    无人机视角 多模态 模型剪枝 国产AI芯片部署是当前无人机技术领域的重要研究方向 其原理和应用价值在以下几个方面进行详细讲述 一 无人机视角 无人机视角是指在无人机上搭载摄像头等设备 通过航拍图像获取环境信息 并进行图像处理和分析 这种技术
  • 网络安全:绕过 MSF 的一次渗透测试

    这次渗透的主站是 一个 Discuz 3 4 的搭建 违法招 piao 网站 配置有宝塔 WAF 用 Discuz ML 3 X 的漏洞进行攻击 但是没有成功 发现主站外链会有一个发卡网 引导人们来这充值 是 某某发卡网 而且域名指向也是主
  • 毕业设计:基于卷积神经网络的图像分类系统 python人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 卷积神经网络 2 2 SVM算法 三 检测的实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力
  • 台积电再被坑,2纳米光刻机优先给Intel和三星,美国太霸道了

    外媒指出今年ASML的10台2纳米光刻机分配已经基本确定了 Intel拿到6台 三星获得3台 台积电只能得到一台 考虑到美国对ASML的强大影响力 外媒的这些消息应该有较高的可信性 Intel在先进工艺制程方面 自从2014年量产14纳米之
  • iPhone成中国市场2023年最畅销手机,但国产手机已雄起

    苹果首次夺下国内手机市场年度第一名 iPhone成中国市场最畅销的手机 这个话题突然热起来 其实iPhone一直都是中国市场最畅销的手机啊 不过2023年Q4显示出国产手机已经雄起啦 苹果在2023年首次夺下中国手机市场年度第一名 这对苹果
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • 华为重夺第一,竞争对手就降价,这真的是巧合么?

    2024年Q4某国产手机品牌重夺国产手机品牌第一名 不过2024年开年第一周 国内手机市场的格局再次大变 华为夺下了第一名 不仅超越众多国产手机品牌 还超过了苹果 给国内手机市场带来震动 首先降价的是苹果 苹果的iPhone15自去年上市以
  • 回乡翻新父辈房子成部分年轻人的选择,低成本的田园生活

    独家首发 所谓城市套路深 我要回农村 这个或许只是一部分人的调侃 然而却有一部分年轻人做出这样的选择 不过他们又不希望花费太大成本 如此一些年轻人就选择翻新父母留下的旧房子 对于这部分年轻人来说 其实这也是一种不错的选择 城市里生活压力大
  • 性能大减80%,英伟达芯片在华“遇冷”,我方霸气回应:不强求

    中国这么大一块市场 谁看了不眼馋 在科技实力大于一切的今天 高端芯片的重要性不言而喻 作为半导体产业发展过程中不可或缺的一环 芯片技术也一直是我国技术发展的一大 心病 在美西方等国的联手压制下 我国芯片技术发展处处受阻 至今也未能在高端芯片
  • 作物叶片病害识别系统

    介绍 由于植物疾病的检测在农业领域中起着重要作用 因为植物疾病是相当自然的现象 如果在这个领域不采取适当的护理措施 就会对植物产生严重影响 进而影响相关产品的质量 数量或产量 植物疾病会引起疾病的周期性爆发 导致大规模死亡 这些问题需要在初
  • 京东001号快递员,刘强东给的买房承诺,仅4年时间就实现了

    京东001号快递员金宜财正式退休 不知是有意还是无意 他成为了互联网的热搜 不过大众更关心的是金宜财当年得到刘强东的承诺 只要干几年就能买房 那么刘强东的承诺有没有实现 又是如何实现的呢 据悉当年京东刚开始推京东快递的时候 京东还没什么名气
  • MySQL 核心模块揭秘 | 03 期 | 我是一个事务,请给我一个对象

    每个事务都有一个对象 这篇文章我们聊聊 事务的对象从哪里来 要到哪里去 作者 操盛春 爱可生技术专家 公众号 一树一溪 作者 专注于研究 MySQL 和 OceanBase 源码 爱可生开源社区出品 原创内容未经授权不得随意使用 转载请联系
  • 时隔9年,小米终于重回国产手机第一名,但最大赢家是苹果

    2023年Q4的数据显示 国内手机市场前两名分别是苹果 小米 这也意味着小米终于在国内市场重获第一名 对小米来说这是意外之喜 而小米创始人兼CEO雷军曾经喊出的口号也终于因此实现 2018年雷军曾经喊出用10个季度重夺中国手机市场第一名 不
  • js中关于字符串的创建和判断类型

    文章目录 创建方法 判断类型的技巧 区分 1 typeof 2 instanceof 共点 1 Object prototype toSt
  • 开发人员应该了解哪些 SQL 知识?

    SQL 结构化查询语言 是数据库的通用语言 它无处不在 功能强大 并且对于开发人员来说理解非常重要 从这些技巧开始 作者 Charly Batista 本文和封面来源 https www infoworld com 爱可生开源社区翻译 本文