mysql查询中的“where(n)”究竟是什么意思

时间:2015-09-22 10:23:44

标签: mysql sql

我看过一个查询,在表格中找到第n个最高薪水;

SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
                FROM one one2
                WHERE one2.salary >= one1.salary
              )

可以解释这是如何工作的?什么是"WHERE(n)"这里的意思

3 个答案:

答案 0 :(得分:1)

它被称为row constructor

对于您的案例(scalar subquery),括号是多余的,您只能使用:

SELECT *
FROM one one1
WHERE  n  = ( SELECT COUNT( one2.salary )
               FROM one one2
               WHERE one2.salary >= one1.salary
             )

但是当你需要比较多个值时它很有用:

SELECT *
FROM t1
WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);

答案 1 :(得分:1)

编写查询时,对所有列使用表别名非常有用:

SELECT one1.*
FROM one one1
WHERE 2 = (SELECT COUNT( one2.salary )
           FROM one one2
           WHERE one2.salary >= one1.salary
          );

这是做什么的?对于one1中的每一行,子查询计算的薪水大于或大于该行的行数。

对于具有最大薪水的行,子查询返回的计数是具有最大值的行数。如果我们假设工资值不同,那么这就提供了排名。当值为2时,我们得到第二大值。

但是,您可能无法获得值“2” - 例如,如果三行绑定最大值。那么最高薪水的价值将是“3”。你可能想要“1”,所以更好的结构是:

然而,这种假设并非总是如此。因此,编写此构造的更好方法是:

SELECT one1.*
FROM one one1
WHERE 2 = (SELECT 1 + COUNT( one2.salary )
           FROM one one2
           WHERE one2.salary > one1.salary
          );

以上等同于ANSI标准rank()功能。通常,你真的想知道第二高的不同的薪水(忽略关系)。这是ANSI标准dense_rank()函数,使用以下函数实现:

SELECT one1.*
FROM one one1
WHERE 2 = (SELECT 1 + COUNT(DISTINCT one2.salary )
           FROM one one2
           WHERE one2.salary > one1.salary
          );

答案 2 :(得分:0)

但是当你需要比较多个值时它很有用:

SELECT * 从t1 WHERE(col1,col2)=(SELECT col3,col4 FROM t2 WHERE id = 10);