【问题标题】:MySQL - How to select Minimum AND Maximum in one (UNION) QueryMySQL - 如何在一个(UNION)查询中选择最小值和最大值
【发布时间】:2019-01-29 22:44:13
【问题描述】:

谁能告诉我如何使用 MIN 和 MAX 以及 UNION 关键字从表中选择最小值和最大值。

我尝试使用:

SELECT ename, MIN(sal)
FROM emp
UNION
SELECT ename, MAX(sal)
FROM emp;

但它只显示与 MIN 相同的名称,例如:

smith | 800
smith | 5000

需要:

smith | 800
king  | 5000

【问题讨论】:

  • 你如何处理关系(即两个人的最低工资相同)
  • 我猜这是在 mysql 上,因为缺少 group by 会在许多数据库上被标记为错误,而 mysql 将执行您所看到的行为。
  • 您在两个查询中忘记了 GROUP BY(另外,您可能需要 UNION ALL 而不是 UNION,否则在 max=min 的情况下您只会得到 1 行)

标签: mysql select union max min


【解决方案1】:
SELECT ename, sal
FROM EMP
WHERE sal = (SELECT MIN(sal) FROM EMP)
UNION
SELECT ename, sal
FROM EMP
WHERE sal = (SELECT MAX(sal) FROM EMP)

【讨论】:

  • 如果有两个工资的最大值或最小值相同,会发生什么?
【解决方案2】:

怎么样:

SELECT ename, sal
FROM emp
ORDER BY sal ASC
LIMIT 1
UNION
SELECT ename, sal
FROM emp
ORDER BY sal DESC
LIMIT 1

【讨论】:

  • 我认为这是 oracle(是 oracle 数据库示例模式)。限制是一个 MySQL 关键字
  • 也许,但标签上写着 mysql;我是根据这个做出回应的。
  • 其实这个好像是别人编的。。。现在不知道该相信什么了!
【解决方案3】:

试试这个

select Name as Lowest,amt as salary
from emp 
join (select min(sal) as amt from emp) x on x.amt=emp.sal
union all
select Name ,amt as salary
from emp 
join (select max(sal) as amt from emp) x on x.amt=emp.sal

【讨论】:

    【解决方案4】:

    实际上并未对其进行测试,但这个总体思路应该可行:

    SELECT ename, sal FROM emp WHERE sal = (SELECT MIN(sal) FROM emp)
    UNION
    SELECT ename, sal FROM emp WHERE sal = (SELECT MAX(sal) FROM emp)
    

    请注意,如果有超过 1 行具有(相同)MIN 或 MAX 值,则这可以返回超过 2 行。如果 MIN 和 MAX 恰好来自同一行,它也可以只返回一行(您可以使用 UNION ALL 来避免这种情况)。

    顺便说一句,您的查询意味着:获取 MIN(sal),然后从 随机 行中获取 ename(对于 MAX 也是如此)。 在这两个 MIN和 MAX 情况下 MySQL 决定返回相同的随机行。

    但是,在 MySQL 以外的大多数数据库中,您甚至不能进行这种“随机”查询 - 您需要在 GROUP BY 中包含 ename

    【讨论】:

      【解决方案5】:

      如果您正在查找具有 min sal 的员工姓名,那么您的查询是:

      选择员工的姓名,她的sal 是所有员工的最小sal:

      Select name, sal from employees where sal = 
         (select min(sal) from employees)
      

      您可以将此查询联合到另一个查询以获得最大值。

      看看你的甲骨文作业。

      【讨论】:

        【解决方案6】:
        select Name, LifeExpectancy from (
        (select * from(
        SELECT Name, LifeExpectancy FROM country where LifeExpectancy > 0 ORDER BY LifeExpectancy ASC LIMIT 1
        )a)
        union
        (select * from(
        SELECT Name, LifeExpectancy FROM country where LifeExpectancy > 0 ORDER BY LifeExpectancy desc LIMIT 1
        )b)
        )c
        

        结果:

        +---------+----------------+ |姓名 |预期寿命 | +---------+----------------+ |赞比亚 | 37.2 | |安道尔 | 83.5 | +---------+----------------+

        【讨论】:

          【解决方案7】:

          select name,max(salary) from employee where silver not in(select max(salary) from employee);

          o/p:-amit 65000 Ex o/p:madhu 6500

          回答: 选择姓名,工资从员工那里工资=(从员工那里选择最大(工资),工资不在(从员工那里选择最大(工资)); o/p:马杜 6500

          【讨论】:

          • 为什么要发布一个非常古老的问题(已经有很多回复)的答案,然后感谢自己的答案?
          猜你喜欢
          • 2015-02-03
          • 2015-01-18
          • 2021-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-24
          • 1970-01-01
          相关资源
          最近更新 更多