【问题标题】:MySQL select followed by a subqueryMySQL 选择后跟子查询
【发布时间】:2018-08-14 14:59:18
【问题描述】:

我稍微修改了我的问题以使其更清楚。
我发现了一个奇怪的select 语法here。这是this problem 的解决方案。有趣的代码是

SELECT
    (SELECT DISTINCT
            Salary
        FROM
            Employee
        ORDER BY Salary DESC
        LIMIT 1 OFFSET 1) AS SecondHighestSalary
;


select 后跟一个子查询。通常select 后面应该跟column 名称,如here 所示。
为了更好地理解 select 的用法,我在 Chrome 中测试了此处给出的示例:https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all。原始的SQL 语句是
SELECT customerId FROM Customers
它返回91 行。
我给它添加了一个外部select
select (SELECT customerId FROM Customers);
它只返回一行:第一行。
我不明白为什么它只检索一行而不是所有customerId
谁能解释一下?谢谢

【问题讨论】:

  • limit 1 返回单行
  • LIMIT 1 OFFSET 1 - 跳过第一行 (OFFSET 1),返回 1 行 (LIMIT 1)
  • 我能理解上面有趣的代码,以及limitoffset的意思,但是我不能理解
    1.为什么select后面是table而不是@ 987654344@ 名称,因为子查询应该返回一个表。
    2.为什么我在Chrome中测试的例子中select只选择了第一个row
  • 在这种情况下,超级查询什么都不做。
  • 它做了一些事情。如果您删除外部select,则所有customerId 都会被检索到。共有91customerIds

标签: mysql select subquery


【解决方案1】:

使用和不使用超级查询的唯一区别是,如果少于两行,子查询将不返回任何结果...

CREATE TABLE employee
(employee_id SERIAL PRIMARY KEY
,salary INT NOT NULL
);

INSERT INTO employee VALUES
(1,100);

 SELECT DISTINCT
             Salary
         FROM
             Employee
         ORDER BY Salary DESC
         LIMIT 1 OFFSET 1;
Empty set (0.01 sec)

 SELECT
     (SELECT DISTINCT
             Salary
         FROM
             Employee
         ORDER BY Salary DESC
         LIMIT 1 OFFSET 1) AS SecondHighestSalary
 ;
+---------------------+
| SecondHighestSalary |
+---------------------+
|                NULL |
+---------------------+

【讨论】:

  • 感谢您的回复。我可以理解你在这里给出的例子。外部select 有所作为。我的问题是:如果子查询返回一列,多行,那么为什么外部选择只显示第一行,正如我在 customerId 示例中提到的那样。
  • @nlite 您指的是一个完全不同的查询,您还没有与我们分享,所以我不知道我们可以如何提供帮助。仔细看我的回答;它非常彻底,没有指向外部信息的链接。看看你是否可以相应地修改你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多