zoukankan      html  css  js  c++  java
  • 力扣数据库题目176第二高的薪水

    力扣数据库题目176第二高的薪水

    题目

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

    +----+--------+
    | Id | Salary |
    +----+--------+
    | 1 | 100 |
    | 2 | 200 |
    | 3 | 300 |
    +----+--------+
    例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

    +---------------------+
    | SecondHighestSalary |
    +---------------------+
    | 200 |
    +---------------------+

    来源:力扣(LeetCode)

    方案一

    SELECT salary SecondHighestSalary
    FROM (		
    	SELECT DISTINCT salary FROM test.employee 
        UNION ALL 
        SELECT NULL  
        UNION ALL 
    	SELECT NULL         
    ) t ORDER BY salary DESC LIMIT 1,1
    

    方案二

    SELECT salary SecondHighestSalary 
    FROM (		
    	SELECT salary,DENSE_RANK() OVER(ORDER BY salary DESC) num
        FROM test.employee 
        UNION ALL 
        SELECT NULL,2
        UNION ALL 
    	SELECT NULL,2    
    ) t
    WHERE num = 2
    LIMIT 1;
    

    方案三

    SELECT t.salary SecondHighestSalary
    FROM (
    	SELECT salary  
    	FROM test.employee 	
        WHERE salary < (
    		SELECT MAX(salary)
            FROM test.employee 
    	) 
        UNION ALL 
        SELECT NULL   
    ) t
    ORDER BY t.salary DESC LIMIT 1
    

    方案四

    SELECT t.salary SecondHighestSalary
    FROM (
    	SELECT salary  
    	FROM test.employee 	
        WHERE salary < ANY(
    		SELECT salary
            FROM test.employee 
    	) 
        UNION ALL 
        SELECT NULL   
    ) t
    ORDER BY t.salary DESC LIMIT 1
    

    方案五

    SELECT (SELECT salary 
    FROM (		
    	SELECT DISTINCT salary FROM test.employee        
    ) t ORDER BY salary DESC LIMIT 1,1)SecondHighestSalary
    

    方案六

    SELECT (SELECT salary 
    FROM (   
      SELECT salary,DENSE_RANK() OVER(ORDER BY salary DESC) num
      FROM test.employee 
    ) t
    WHERE num = 2
    LIMIT 1) SecondHighestSalary
    

    方案七

    SELECT (SELECT t.salary 
    FROM (
    	SELECT salary  
    	FROM test.employee 	
        WHERE salary < (
    		SELECT MAX(salary)
            FROM test.employee 
    	)  
    ) t
    ORDER BY t.salary DESC LIMIT 1) SecondHighestSalary
    

    方案八

    SELECT (SELECT t.salary 
    FROM (
    	SELECT salary  
    	FROM test.employee 	
        WHERE salary < ANY(
    		SELECT salary
            FROM test.employee 
    	) 
    ) t
    ORDER BY t.salary DESC LIMIT 1) SecondHighestSalary
    

    分析

    题目要求的结果是一行一列,并保证两个条件

    1、列别名SecondHighestSalary

    2、行至少一行NULL,为了维持这个问题

    前四个方案是制造出来一个NULL行,后四个方案是0行使用select ()子查询后造出NULL行

    为了保证条件2,废了很多事。

    方案一五使用distinct,二六使用的开窗,三七使用的子查询,四八使用的ANY

    建表

    CREATE TABLE `employee` (
      `id` int NOT NULL AUTO_INCREMENT,
      `salary` int NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  COLLATE=utf8mb4_0900_ai_ci;
    

    数据初始化

    INSERT INTO `test`.employee(`id`,`salary`)
    VALUES(1,100),(2,200),(3,300) 
    
  • 相关阅读:
    Java ConcurrentModificationException 异常分析与解决方案
    Kafka剖析(一):Kafka背景及架构介绍
    Linux下更改oracle客户端字符集和服务端字符集
    storm-kafka源码走读之KafkaSpout
    kafka系列之(3)——Coordinator与offset管理和Consumer Rebalance
    Kafka源码深度解析-序列7 -Consumer -coordinator协议与heartbeat实现原理
    apache kafka系列之在zookeeper中存储结构
    Java transient关键字使用小记
    Kafka设计解析(一)- Kafka背景及架构介绍
    JavaScript-如何获取页面元素对象,元素id
  • 原文地址:https://www.cnblogs.com/klarck/p/14085388.html
Copyright © 2011-2022 走看看