标签: ansi-sql

为什么SQL ANSI-92标准不比ANSI-89更好地采用?

在我所工作的每家公司,我发现人们仍然在ANSI-89标准中编写SQL查询:

select a.id, b.id, b.address_1
from person a, address b
where a.id = b.id
Run Code Online (Sandbox Code Playgroud)

而不是ANSI-92标准:

select a.id, b.id, b.address_1
from person a
inner join address b
on a.id = b.id
Run Code Online (Sandbox Code Playgroud)

对于这样一个非常简单的查询,可读性没有太大差异,但是对于大型查询,我发现将我的连接条件分组并列出表格可以更容易地查看我在连接中可能存在问题的位置,以及让我在WHERE子句中保留所有过滤功能.更不用说我觉得外连接比Oracle中的(+)语法更直观.

当我尝试向人们传播ANSI-92时,使用ANSI-92而不是ANSI-89有什么具体的性能优势吗?我会自己尝试,但是我们这里的Oracle设置不允许我们使用EXPLAIN PLAN - 不希望人们尝试优化他们的代码,是吗?

sql join ansi-92 ansi-sql

105
推荐指数
5
解决办法
4万
查看次数

为什么MySQL允许"分组"查询没有聚合函数?

惊喜 - 这是MySQL中完全有效的查询:

select X, Y from someTable group by X
Run Code Online (Sandbox Code Playgroud)

如果您在Oracle或SQL Server中尝试过此查询,则会收到自然错误消息:

Column 'Y' is invalid in the select list because it is not contained in 
either an aggregate function or the GROUP BY clause.
Run Code Online (Sandbox Code Playgroud)

那么MySQL如何确定每个X显示哪个Y?它只选了一个.据我所知,它只是挑选它找到的第一个Y. 理由是,如果Y既不是聚合函数也不是group by子句,那么在查询中指定"select Y"就没有意义.因此,我作为数据库引擎将返回我想要的任何内容,你会喜欢它.

甚至还有一个MySQL配置参数来关闭这种"松散". http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

本文甚至提到MySQL在这方面如何被批评为ANSI-SQL不兼容. http://www.oreillynet.com/databases/blog/2007/05/debunking_group_by_myths.html

我的问题是: 为什么 MySQL是这样设计的?打破ANSI-SQL的理由是什么?

mysql sql standards-compliance ansi-sql

59
推荐指数
2
解决办法
2万
查看次数

如何重写IS DISTINCT FROM并且不是DISTINCT FROM?

如何重写包含SQL实现中的标准IS DISTINCT FROMIS NOT DISTINCT FROM运算符的表达式,例如不支持它们的Microsoft SQL Server 2008R2?

sql t-sql sql-server ansi-sql sql-server-2008-r2

49
推荐指数
5
解决办法
1万
查看次数

为什么没有数据库完全支持ANSI或ISO SQL标准?

如果我正在设计炼油厂,我不希望来自不同供应商的材料不会以微妙但重要的方式符合公布的标准.来自一个供应商的管道,阀门和其他部件将带有符合ANSI标准的法兰和壁厚,以及来自任何其他供应商的相同部件.因此确保了互操作性和系统安全性.

那么为什么普通数据库如此挑剔他们所遵循的标准的哪些部分,以及为什么没有100%符合标准的系统脱颖而出?标准是否"破损",缺乏范围或难以设计?

结论是这样的; ANSI(或ISO)定义SQL标准的重点是什么?

编辑:公共数据库之间的实现差异列表

sql database standards database-design ansi-sql

46
推荐指数
6
解决办法
7849
查看次数

mysql - 报价数字与否?

例如 - 我从cli创建数据库和表并插入一些数据:

CREATE DATABASE testdb CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
USE testdb;
CREATE TABLE test (id INT, str VARCHAR(100)) TYPE=innodb CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
INSERT INTO test VALUES (9, 'some string');
Run Code Online (Sandbox Code Playgroud)

现在我可以这样做,这些例子确实有用(所以 - 引号不会影响它看起来的任何东西):

SELECT * FROM test WHERE id = '9';
INSERT INTO test VALUES ('11', 'some string');
Run Code Online (Sandbox Code Playgroud)

所以 - 在这些例子中,我通过在mysql中实际存储为INT 的字符串选择了一行,然后在一个INT列中插入了一个字符串.

我不太明白为什么它的工作方式与此相同.为什么允许将字符串插入INT列?

我可以将所有Mysql数据类型作为字符串插入吗?

这种行为是否适用于不同的RDBMS?

谢谢!

mysql sql ansi-sql

45
推荐指数
3
解决办法
4万
查看次数

ANSI SQL手册

任何人都可以推荐一个好的ANSI SQL参考手册?

当您需要基本或更深入的解释或示例时,我没有必要指一个教程,而是一个适当的参考文档来查找.

目前我正在使用W3Schools SQL教程SQL教程,但是我觉得它们"不够深入".

当然,每个主要的RDBMS制作人都会有一些针对他们自己的产品的参考手册,但他们往往有偏见,有时会使用专有扩展.

编辑:问题的目的是关注数据库引擎的共同点,即SQL根源.但理解这些差异也可能是一件好事 - 非常有趣.

sql reference manual ansi-sql

43
推荐指数
4
解决办法
4万
查看次数

CURRENT_TIMESTAMP和GETDATE()之间的区别

CURRENT_TIMESTAMPGETDATE()SQL Server有什么区别?

SELECT CURRENT_TIMESTAMP, GETDATE()
Run Code Online (Sandbox Code Playgroud)

sql-server ansi-sql

32
推荐指数
1
解决办法
2万
查看次数

SQL数据库之间的差异列表

大多数SQL数据库都遵循ANSI SQL标准,但是

  1. 标准是模糊的,留下一些区域可以解释(例如:NULLs应该如何处理不同的操作是模糊的)

  2. 有些供应商完全违反标准或仅缺乏标准定义的功能(例如:MySQL有标准与其实现之间的差异列表)

  3. 某些数据库的行为会有所不同,具体取决于它们的配置方式,但可以更改配置以使它们的行为方式相同(例如:Oracle默认情况下执行区分大小写的字符串比较,而SQL Server会使它们不区分大小写)

  4. 有些功能不是标准的一部分,但是不管怎样都由不同的RDBMS实现,虽然名称不同(例如:Oracle's LISTAGG= MySQL's GROUP_CONCAT)

当您尝试编写应该与多个数据库兼容的内容时,是否有一个包含全面的怪癖列表和陷阱的资源?

sql standards cross-platform ansi-sql

31
推荐指数
1
解决办法
1969
查看次数

是否有MYSQL LIMIT关键字的ANSI SQL替代品?

是否有MYSQL LIMIT关键字的ANSI SQL替代品?

LIMIT关键字限制SELECT返回的行数,例如:

SELECT * FROM People WHERE Age > 18 LIMIT 2;
Run Code Online (Sandbox Code Playgroud)

返回2行.

SELECT * FROM People WHERE Age > 18 LIMIT 10, 2;
Run Code Online (Sandbox Code Playgroud)

在前10后返回2行.

mysql database keyword ansi-sql

30
推荐指数
3
解决办法
2万
查看次数

27
推荐指数
5
解决办法
6万
查看次数