首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解下面提到的SQL查询中的ORDER子句?

如何理解下面提到的SQL查询中的ORDER子句?
EN

Stack Overflow用户
提问于 2019-04-07 13:51:52
回答 7查看 11.4K关注 0票数 0

我在执行一项任务时,没有正确地执行这个SQL查询。问题是:

不包括0.00美元,最低双周高工资率是多少(请在回答中包括美元符号和小数点)?

我所做的:

代码语言:javascript
复制
Select 
MIN(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE MIN(Biweekly_high_rate)>0;

但这给了我0的答案。而0不是正确的答案,然后我看了这个解。我不明白最后的解决方案

代码语言:javascript
复制
Select Biweekly_high_Rate
From salary_range_by_job_classification
ORDER BY LENGTH(Biweekly_high_Rate) ASC, Biweekly_high_Rate ASC;

我怎样才能通过陈述来理解订单?

EN

回答 7

Stack Overflow用户

发布于 2019-08-23 11:35:47

以下内容也应有效:

代码语言:javascript
复制
SELECT
MIN(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE Biweekly_High_Rate <> '$0.00'
ORDER BY Biweekly_High_Rate ASC;

您正在选择min Biweekly_high_Rate FROM表,使用WHERE <> '$0.00'排除等于零的值。

那么您就是ORDERING by Biweekly_High_Rate,以获得第一个值的正确性。

票数 1
EN

Stack Overflow用户

发布于 2019-04-07 14:24:26

我可以推断biweekly_high_rate是一个数字,但是列被定义为一个字符串。这不是很好的数据库设计,因为字符串与数字的排序不一样。请考虑下列数字及其适当的顺序:

代码语言:javascript
复制
Numeric ordering:        Alphabetical ordering:
2                        11
11                       110
12                       12
110                      2

处理这个问题的一种方法是首先对长度为1的所有字符串进行排序,然后对长度为2的所有字符串进行排序,然后对长度为3的所有字符串进行排序,以此类推。然后在每一组中打破领带,按字母顺序排序。首先根据长度排序,然后按值排序的解决方案实现了这一点。

但是,如果作者使用数据的方式是这样的话,将列定义为数字而不是字符串会更明智。它还具有其他优点,例如允许列上索引来优化排序。将数字存储为数字而不是字符串也需要更少的存储空间。

令人费解的是,第二个查询声称是一个解决方案,因为它不排除0.00值,也没有找到最小值。我会在办公时间和老师讨论这个问题,并问为什么会认为这是解决方案。

列是否使用美元符号来存储像'$0.00'这样的字符串?这也不是传统的数据库设计,因为货币格式不应该存储在数据库中。

您的第一个问题实际上更接近于我所给出的答案。但不能在WHERE子句中使用MIN()。像MIN()这样的聚合函数需要在行组上工作,但是WHERE子句只适用于逐行工作。

这样做可能会奏效:

代码语言:javascript
复制
Select 
MIN(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE Biweekly_high_rate>0;

但这仍然是在假设biweekly_high_rate应该是一个数值。

票数 0
EN

Stack Overflow用户

发布于 2019-04-07 14:41:28

代码语言:javascript
复制
Select Biweekly_high_Rate
From salary_range_by_job_classification
ORDER BY LENGTH(Biweekly_high_Rate) ASC, Biweekly_high_Rate ASC;

为了澄清您要求的内容,并详细说明Bill提到的列应该是数字基础,而不是字符串,顺序基本是采用双排序。

首先想一想得到一个人的名单,然后你想让他们按姓氏按字母顺序排列,然后按名字排列。我们认为这很简单--所有的姓氏按字母顺序排列,然后是所有的名字。但是,如果你有5个姓史密斯,会怎样呢?第二个排序是按名字排序的。

代码语言:javascript
复制
Jones Gary
…
Smith, Adam
Smith, Betty
Smith, Joe
Smith, Nancy
Smith, Veronica
…
Walker, Tim

因此,如果列出多个字段,则order对第一个字段进行主要排序。然后,一旦对所有这些进行排序,在该级别的每个级别中,次要排序就是下一个排序,等等,您可能会有一个带有3、4或更多列的顺序。

现在,回到你的例子。正如Bill提到的,双周高利率的数据似乎是一个字符串值。因此,按长度排序(Biweekly_Hi_Rate) ASC意味着按照上升顺序(因此ASC vs DESCending)对字符串表示的长度进行第一排序。在第一个级别排序之后,然后按照双周hi比率本身进行排序。

因此,让我们以下面的基于字符串的速率和这些字符串的隐含长度()为例。

代码语言:javascript
复制
BiWeeklyHiRate
13
5
11
9
14
2
10

同样的顺序,但只是显示长度。

代码语言:javascript
复制
LENGTH of string    BiWeeklyHiRate
2                   13
1                   5
2                   11
1                   9
2                   14
1                   2
2                   10

现在,如果只是按双周的长度()排序。请注意,每周利率有所有的单长度利率,然后所有的2位数利率次之。但请注意,在每段共同的长度内,每周费率没有排序。

代码语言:javascript
复制
LENGTH of string    BiWeeklyHiRate
1                   5
1                   9
1                   2
2                   13
2                   11
2                   14
2                   10

所以,现在,第二种速率被应用到

代码语言:javascript
复制
LENGTH of string    BiWeeklyHiRate
1                   2
1                   5
1                   9
2                   10
2                   11
2                   13
2                   14
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55559684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档