Mysql_8 SQL 语句——DQL 例题及一些注意事项

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 学习自b站骆昊jackfrued 老师的网课以及黑马网课。

学习自b站骆昊jackfrued 老师的网课以及黑马网课。

简单排序——查询最大值、次大只

  1. 员工表中含有员工号、姓名、薪水、职位、补贴 、所在部门等信息。查询薪水最高的员工姓名和薪水值。

    做法①:最普通的子查询,先查出最大工资值,再筛选出员工表中工资值等于这个数的员工。

    做法②:limit 做法。先按薪水降序排序所有员工,再只 limit 1 取第一条员工信息。这种做法的局限性在 limit 介绍的时候我也有写,就是当最值不只一位的时候,这种方法只能查出1位员工。

    做法③:

    select `ename`,`salary` from `tb_employee` t1 where(
        select count(*) from `tb_employee` t2 where `t2`.`salary`>`t1`.`salary`
    )=0;-- 结尾改成1,就是工资第二高的人
    AI 代码解读
  2. 查询除了 boss 外工资最高的人。

    在题1的基础上,用 where 排除掉 boss。

    select `ename`,`salary` from `tb_employee` 
    where `salary`=(
        select max(salary) from `tb_employee` where `position`<>'boss'
    );
    AI 代码解读
  3. 查询月薪 top 3的人。

    这时出现了和题1一样的情况。用 limit ,可能会漏掉工资并列的第四人;因此,这里用题1的方法③最合适。

    select `ename`,`salary` from `tb_employee` t1 where(
        select count(*) from `tb_employee` t2 where `t2`.`salary`>`t1`.`salary`
    )<3 order by `salary` desc;
    AI 代码解读
  4. 查询所有员工的姓名和年薪。年薪计算公式:月薪*12+补贴。

    题目很简单,但是遇到计算一定要注意数据是否 Not Null,如果出现 Null 数据结果也会变成 Null。要用 ifnull() 或 coalesce() 函数限制一下。

  5. 查询所有部门名称及员工人数。

    部门名称在部门表中,每个部门的人数则需要根据员工表中部门号统计。显然这里要先查出员工表的员工号和统计员工信息,再把结果表和部门表做连接。重点注意几种连接的不同。比如此题,即便有的部门没有员工,也要显示出来,因此应该部门表 left join 派生表。

    select dname,total from `tb_department` t1
    left join (
        select dname, ifnull(count(*), as total from `tb_department` t2 group by `stu_id`
    ) on t1.`stu_id`=t2.`stu_id`;
    AI 代码解读
  6. 查询每个部门比本部门平均薪水高的员工名及薪水。记得说清楚列属于哪个表,不然报错 ambigious

    先按部门分组,查询出平均成绩和员工号表;再通过部门号和员工表连接,并筛选出薪水值大于平均值的。

    select sname,salary from `tb_employee` t1
    inner join (
        select avg(salary),dno from `tb_employee` group by dno;
    )t2 on t1.dno=t2.dno and t1.salary > t2.avg(salary);-- 两个连表条件
    AI 代码解读
  7. 查询每个部门中薪水最高的员工的用户姓名、薪水、部门名称。

    派生表通过薪水值、部门号和员工表、部门表相连接。

  8. 查询薪水排名4-6员工的薪水、姓名、排名

    问题1:怎么查出排名?

    问题2:这题并没有想象中的简单。比如员工薪水前8名是5000,5000,4000,4000,3000,3000,3000,2000,那么其实第三、第四人两个人并列第三,4-6显示的排名值就应该是3,5,5

    解决:mysql 8的窗口函数可以解决排名 / top N 问题。

    ①不用窗口函数:

    系统变量一般不写@或写两个@@(可以通过 show variables 查询),自己定义的变量写一个@,赋值的方法:set @a=0;select@a:=0;而且变量也可以通过 as 起别名。

    我们先定义一个变量,变量从0开始,每次选择+1,就可以当做序号用了。

    set @a=0;
    select row_num,ename,salary from (
        select @a=@a+1 as `row_num`,ename,salary,(select @a:=0) -- @a 重新赋值为0
        from `tb_employee` order by salary desc
    ) where `row_num` between 4 and 6;-- 子查询中做了几次查询,@a 就加几次
    AI 代码解读

    注意不要在括号里用 limit 3 offset 3,因为这样的话子查询就只会进行3次,@a 的值就只会从1到3.

    另外,每次查询时都要重新给@a 赋值为0,不然其值会累加。

  9. 查询每个部门薪水排名前两名的员工。

    Top N 问题通过题1的做法③解决。

    select eno,ename,salary,dno from `tb_employee` t1
    where (
        select count(*) from `tb_employee` t2 where t1.`dno`=t2.`dno` and t2.salary>t1.salary
    )<2 order by t1.dno asc, t1.salary desc;
    AI 代码解读

窗口函数

内容来自:通俗易懂的学会:SQL 窗口函数 - 知乎

应用于组内排名和 Top N 类问题。 一般是处理 where 和 group by

窗口函数不光是函数,有一套完整的语法。

<窗口函数> over (partition by <用于分组的列名>
                order by <用于排序的列名>)
AI 代码解读

<窗口函数> 处放聚合函数或专用窗口函数。

窗口函数是以一个列的形式使用的。

专用窗口函数

rank、dese rank、row_number

img

partition by 和 group by 的区别

img

使用:

select `ename`,`sal`,
rank() over (order by `sal` desc)as `r1`,
dense_rank() over (order by `sal` desc)as `r2`,
row_number() over (order by `sal` desc)as `r3`
from `tb_emp`;
AI 代码解读

第八题窗口函数做法:加一个 where r between 4 and 6 的条件。

至于要用哪种专用函数,就要看要求了。

第九题窗口函数做法:因为产生了分组,因此不能直接用 where r <=2。但是窗口函数的分组后的列做筛选,既不能直接用 where 也不能用 having。应该把窗口函数的查询结果作为一个派生表,再用 where 做选择。

select `ename`,`sal`,`dno`
from(
    select `ename`,`sal`,`dno`,
    rank() over (partition by `dno` order by `sal` desc)as `r`
    from `tb_emp`
) `temp` where `r`<=2;-- 不能在派生表里直接筛选
AI 代码解读

窗口函数性能还是比较差的,业务中不应使用,数据分析师可能会常用一些。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
泾箐
+关注
目录
打赏
0
0
0
0
5
分享
相关文章
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
MySQL原理简介—1.SQL的执行流程
本文介绍了MySQL驱动、数据库连接池及SQL执行流程的关键组件和作用。主要内容包括:MySQL驱动用于建立Java系统与数据库的网络连接;数据库连接池提高多线程并发访问效率;MySQL中的连接池维护多个数据库连接并进行权限验证;网络连接由线程处理,监听请求并读取数据;SQL接口负责执行SQL语句;查询解析器将SQL语句解析为可执行逻辑;查询优化器选择最优查询路径;存储引擎接口负责实际的数据操作;执行器根据优化后的执行计划调用存储引擎接口完成SQL语句的执行。整个流程确保了高效、安全地处理SQL请求。
177 76
MySQL的架构与SQL语句执行过程
MySQL架构分为Server层和存储引擎层,具有高度灵活性和可扩展性。Server层包括连接器、查询缓存(MySQL 8.0已移除)、分析器、优化器和执行器,负责处理SQL语句;存储引擎层负责数据的存储和读取,常见引擎有InnoDB、MyISAM和Memory。SQL执行过程涉及连接、解析、优化、执行和结果返回等步骤,本文详细讲解了一条SQL语句的完整执行过程。
15 3
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
18 2
【YashanDB 知识库】如何将 mysql 含有 group by 的 SQL 转换成崖山支持的 SQL
在崖山数据库中执行某些 SQL 语句时出现报错(YAS-04316 not a single-group group function),而这些语句在 MySQL 中能成功执行。原因是崖山遵循 SQL-92 标准,不允许选择列表中包含未在 GROUP BY 子句中指定的非聚合列,而 MySQL 默认允许这种操作。解决办法包括:使用聚合函数处理非聚合列或拆分查询为两层,先进行 GROUP BY 再排序。总结来说,SQL-92 更严格,确保数据一致性,MySQL 在 5.7 及以上版本也默认遵循此标准。
MySQL原理简介—10.SQL语句和执行计划
本文介绍了MySQL执行计划的相关概念及其优化方法。首先解释了什么是执行计划,它是SQL语句在查询时如何检索、筛选和排序数据的过程。接着详细描述了执行计划中常见的访问类型,如const、ref、range、index和all等,并分析了它们的性能特点。文中还探讨了多表关联查询的原理及优化策略,包括驱动表和被驱动表的选择。此外,文章讨论了全表扫描和索引的成本计算方法,以及MySQL如何通过成本估算选择最优执行计划。最后,介绍了explain命令的各个参数含义,帮助理解查询优化器的工作机制。通过这些内容,读者可以更好地理解和优化SQL查询性能。
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
374 11
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
146 42

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等