我一直教导将格式化数据存储在表格中是不正确的。例子包括:
+----------------+----+ | 数据 | 好的 | +----------------+----+ | 0370101234 | ? | +----------------+----+ | 03 7010 1234 | | +----------------+----+ | (03) 7010 1234 | | +----------------+----+
(为什么不支持表格?!)
数据是一个澳大利亚电话号码,通常有 10 位数字,包括区号。
包括格式间距或字符会引入歧义,因此更难排序或搜索。
问题是:标准或关系理论中有没有涵盖这个问题的内容?
编辑
这不是关于电话号码的问题。我用应该以最简单的形式存储的数据说明了一个点,即使它是用格式化字符显示的。
其他示例包括$显然从未与货币值一起存储的符号,以及有其自身问题的千位分隔符。
这可能是一个简单的问题,但我想检查回滚事务的机制。
据我了解,步骤如下:
BEGIN TRANSACTION (或同等学历)COMMIT 或者 ROLLBACK据我所知,如果其中一个 SQL 语句失败,例如无效INSERT或UPDATE.
这表明上述过程,直到提交可以在手动输入的语句集合中。
但是,我在哪个阶段做出回滚的决定?这是否表明ROLLBACK在程序中会发生更多的事情?换句话说,有人会手动回滚吗?
通过过程,我不一定指的是存储过程。我想某些应用程序可能会做同样的事情。
我认为这个问题一般适用于任何 SQL 数据库(当然,前提是它支持事务)。
如何在 SQL Server 中创建和使用准备好的语句?
在 PostgreSQL 中,您可以执行以下操作:
PREPARE prepared (varchar, varchar, etc) AS
INSERT INTO table(field,field,etc)
VALUES ($1,$2,etc);
EXECUTE (value,value,etc);
Run Code Online (Sandbox Code Playgroud)
在 MySQL 中类似的东西。
我在 SQL Server 中找不到任何示例。我已经看到了一些使用功能的例子,但我不认为这是同样的事情。
谢谢
我们都知道一个简单的语句例如:
SELECT * FROM stuff;
Run Code Online (Sandbox Code Playgroud)
应该不会产生有序的结果。然而,当我试图证明这一点时,它总是以主键顺序出现。
此外还有一个声明,例如:
SELECT thing,whatever FROM stuff
GROUP BY thing,whatever;
Run Code Online (Sandbox Code Playgroud)
似乎总是按GROUP BY子句中的最后一个字段对事物进行排序,这根本没有帮助。
问题是,在什么情况下 SQL SERVER 会在未询问的情况下对结果进行排序,我该怎么做才能阻止这种情况?
我试图向我的学生证明,除非指定,否则顺序是不确定的,但这对我的情况没有帮助。
我承认我正在处理一小组样本数据。
谢谢
据我了解,两个表之间的一对一关系意味着一个表中的每一行与另一个表中的一行完全匹配。
\n\n其有用的原因有很多,例如虚拟地向表中添加列而不实际更改它。
\n\n上面的描述表明这种关系是对称的:任一表中的行与另一个表中的行匹配。
\n\n如果主键也是另一个主键的外键,那么这很容易完成:
\n\nCREATE TABLE stuff (\n id INT PRIMARY KEY REFERENCES more(id),\n data VARCHAR(255)\n);\n\nCREATE TABLE more (\n id INT PRIMARY KEY REFERENCES stuff(id),\n data VARCHAR(255)\n);\nRun Code Online (Sandbox Code Playgroud)\n\n我在这里可以看到一个逻辑问题:当另一个表中没有\xe2\x80\x99t 行匹配时,如何向一个表添加一行?
\n\n更轻松的版本是一对零或一的关系,我更喜欢将其称为一对可能的关系。如果一个表引用另一个表,则很容易实现这一点,但反之则不然:
\n\nCREATE TABLE stuff (\n id INT PRIMARY KEY, -- does not reference the more table\n data VARCHAR(255)\n);\nRun Code Online (Sandbox Code Playgroud)\n\n关系仍然是主键之间的关系,但只有一个方向。这在逻辑上更容易,并且可以用于实现可选列,而无需陷入有关NULLs 的使用的争论。
问题是:
\n\n我知道NULLIF比较两个值并NULL在匹配时返回的函数。
是否有一个函数可以比较两个值并NULL在它们不匹配时返回?即过滤掉其他值。
我知道我可以使用CASE以下方法做类似的事情:
CASE column WHEN value THEN 1 END
Run Code Online (Sandbox Code Playgroud)
我也知道我可以写一个函数。
也许有一个NULLIF我不知道的微妙使用技巧。
我认为NULLIF是通用的。我正在寻找一个通用的解决方案,以便它可以应用于任何标准数据库。
创建用户定义的表函数或用户定义的过程时,可以按命名调用函数或过程。
但是,用户定义的标量函数要求您使用架构调用它:
select dbo.doit(data);
Run Code Online (Sandbox Code Playgroud)
我在其他 DBMS 中没有遇到过这种行为。为什么标量函数是这种情况,而其他函数则不然?
这不仅仅是病态的好奇心,而且我知道问为什么Microsoft 产品是无效的。
如果存在标量函数需要模式而不是其他模式的技术原因,那么值得了解。这不是其他 DBMS 的行为,但可能有技术原因导致这里出现这种情况。
我花了很长时间寻找这个,但收到的信息很混乱。
\n在其他 DBMS(在 SQLite、Oracle、MariaDB、MSSQL 中测试)中,我可以使用以下子句覆盖默认排序顺序COLLATE:
SELECT *\nFROM orderby\nORDER BY string COLLATE \xe2\x80\xa6 ;\n\n-- SQLite: BINARY | NOCASE\n-- MariaDB: utf8mb4_bin | utf8mb4_general_ci\n-- Oracle: BINARY | BINARY_CI\n-- MSSQL: Latin1_General_BIN | Latin1_General_CI_AS\nRun Code Online (Sandbox Code Playgroud)\n我仔细阅读了文档并进行了全面的搜索,但我无法\xe2\x80\x99找到任何对于 PostgreSQL 如此简单的东西。
\n是否有一个COLLATE子句值可以对大小写不敏感进行排序?
我知道有很多关于区分大小写的问题,但是(a)大多数问题都是旧问题,并且(b)我没有看到与该COLLATE条款相关的问题。
FWIW,我正在 PostgreSQL 11.8 上进行测试。我在http://sqlfiddle.com/#!17/05cab/1上有一个测试小提琴,但它\xe2\x80\x99s 仅适用于 PostgreSQL 9.6。
\nMySQL/MariaDB 和 SQL Server 默认不区分大小写,这在对大多数文本进行排序时肯定有意义。Oracle 和 SQLite 默认区分大小写,但对于不区分大小写的排序有一个相对简单的解决方案。我的数据库的默认排序规则是en_US.UTF-8. 我\xe2\x80\x99m 试图填补这里的一些空白。
是否有自动编号列的ANSI标准。
目前,我们有一个选择SERIAL,AUTOINCREMENT,AUTO_INCREMENT,IDENTITY()和良好的老NEXTVAL()等等。
我在某处读到有一个新标准IDENTITY,我知道 Oracle 最近实施了该标准。我知道 Oracle 并不是标准的硬道理。
如果有一个标准,那么它是一个很长的时间来。
在 SQL Server 中,是否可以在计算上创建索引?
以下并没有为我工作:
CREATE INDEX customermonth ON customers(month(dob));
Run Code Online (Sandbox Code Playgroud)
一些数据库允许我这样做。在 SQL Server 中执行此操作有技巧吗?
sql-server ×4
order-by ×2
sql-standard ×2
collation ×1
foreign-key ×1
functions ×1
group-by ×1
index ×1
null ×1
postgresql ×1
rollback ×1
schema ×1
select ×1
transaction ×1