243123312  \

1.mysql的查询语句执行过程,首先客户端要和服务器端建立连接,建立连接后,对于要查询的语句首先查找查询缓存,如果查询缓存没有该数据,就会去找解析器,但是要注意,如果多次的查询,查询缓存都没有被命中,那这个查询缓存就没有意义了,还还不如关闭,因为缓存也会有开销的.至少要有三层的命中率才考虑开启查询缓存.不过也不一定,假如你有1000条查询,只有10条被查询缓存命中,但是这10条又是相当复杂的,这10条的开销比剩余的990都大,也可以开启.而查询缓存有分为字节命中和

2.如果查询缓存没有命中,就交给解析器,做词法分析,语法分析等,必要的时候解析器会结合预处理器生成解析树,解析树这里可以理解为路径,对于查询的这条语句,有多条路可走.

3.查询优化器会帮忙选择一条最优的路径来作为查询的计划,必要的时候,查询优化器还会修改查询语句,来达到最优查询

4.查询优化语句后,会把最终的语查询执行引擎,但是mysql是多线程的,而查询引擎只有一个,当多个用户同时发起查询时,需要一个查询执行计划来管理排队的问题.

5.查询执行引擎将优化器选择好的查询语句交给存储执引擎,存储引擎再真正的调用数据层层返回给客户端.

6.在返回客户端的时候,查询缓存还必须查看该条查询结果是否有必须缓存在查询缓存中.用户是可以手动指定是否记录某些查询结果的.


MySQL的查询

    单表查询:简单查询

           投影(挑选要显示的字段):SELECT  字段1,字段2,... FROM tb_name;

                                                      SELECT * FROM tb_name;

           选择(挑选符合条件的行):SELECT  字段1,字段2,... FROM tb_name WHERE 字句;

                                                      SELECT * FROM tb_name WHERE 字句;

WHERE后面跟的是布尔表达式,下面是常见的布尔表达式:

符号作用
=等于
< >  aka  !=不等于
< = >为NULL表达式
<小于
< =小于等于
>大于
>=大于等于
BETWEEN在什么之间
IN在给定的范围内
IS NULL为空
IS NOT NULL不为空
LIKE支持通配符
RLIKE支持正则表达式(性能较低)
NOT aka !取反
AND取合
OR  aka  ||或者

 

现有如下表:

248155937

1.查看年龄在37和51之间的学生的姓名

image

2.年龄段在26,27,28,29之中的学生姓名

image

3.查找以x开头的学生的姓名

image

4.查找Tutor为空的学生的姓名

image

5.查找Tutor不为空的学生的姓名

image

6.查找年龄大于25岁并且为男性的学生姓名

image


聚合函数:

SUM(), AVG(), MAX(), MIN(), COUNT()

1.求所有学生的年龄和

image

2.求所有学生的平均年龄

image

3.求所有学生中年龄最大的学生

image

这个错了,看来不能这样查询,Guo Jing的年龄是27

4.求所有学生中年龄最小的学生

image

5.统计年龄大于25岁的人数

image


GROUP BY,HACING ,ORDER BY,LIMIT

1.分别求男学生和女学生的年龄总数

image

2.以班级分组并统计每班人数

image

3.查看某班人数至少有两个的

image

4.所有符合条件的行只返回有限的行

image

5.显示从第二行开始的后三行

image


联系题:自己回顾的时候做做

image


SELECT语句的的执行顺序

image

1.执行SELECT 语句时,先执行FROM语句,来选择需要执行的表

2.然后执行WHERE 语句挑选出符合条件的行

3.如果有GROUP BY做分组的话,则先分组

4.如果分组后需要再次做条件过滤,则执行HAVING

5.如果最后还要做排序的话,则执行ORDER BY

6.以上的执行完了后才会之心个SELECT

7.最后如果有LIMIT的话 还有做LIMIT


去除重复的行

image

SQL_CACHE:缓存于查询缓存汇总

SQL_NO_CACHE:不缓存查询结果