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

时间:2019-04-07 13:51:53

标签: sql

我正在做一个分配,但我没有正确执行此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语句?

6 个答案:

答案 0 :(得分:1)

以下内容也应工作:

SELECT
MIN(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE Biweekly_High_Rate <> '$0.00'
ORDER BY Biweekly_High_Rate ASC;

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

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

答案 1 :(得分: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应该是一个数值。

答案 2 :(得分:0)

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

为弄清您的要求,并在Bill提到的有关该列的内容上扩展,应以NUMERIC为基础,而不是以字符串为基础,ORDER BY基本上采用了双精度排序。

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

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

因此,如果列出多个字段,则按第一个字段的主要排序进行排序。然后,对所有这些元素进行排序(在该级别的每个元素之内),然后是第二个排序,依此类推,您可能会有3、4甚至更多列的排序。

现在,回到您的示例。正如Bill所提到的,它以双周高利率出现在您的数据中是一个字符串值。因此,LENGTH(Biweekly_Hi_Rate)ASC的排序意味着首先按照字符串表示的长度按升序排序(因此,ASC与DESCending)。在进行第一级排序之后,然后按两周一次的高利率对其进行排序。

因此,让我们看下面基于字符串的速率和这些字符串的隐含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

因此,现在应用第二种费率来给出

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

答案 3 :(得分:0)

这将起作用,因为我们正在提供条件,WHERE NOT Biweekly_high_Rate =“ $ 0.00”

Select 
min(Biweekly_high_Rate)
From salary_range_by_job_classification
WHERE NOT Biweekly_high_Rate = "$0.00"

答案 4 :(得分:0)

Select  min(Biweekly_high_Rate) 
From salary_range_by_job_classification 
WHERE Biweekly_High_Rate <> '$0.00' and LENGTH(Biweekly_high_Rate)<7

我认为这是获得 15.00 美元的简单方法,但 coursera 中的真正答案是 100.00 美元,我对此一无所知

答案 5 :(得分:-2)

SELECT
min(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE NOT Biweekly_high_Rate LIKE '$0.00'

该列存储带$符号的字符串,例如“ $ 0.00”吗?这也不是传统的数据库设计,因为货币格式不应该存储在数据库中。

我要说的是,我在Coursera中经历了来自UCDAVIS的SQL for DS的相同分配,并且由于上述错误,“ =”运算符在那里不起作用,因此请使用LIKE运算符。