初学者SQL部分:避免重复表达

pol*_*nts 10 sql where-clause

我是SQL的新手,但是让我们说在StackExchange数据资源管理器上,我只想按声誉列出前15位用户,我写了这样的东西:

SELECT TOP 15
  DisplayName, Id, Reputation, Reputation/1000 As RepInK
FROM
  Users
WHERE
  RepInK > 10
ORDER BY Reputation DESC
Run Code Online (Sandbox Code Playgroud)

目前这给出了一个Error: Invalid column name 'RepInK',我认为这是有道理的,因为RepInK它不是一个专栏Users.我可以通过说WHERE Reputation/1000 > 10,基本上重复公式来轻松解决这个问题.

所以问题是:

  • 我可以RepInKWHERE条款中实际使用"列" 吗?
    • 我是否可能需要使用此列创建虚拟表/视图,然后对其进行SELECT/WHERE查询?
  • 我可以命名一个表达式,例如Reputation/1000,所以我只需要在几个地方重复这些名称而不是公式吗?
    • 你把这个称作什么?替换宏?一个功能?存储过程?
  • 是否有SQL快速表,术语表,语言规范,我可以使用什么来快速获取语言的语法和语义?
    • 我明白有不同的"味道"?

Dan*_*llo 9

我真的可以在WHERE子句中使用RepInK"列"吗?

不,但您可以放心,您的数据库将评估(Reputation / 1000)一次,即使您在SELECT字段和WHERE子句中都使用它.

我是否需要使用此列创建虚拟表/视图,然后对其执行SELECT/WHERE查询?

是的,视图是简化复杂查询的一种选择.

我可以命名一个表达式,例如Reputation/1000,所以我只需要在几个地方重复这些名称而不是公式吗?

您可以创建一个用户定义的函数,您可以调用类似的函数convertToK,它将接收rep值作为参数并返回该参数除以1000.但是,对于像示例中的那种情况,这通常是不实际的.

是否有SQL快速表,术语表,语言规范,我可以使用什么来快速获取语言的语法和语义?

我建议练习.您可能想要开始关注Stack Overflow上的mysql标记,每天都会询问许多初学者问题.下载MySQL,当您认为存在一个问题时,请尝试寻找解决方案.我认为这将有助于您提高速度,以及对语言功能的认识.一开始没有必要发布答案,因为这里的主题有一些相当快的枪支,但通过一些练习我相信你能带回家一些点:)

我明白有不同的"味道"?

这些风格实际上是ANSI SQL的扩展.数据库供应商通常使用Transact-SQLPL/SQL等扩展来扩充SQL语言.


APC*_*APC 7

您可以简单地重写WHERE子句

where reputation > 10000
Run Code Online (Sandbox Code Playgroud)

这并不总是方便的.作为替代方案,您可以使用内联视图:

SELECT
  a.DisplayName, a.Id, a.Reputation, a.RepInK 
FROM 
   (
        SELECT  TOP 15  
          DisplayName, Id, Reputation, Reputation/1000 As RepInK 
        FROM 
          Users 
        ORDER BY Reputation DESC 
    ) a
WHERE 
  a.RepInK > 10 
Run Code Online (Sandbox Code Playgroud)