mysql - SQL 与其他 DBMS 的关系是什么?
问题描述
根据我从上一个问题中了解到的信息,SQL 查询受限于所使用的 DBMS。例如,full outer join
如果 DBMS 是 MySQL,则无法使用 SQL 查询。由此,我还有一些令我感到困惑的问题。
如果 SQL 完全依赖于 DBMS,为什么将其表示为用于从数据库中检索数据的编程语言? 我看到的每个定义都表明 SQL 是在数据库中操作数据的标准编程语言,但正如刚才所说,这并不总是可能的。
为什么 SQL 不是用于 sqlfiddle.com 等网站的有效选项,您只能使用特定的 DBMS,例如 MySQL 或 SQLite? SQL 语法是否意味着在所有这些选项中都有效,但其中一些选项也有自己独特的语法?
学SQL的时候发现w3schools这样的网站很有用,比如我觉得这是学习全外连接法的一个很好的起点。如前所述,这对于使用 MySQL 制作的数据库无效,那么这么多宣传教 SQL 的网站实际上教的是什么版本/DBMS?
将 SQL 称为“主要”编程语言是否正确,而其他 DBMS 类似于“自定义”SQL,它们采用自己的语法,添加/删除一些功能等。我从每个创建自己的数据库中得到这个想法SQL 语言的方言(在我之前的帖子中说过)
SQL 注入这个术语是否不完全准确,例如,一个网站容易受到他们使用的 DBMS 的特定语法的影响?
人们应该在简历上写 SQL,还是总是写 MySQL、Oracle 等细节?
如果解释太长,请提供有用的链接,以便我阅读。几个小时以来一直对这些东西感到困惑,我发现的每个网页都只是重申了同样的事情,这并不能真正解决我所困惑的问题。我完全有能力编写 SQL 代码并且我有一个不错的理解,但是这些概念让我感到困惑。我想知道所有这些链接之间的完整关系。
免责声明:这更像是我之前的问题的延续,但我还有更多问题要问,如果我只是编辑旧帖子等,我不知道 StackOverflow 是否会发出通知
解决方案
SQL 是关系数据库查询语言的行业标准规范。标准不是一个软件,它只是一个文档。
每个品牌的 RDBMS 都是 SQL 规范的实现。他们可以自由地以不同的方式编写代码。标准 SQL 语言文档没有规定实现细节。
SQL 还有另一个细微差别,即合规性级别:入门、中级和完全。一家公司可以实现 SQL 的入门级部分并声称他们支持它。他们可以从中级和完整级别中挑选他们想要实现的功能。
目前没有任何品牌的 SQL 数据库可以实现 SQL 规范的所有功能!
此外,每个品牌的 RDBMS 都提供了许多不在规范中的特性。每个实施 SQL 的供应商都有关于如何增强标准 SQL 以提供额外价值的想法。还有一些补充功能是 RDBMS 软件的一部分,但与 SQL 语言无关。
- 存储格式
- 加密
- 压缩
- DBA 工具
- GUI 管理控制台和查询构建器
- 用于 JDBC、ODBC、Ruby、Python、PHP、Perl、Go 等的客户端驱动程序。
- 日志记录
- 监控
- 调试
- 索引
没错——标准 SQL 规范没有提到索引,尽管每个品牌的 RDBMS 都支持某种索引语法。但是在规范中,索引是留给实现者的主题。
您可以将其与 C++ 之类的语言进行比较。C++ 语言也在 ISO 标准中进行了描述,但是每个 C++ 编译器都有许多额外的功能没有在标准中描述。图形 IDE、调试器、编译器优化、构建工具、嵌入式文档等等。
SQL 注入这个术语不完全准确吗?
SQL 注入技术适用于任何支持动态 SQL 的实现。也就是说,在运行时而不是在编译时解析 SQL。事实上,SQL 注入只是一种更广泛类型的安全问题(称为代码注入)的特例。这适用于甚至不是 SQL 的语言。任何可以在运行时解析和执行代码的东西,比如eval()
.
人们应该在简历上写 SQL,还是总是写 MySQL、Oracle 等细节?
是的当然。使用 RDBMS 的人应该在他们的简历或简历中列出他们的经验时具体说明他们有过哪些经验。就像汽车修理工应该清楚他们有维修过哪些品牌的汽车一样。毫无疑问,他们的技能是可以转移的,这使他们能够在需要时快速学习一个新品牌。
这么多宣传教 SQL 的网站实际上教的是什么版本/DBMS?
这取决于网站。您可以找到包含任何主要品牌的 RDBMS 教程的站点。你得问问他们。我预计最常见的是 Oracle、Microsoft SQL Server 和 MySQL。培训网站自然希望吸引最大的潜在客户群,而这些是最受欢迎的 RDBMS 产品。
推荐阅读
- python - 满足某个关键字后匹配值的正则表达式
- javascript - [Vue 警告]:避免使用非原始值作为键,而是使用字符串/数字值
- variables - 将项目文件夹中 .tfvars 文件中的 terraform 变量值传递给模块
- java - Amazon Corretto 8 32 位
- google-drive-api - 获取指定目录中特定 mimetype 的文件列表
- google-maps - “未定义”不是加载地图上的对象
- node.js - 里面没有内容
使用命令“node app.js”在浏览器中的元素 - java - Java JAXB 2.0 版本
- javascript - Mapbox 存储定位器、列表上的编号项目并匹配数字作为地图上的标记
- apache-spark - Spark 中的 GroupByKey 与 Join 性能