8

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的查询缓存来提高查询效率。
    • 大型数据库使用分区表或者云存储来提高查询效率

画楼西畔
4.2k 声望211 粉丝