我习惯了包括 SQL Server 在内的 Microsoft 技术。今天我遇到了一个问答,其中引用了 MySQL 文档中的以下段落:
标准 SQL会拒绝您的查询,因为您不能在聚合查询中选择不属于 GROUP BY 子句的非聚合字段。MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在未在 GROUP BY 中命名的每个非聚合列中的所有值对于每个组都相同时很有用。服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是 不确定的。
MySQL允许这样做是否违反了标准?如何?允许这样做的结果是什么?
PostgreSQL 中有一个旧的和不推荐使用的命令,它早于CREATE TABLE AS SELECT(CTAS)称为SELECT ... INTO .... FROM,它支持WITH子句/公共表表达式(CTE)。所以,例如,我可以做到这一点..
WITH w AS (
SELECT *
FROM ( VALUES (1) ) AS t(x)
)
SELECT *
INTO foo
FROM w;
Run Code Online (Sandbox Code Playgroud)
但是,我不能这样做..
WITH w AS (
SELECT *
FROM ( VALUES (1) ) AS t(x)
)
CREATE TABLE foo AS
SELECT * FROM w;
Run Code Online (Sandbox Code Playgroud)
或者,我得到
ERROR: syntax error at or near "CREATE"
LINE 5: CREATE TABLE foo AS
Run Code Online (Sandbox Code Playgroud)
我将如何使用标准化的 CTAS 语法来做到这一点。
这听起来像是一个过于简单的问题,但我发现找到正确的答案并不容易。
关于“什么是 sql 子句?”的问题 互联网上的大多数资源只是提供了一个条款列表并解释了它们的作用。
但我试图抽象地理解它是如何定义的。就像一个通用符号,它捕获了可以编写的所有类型的查询以及子句在其中的适应方式。
是否存在所有子句共有的属性?为什么 UNION 被称为运算符而 HAVING 是一个子句?
我理解以下之间的区别:
在 SQL Server 中,“存储过程”允许通过EXEC. 与使用SELECT该返回执行的任何其他函数相比,它提供了什么NULL?
当 PostgreSQL 获得存储过程时,它们会给我带来什么,规范中函数和存储过程之间的正式区别是什么?
postgresql stored-procedures terminology functions sql-standard
这个问题是不同的,但类似于这个寻找 SQL-86 的请求。
SQL 1989 已经快 30 岁了。这个规范在任何地方都可以免费使用。该标准没有维基页面之类的?
规范过去了
在研究问题时出现了对它的需求,SQL-1992 标准是否将命名标识符限制为 18 个字符?
根据 PostgreSQL 7.1 到 9.1(现在不支持),它ALIAS被列为保留字,至少对于 SQL-99。后来的版本不显示它 - 表明它已作为保留字删除。旧的 PostgreSQL 文档确实说“关键字的存在并不表示功能的存在”。当我见过的表或列使用别名时AS,但从未见过ALIAS。
SQL 关键字在哪里(或曾经)ALIAS使用过?它曾经在使用中还是只为将来使用而保留?
我想专注于 SQL 语言规范之一,以供学习和参考。哪个版本的 SQL 标准在 DBMS 中得到最广泛的支持,以便我可以将时间和精力集中在它上面?
如何在 PostgreSQL 类型中以降低的精度存储日期和时间值,并使它们表现为日期和/或时间值?
ISO 8601 允许精度降低的日期值。'1964', '1964-05', '1964-05-02' 都是值的有效表示,精度越来越高。Python 'datetime' 类型也允许以这种方式降低精度的值。
在原生日期类型中,日期的每个元素都必须存在,否则该值将被拒绝。将低于所需精度级别的元素设置为“00”也会失败。
=> SELECT CAST('1964-05-02' AS DATE);
date
------------
1964-05-02
(1 row)
=> SELECT CAST('1964-05' AS DATE);
ERROR: invalid input syntax for type date: "1964-05"
LINE 1: SELECT CAST('1964-05' AS DATE);
^
=> SELECT CAST('1964' AS DATE);
ERROR: invalid input syntax for type date: "1964"
LINE 1: SELECT CAST('1964' AS DATE);
^
=> SELECT CAST('1964-00-00' AS DATE);
ERROR: date/time field value out of range: …Run Code Online (Sandbox Code Playgroud) PostgreSQL 支持DOMAIN规范,来自 SQL 2011 工作草案规范,
域是命名的用户定义对象,可以在某些可以指定数据类型的地方将其指定为数据类型的替代。域由数据类型、可能是默认选项和零个或多个(域)约束组成。
这使我们能够做一些非常酷的事情,例如通过不区分大小写的文本类型为电子邮件实现HTML5 规范的域。它确保所有访问数据库的客户端都对插入的数据进行完整性检查。
CREATE DOMAIN email AS citext
CHECK ( value ~ '^[a-zA-Z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$' );
Run Code Online (Sandbox Code Playgroud)
SQL Server 是否支持触发器系统之外的任何此类功能?
在开发解决方案的原型时,通常还没有确定技术,并且可能与最终产品中使用的技术不同。
在这种情况下,我倾向于使用 Microsoft SQL Server 编写尽可能标准的查询,以简化最终迁移到另一台服务器的过程。
是否有一种方法或一些已知的做法可以直接在 SQL Server 中或通过SQL Server Management Studio (SSMS)强制使用标准 SQL over T-SQL 方言?
sql-standard ×10
postgresql ×4
datatypes ×2
sql-server ×2
ctas ×1
cte ×1
domain ×1
functions ×1
group-by ×1
migration ×1
mysql ×1
sql-clr ×1
syntax ×1
terminology ×1
timestamp ×1