zoukankan      html  css  js  c++  java
  • [LeetCode]Sql系列

    题目1

    Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
    
    +----+-------+--------+--------------+
    | Id | Name  | Salary | DepartmentId |
    +----+-------+--------+--------------+
    | 1  | Joe   | 70000  | 1            |
    | 2  | Henry | 80000  | 2            |
    | 3  | Sam   | 60000  | 2            |
    | 4  | Max   | 90000  | 1            |
    +----+-------+--------+--------------+
    Department 表包含公司所有部门的信息。
    
    +----+----------+
    | Id | Name     |
    +----+----------+
    | 1  | IT       |
    | 2  | Sales    |
    +----+----------+
    编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
    
    +------------+----------+--------+
    | Department | Employee | Salary |
    +------------+----------+--------+
    | IT         | Max      | 90000  |
    | Sales      | Henry    | 80000  |
    +------------+----------+--------+
    
    

    相关

    两个字段in的使用

    代码

    # Write your MySQL query statement below
    select Department.Name as Department, Employee.Name as Employee,Salary
    from Employee join Department
    on Employee.DepartmentId = Department.Id
    where (DepartmentId,Salary) in
    (
    select DepartmentId,Max(Salary) as Salary
    from Employee
    group by DepartmentId
    )
    

    题目2

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

    相关

    limit beg,len 的使用

    代码

    # Write your MySQL query statement below
    select (
    select distinct Salary 
    from employee
    order by Salary desc
    limit 1,1 
    ) as SecondHighestSalary
    

    题目3

    部门表 Department:
    
    +---------------+---------+
    | Column Name   | Type    |
    +---------------+---------+
    | id            | int     |
    | revenue       | int     |
    | month         | varchar |
    +---------------+---------+
    (id, month) 是表的联合主键。
    这个表格有关于每个部门每月收入的信息。
    月份(month)可以取下列值 ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]。
     
    
    编写一个 SQL 查询来重新格式化表,使得新的表中有一个部门 id 列和一些对应 每个月 的收入(revenue)列。
    
    查询结果格式如下面的示例所示:
    
    Department 表:
    +------+---------+-------+
    | id   | revenue | month |
    +------+---------+-------+
    | 1    | 8000    | Jan   |
    | 2    | 9000    | Jan   |
    | 3    | 10000   | Feb   |
    | 1    | 7000    | Feb   |
    | 1    | 6000    | Mar   |
    +------+---------+-------+
    
    查询得到的结果表:
    +------+-------------+-------------+-------------+-----+-------------+
    | id   | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
    +------+-------------+-------------+-------------+-----+-------------+
    | 1    | 8000        | 7000        | 6000        | ... | null        |
    | 2    | 9000        | null        | null        | ... | null        |
    | 3    | null        | 10000       | null        | ... | null        |
    +------+-------------+-------------+-------------+-----+-------------+
    
    注意,结果表有 13 列 (1个部门 id 列 + 12个月份的收入列)。
    

    相关

    题型:把数据行变为字段
    if(条件,true执行,false执行)

    代码

    # Write your MySQL query statement below
    select 
        id,
        max(if(month = 'Jan',revenue,null)) as Jan_Revenue,
        max(if(month = 'Feb',revenue,null)) as Feb_Revenue,
        max(if(month = 'Mar',revenue,null)) Mar_Revenue,
        max(if(month = 'Apr',revenue,null)) Apr_Revenue,
        max(if(month = 'May',revenue,null)) May_Revenue,
        max(if(month = 'Jun',revenue,null)) Jun_Revenue,
        max(if(month = 'Jul',revenue,null)) Jul_Revenue,
        max(if(month = 'Aug',revenue,null)) Aug_Revenue,
        max(if(month = 'Sep',revenue,null)) Sep_Revenue,
        max(if(month = 'Oct',revenue,null)) Oct_Revenue,
        max(if(month = 'Nov',revenue,null)) Nov_Revenue,
        max(if(month = 'Dec',revenue,null)) Dec_Revenue
    from Department
    group by id
    

    题目4

    Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId 。

    +----+-------+--------+--------------+
    | Id | Name | Salary | DepartmentId |
    +----+-------+--------+--------------+
    | 1 | Joe | 85000 | 1 |
    | 2 | Henry | 80000 | 2 |
    | 3 | Sam | 60000 | 2 |
    | 4 | Max | 90000 | 1 |
    | 5 | Janet | 69000 | 1 |
    | 6 | Randy | 85000 | 1 |
    | 7 | Will | 70000 | 1 |
    +----+-------+--------+--------------+
    Department 表包含公司所有部门的信息。

    +----+----------+
    | Id | Name |
    +----+----------+
    | 1 | IT |
    | 2 | Sales |
    +----+----------+
    编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回:

    +------------+----------+--------+
    | Department | Employee | Salary |
    +------------+----------+--------+
    | IT | Max | 90000 |
    | IT | Randy | 85000 |
    | IT | Joe | 85000 |
    | IT | Will | 70000 |
    | Sales | Henry | 80000 |
    | Sales | Sam | 60000 |
    +------------+----------+--------+
    解释:

    IT 部门中,Max 获得了最高的工资,Randy 和 Joe 都拿到了第二高的工资,Will 的工资排第三。销售部门(Sales)只有两名员工,Henry 的工资最高,Sam 的工资排第二。

    相关

    题型:分组前几
    方法:自连接,找到比它高的distinct的数目。

    题解

    # Write your MySQL query statement below
    select d.Name as Department, e1.Name as Employee, e1.Salary 
    from Employee e1 join Department d
    on e1.DepartmentId = d.Id
    where (
        select count(distinct e2.Salary)
        from Employee e2
        where e2.Salary > e1.Salary
        and e2.DepartmentId = e1.DepartmentId
    ) < 3
    

    题目5

    编写一个 SQL 查询来实现分数排名。
    
    如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
    
    +----+-------+
    | Id | Score |
    +----+-------+
    | 1  | 3.50  |
    | 2  | 3.65  |
    | 3  | 4.00  |
    | 4  | 3.85  |
    | 5  | 4.00  |
    | 6  | 3.65  |
    +----+-------+
    例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
    
    +-------+------+
    | Score | Rank |
    +-------+------+
    | 4.00  | 1    |
    | 4.00  | 1    |
    | 3.85  | 2    |
    | 3.65  | 3    |
    | 3.65  | 3    |
    | 3.50  | 4    |
    +-------+------+
    
    

    相关

    排第几,同题目4思路,找distinct比它高的。
    此外,查询结果作为字段。
    为区别关键字Rank 需要将别名'Rank'加引号

    代码

    # Write your MySQL query statement below
    select s1.Score,(
        select count(distinct s2.Score) 
        from Scores s2
        where s2.Score >= s1.Score)as 'Rank'
    from Scores s1
    order by s1.Score DESC
    
  • 相关阅读:
    各种有趣言论收集
    人类未来进化方向恶考
    mysql 列所有表行数
    恩,有那么一个人
    00后厉害哇
    。。。。
    放弃微博,继续回来写月经
    嘿,大家还好吗
    git
    require js
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12890428.html
Copyright © 2011-2022 走看看