当前位置: 首页 > news >正文

SQL练习——day01

力扣——SQL练习总结

DENSE_RANK()窗口函数

  • 这是排名函数的一种,它在处理相同值时,会给相同的值分配相同的排名,并且后续的排名不会跳过。比如有三个分数并列第一,那么它们的排名都是 1,接下来的分数排名就是 2,不会出现排名 3。

  • select S.score,dense_rank() over (order by s.score desc) as 'rank'
    from Scores S;
    

DISTINCT 是一个关键字,用于从查询结果中去除重复的行,确保返回的每一行数据都是唯一的

  • SELECT DISTINCT name, age
    FROM Students;
    

ROW_NUMBER() 是 SQL 中的窗口函数,用于为结果集中的每一行生成唯一的序号。

  • ROW_NUMBER() OVER ([PARTITION BY 分组字段]ORDER BY 排序字段 [ASC|DESC]
    ) AS 别名
    

SIGNED 是 MySQL 特有的数据类型关键字,表示 “有符号整数”(即可以存储正数、负数和零)

分组查询

  • #错误示范!!!!!!
    select 姓名
    from 学生表
    group by 姓名
    where count(姓名) > 1;#聚合函数(count),where字句无法与聚合函数一起使用#正确写法
    select 姓名
    from 学生表
    group by 姓名
    having count(姓名) > 1;
    

sql连接多表查询

  • select a.name as Customers
    from Customers a left join Orders b
    on a.id = b.customerID
    --------------------------------#在表里的数据
    where b.customerID is null;
    --------------------------------#不在表里的数据
    

部门工资最高员工

  • # Write your MySQL query statement below
    select
    b.name as department,
    a.name as Employee,
    a.salary
    from Employee a
    left join Department b
    on a.departmentId = b.id 
    where (a.departmentId,salary)
    in (select departmentId,max(salary)from Employeegroup by departmentId
    );
    

WHERE 3 > (子查询) 是一种条件筛选语法

  • 它的核心逻辑是:如果子查询返回的值小于 3,则当前行符合条件,会被保留在结果中

练习题

统计某公司中,不同部门中的的工资最高的三个人

#Employee 表:
+----+-------+--------+--------------+
| 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 |
+----+-------+
#输出: 
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| IT         | Joe      | 85000  |
| IT         | Randy    | 85000  |
| IT         | Will     | 70000  |
| Sales      | Henry    | 80000  |
| Sales      | Sam      | 60000  |
+------------+----------+--------+
#解释:
在IT部门:
- Max的工资最高
- 兰迪和乔都赚取第二高的独特的薪水
- 威尔的薪水是第三高的#在销售部:
- 亨利的工资最高
- 山姆的薪水第二高
- 没有第三高的工资,因为只有两名员工

拆解

  • 公司里前 3 高的薪水意味着有不超过 3 个工资比这些值大

  • select e1.Name as 'Employee', e1.Salary
    from Employee e1
    where 3 >
    (select count(distinct e2.Salary)from Employee e2where e2.Salary > e1.Salary
    );
    --------------------------------------------------------------
    #在这个代码里,我们统计了有多少人的工资比 e1.Salary 高,所以样例的输出应该如下所示
    | Employee | Salary |
    |----------|--------|
    | Henry    | 80000  |
    | Max      | 90000  |
    | Randy    | 85000  |
    
  • 然后,我们需要把表 Employee 和表 Department 连接来获得部门信息

    • SELECTd.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
      FROMEmployee e1JOINDepartment d ON e1.DepartmentId = d.Id
      WHERE3 > (SELECTCOUNT(DISTINCT e2.Salary)FROMEmployee e2WHEREe2.Salary > e1.SalaryAND e1.DepartmentId = e2.DepartmentId)
      ;
      ---------------------------------------------------------
      | Department | Employee | Salary |
      |------------|----------|--------|
      | IT         | Joe      | 70000  |
      | Sales      | Henry    | 80000  |
      | Sales      | Sam      | 60000  |
      | IT         | Max      | 90000  |
      | IT         | Randy    | 85000  |

相关文章:

  • 告别碎片化!MCP 带来 AI Agent 开发生态的革命性突破
  • Makefile 详解
  • 电商热销榜的5种实现方案
  • 平替BioLegend品牌-Elabscience PE/Cyanine5.5标记CD11b抗体,高性价比解决方案!
  • MySQL 8.0 OCP 1Z0-908 题目解析(4)
  • 2025 OceanBase 开发者大会全议程指南
  • Console Importer浏览器插件的编译 及 制作成.crx浏览器插件的步骤
  • Trae - 国人Cursor的免费平替产品
  • Unity基础学习(十五)核心系统——音效系统
  • Scratch作品 | 3D原野漫游
  • 数据分析NumPy
  • Modbus转IEC104网关(三格电子)
  • Weblogic SSRF漏洞复现(CVE-2014-4210)【vulhub靶场】
  • docker 学习记录
  • 可解释性AI 综述《Explainable AI for Industrial Fault Diagnosis: A Systematic Review》
  • 【Ansible基础】Ansible 核心组件深度解析:控制节点、受管节点、Inventory与Playbook
  • 表记录的检索
  • c语言 写一个五子棋
  • vuex基本介绍
  • Linux中安装samba服务
  • 上海率先推进生物制品分段生产试点,这款国产1类创新药获批上市
  • 恒生银行回应裁员传闻:受影响的员工数目占银行核心业务员工总数约1%
  • 马上评|安排见义勇为学生补考,善意与善意的双向奔赴
  • 上海国际电影节纪录片单元,还世界真实色彩
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式
  • 世界期待中美对话合作带来更多确定性和稳定性