SQL - 非常人性化,但我不理解它背后的概念

时间:2017-07-20 13:03:00

标签: sql execution set-based

我似乎以错误的方式思考sql。我总是写一些不起作用的东西。

例如,我需要一个变量。所以我想:

DECLARE @CNT AS INT
SET @CNT = COUNT(DISTINCT database.schema.table.column)

为什么这不起作用......?我在这里使用完全限定的引用,所以我想要的值应该是清楚的。

DECLARE @CNT AS INT
SET @CNT = (SELECT COUNT(DISTINCT database.schema.table.column) FROM column)

这有效......但为什么我必须使用select?

是否所有内容都必须以DDL或DML语句之一开头?

其次: 我无法逐行调试,因为sql语句被视为一步。我可以调试的唯一方法是,如果我选择最里面的子查询并运行它,那么包括下一个外部子查询并运行它,依此类推。

是否有本地窗口?

我听说过基于集合的思维而不是迭代思维,我想即使对于函数式语言我仍然是迭代的......迭代只是从最里面的括号到最外面的括号,并应用于整个集合。但即使在这里我也遇到了麻烦,因为我不知道集合中的哪个值会导致错误。

对不起,如果这看起来像是散乱的......我想这只是反映了我的感受。我不知道如何从许多小组件构建一个大的存储过程......就像在vba中我可以调用另一个子例程并确保我需要的变量是全局的。

tldr:需要概念性基础/知道当我输入内容并点击F5时实际发生了什么

2 个答案:

答案 0 :(得分:5)

在问题#1上,您需要选择,因为这是SQL的工作原理。你已经给它起了一个名字,但是没有告诉它该如何处理这个名字(选择它,更新它,删除它?)只是说列名在语法上是不正确的。

在#2上,是的,SQL是声明性的,你不会告诉它做什么,你告诉它要什么返回。它将按照在特定时刻最有效的顺序检索数据,通常,您的子查询将是最后运行的,而不是第一个。

答案 1 :(得分:0)

是的,您必须先使用SELECT来获取该数据,然后再将其分配给变量。你也可以这样做

DECLARE @CNT AS INT
SELECT @CNT = COUNT(DISTINCT `column`) FROM database.schema.table