写点什么

关于 Mysql 查询的那些事儿

  • 2024-12-27
    福建
  • 本文字数:2275 字

    阅读完需:约 7 分钟

关于Mysql查询的那些事儿

Mysql 一直都是互联网开发之中常用的的一门语言,其中查询更是常用的功能之一,今天就来说说关于查询的那些事儿。

SELECT 是 sql 中的关键字之一,sql 中的关键字还有 INSERT、DELETE、UPDATE 等关键字,在这篇文章中,我们只要讲讲关于 SELECT 的部分;

  1. SELECT 查询的基础语法查询表中所有列的数据

    SELECT * FROM table

    也可以查询表中一个或者多个列的数据,在列明之间用逗号 ,分割即可。

    SELECT column_1,column_2,column_3,column_4 FROM table

    起别名查询

    SELECT column_1 as name FROM table

    去重查询,从查询结果中去掉重复的行,使用的是关键字 DISTINCT,并且,DISTINCT 需要放在列的前面,如果写在列后面就会报错。

    SELECT DISTINCT column_1 FROM table

    分组查询,通常会与聚合函数放在一起使用,将结果集中的多行数据根据一个或者多个列进行分组,使用 GROUP BY 可以对每个分组进行聚合计算,而不是对整个结果集进行计算。

    SELECT column_1,column_2,FROM table GROUP BY column_1

    使用 HAVING 子句,HAVING 子句与 GROUP BY 一起使用,用于对分组后的结果进行过滤:

    SELECT column_1, SUM(column_2) AS total_num FROM table GROUP BY column_1 HAVING total_num > 10;

    以上 sql 就是按照字段 column_1 进行分组查询 column_2 的总数信息,并且返回总数要大于 10 的所有数据

  • 查询结果排序,比如排行榜等数据需要按照大小顺序对查询结果进行排序,就需要使用 ORDER BY 子句。使用 ORDER BY 子句有以下几个点需要注意:

  • 1、ORDER BY 后面是需要排序的列名,可以是一个或者多个,会按照后面的列名先后进行排序操作;

  • 2、ORDER BY 后面可以设置排列的顺序,在列名后面添加 ASC 或者 DESC,ASC 代表递增排序,DESC 代表递减排序,如果没有设置,会默认按照 ASC 升序排列,即便是 select 中没有查询的列名也可以 在 ORDER BY 后面设置排序;ORDER BY 要在 SELECT 语句的最后,否则会报错。

当我们需要按照 column_1 数值的从高到低进行查询结果排序的时候,sql 如下

SELECT column_1,column_2 FROM table ORDER BY column_1 DESC
复制代码

当我们想要限定返回结果的数量的时候,使用 LIMIT 关键字,比如在上一个查询例子中只想查询前 10 条数据

SELECT column_1,column_2 FROM table ORDER BY column_1 DESC  LIMIT 10
复制代码
  1. 关于 SELECT 查询的执行顺序,查询可以说是针对数据库最频繁的操作,我们在查询过程中要注意几个关键点:

    关键字必须按照顺序编写,比如讲我们以上讲过的所有关键字都放到一个查询语句中,那么顺序是:

    SELECT DISTINCT ...... FROM ...... WHERE ......GROUP BY...... ORDER BY ...... ASC.....LIMIT ......SELECT 语句的执行顺序:FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT > ORDER BY > LIMIT 如果写了一个复杂查询的 sql,那么它的执行顺序如下 SELECT DISTINCT column_1, column_2, count(*) as num #顺序 5 FROM table #顺序 1 WHERE column_2 = 10 #顺序 2 GROUP BY column_1 #顺序 3 HAVING num > 10 #顺序 4 ORDER BY num DESC #顺序 6 LIMIT 10 #顺序 7

  2. 关于查询的优化:

  • 如果不需要将一个表中的所有列都查询出来的时候,尽量不要使用 SELECT* 查询,而是 SELECT 关键字后面添加具体的需要查询的字段,这样不需要检索出所有的列,减少了在查询中的传输量;

    创建合适的索引:

  • 单列索引:为经常用于过滤、排序或分组的列创建索引。

  • 复合索引:如果查询条件经常涉及多个列,则创建包含这些列的复合索引。

  • 使用前缀索引:对于 VARCHAR 类型的列,如果列的文本很长,则可以使用前缀索引。

避免全表扫描

  • 使用 WHERE 子句来限制查询的结果集。

  • 避免在 WHERE 子句中使用 LIKE '%value%',因为这会导致全表扫描。

优化查询中的函数使用

  • 尽量避免在 WHERE 子句中使用函数,因为这会导致索引失效。

  • 如果必须使用函数,考虑使用生成列(generated column)来存储计算结果,并对该列 建立索引。

优化子查询和连接

  • 使用 JOIN 代替子查询,通常 JOIN 的执行效率更高。

  • 当使用 JOIN 时,确保连接条件使用了索引。

  • 尽可能使用 INNER JOIN,因为它通常比 OUTER JOIN 更高效。

优化 LIMIT 使用

  • 如果使用 LIMIT 来分页,尽量避免使用大的偏移量。可以考虑使用“记住上次最大 ID”的方法来优化。

    使用 UNION ALL 代替 UNION

  • 如果你的查询需要使用 UNION,并且你知道数据中不会有重复,使用 UNION ALL,因为它不会去重,因此通常更快。

优化数据类型

  • 选择合适的数据类型可以减少存储空间,提高查询效率。

  • 例如,对于固定长度的字符串,可以使用 CHAR;对于可变长度的字符串,使用 VARCHAR。

优化存储过程

  • 如果使用存储过程,确保它们被优化以减少不必要的数据库调用。

使用缓存

  • 如果你的应用场景适合,可以启用 MySQL 的查询缓存来提高查询效率。

    大型数据库使用分区表或者云存储来提高查询效率

作为程序员,持续学习和充电非常重要,作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。低代码也是一个值得我们深入探索的领域,让我们拭目以待,它将给前端世界带来怎样的变革,推荐一个低代码工具。

应用地址:https://www.jnpfsoft.com

开发语言:Java/.net

这是一个基于 Flowable 引擎(支持 java、.NET),已支持 MySQL、SqlServer、Oracle、PostgreSQL、DM(达梦)、 KingbaseES(人大金仓)6 个数据库,支持私有化部署,前后端封装了上千个常用类,方便扩展,框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用。

至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端 UI 等组件,这种情况下我们避免了重复造轮子,已内置大量的成熟组件,选择合适的组件进行集成或二次开发复杂功能,即可自主开发一个属于自己的应用系统。

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
关于Mysql查询的那些事儿_伤感汤姆布利柏_InfoQ写作社区