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如下
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
关于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的查询缓存来提高查询效率。 - 大型数据库使用分区表或者云存储来提高查询效率
- 创建合适的索引:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。