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

问题描述 投票:0回答:2

我正在进行一项任务,我没有得到正确的SQL查询。问题是:

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

我做了什么:

Select 
MIN(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE MIN(Biweekly_high_rate)>0;

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

Select Biweekly_high_Rate
From salary_range_by_job_classification
ORDER BY LENGTH(Biweekly_high_Rate) ASC, Biweekly_high_Rate ASC;

我如何理解ORDER BY语句?

sql
2个回答
0
投票

我推断biweekly_high_rate是一个数字,但该列被定义为一个字符串。这不是好的数据库设计,因为字符串的排序与数字不同。考虑以下数字及其正确的顺序:

Numeric ordering:        Alphabetical ordering:
2                        11
11                       110
12                       12
110                      2

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

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

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

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

你的第一个查询实际上更接近我给出的答案。除非您不能在WHERE子句中使用MIN()。像MIN()这样的聚合函数需要处理行组,但WHERE子句只能逐行工作。

这可能有效:

Select 
MIN(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE Biweekly_high_rate>0;

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


0
投票
Select Biweekly_high_Rate
From salary_range_by_job_classification
ORDER BY LENGTH(Biweekly_high_Rate) ASC, Biweekly_high_Rate ASC;

为了澄清你的要求,并扩展比尔提到的关于列的内容应该是NUMERIC基础,而不是字符串,ORDER BY基本上应用了双重排序。

首先考虑获取人员列表,并且您希望按姓氏按字母顺序排序,然后是名字。我们首先按字母顺序考虑这个相当简单的所有姓氏,然后是所有名字。但如果你有5个姓名史密斯,会发生什么。次要排序是名字。

Jones Gary
…
Smith, Adam
Smith, Betty
Smith, Joe
Smith, Nancy
Smith, Veronica
…
Walker, Tim

因此,如果列出多个字段的顺序,则在第一个字段上进行主要排序。然后,一旦对所有这些进行了排序,其中每个都在该级别进行排序,次要排序是下一个,依此类推,您可能有3个,4个甚至更多列的订单。

现在,回到你的例子。正如比尔提到的那样,它显示你的双周高速率数据是一个字符串值。因此,LENGTH(Biweekly_Hi_Rate)ASC的排序意味着FIRST按字符串表示的升序排序(因此ASC vs DESCending)。在第一级排序之后,然后按两周一次的比率排序。

因此,让我们采用以下基于STRING的速率示例和这些字符串的隐含LENGTH()。

BiWeeklyHiRate
13
5
11
9
14
2
10

相同的订单,但只显示长度。

LENGTH of string    BiWeeklyHiRate
2                   13
1                   5
2                   11
1                   9
2                   14
1                   2
2                   10

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

LENGTH of string    BiWeeklyHiRate
1                   5
1                   9
1                   2
2                   13
2                   11
2                   14
2                   10

所以现在,SECONDARY类型的费率适用于给予

LENGTH of string    BiWeeklyHiRate
1                   2
1                   5
1                   9
2                   10
2                   11
2                   13
2                   14
© www.soinside.com 2019 - 2024. All rights reserved.