关于 Mysql 查询的那些事儿
Mysql 一直都是互联网开发之中常用的的一门语言,其中查询更是常用的功能之一,今天就来说说关于查询的那些事儿。
SELECT 是 sql 中的关键字之一,sql 中的关键字还有 INSERT、DELETE、UPDATE 等关键字,在这篇文章中,我们只要讲讲关于 SELECT 的部分;
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 如下
当我们想要限定返回结果的数量的时候,使用 LIMIT 关键字,比如在上一个查询例子中只想查询前 10 条数据
关于 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
关于查询的优化:
如果不需要将一个表中的所有列都查询出来的时候,尽量不要使用 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 的查询缓存来提高查询效率。
大型数据库使用分区表或者云存储来提高查询效率
作为程序员,持续学习和充电非常重要,作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。低代码也是一个值得我们深入探索的领域,让我们拭目以待,它将给前端世界带来怎样的变革,推荐一个低代码工具。
开发语言:Java/.net
这是一个基于 Flowable 引擎(支持 java、.NET),已支持 MySQL、SqlServer、Oracle、PostgreSQL、DM(达梦)、 KingbaseES(人大金仓)6 个数据库,支持私有化部署,前后端封装了上千个常用类,方便扩展,框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用。
至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端 UI 等组件,这种情况下我们避免了重复造轮子,已内置大量的成熟组件,选择合适的组件进行集成或二次开发复杂功能,即可自主开发一个属于自己的应用系统。
评论