这篇文章主要介绍了MySQL中逻辑查询的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在MySQL中,查询是用于构建DELETE、UPDATE的基础,因为你要删除或者更新他们时,首先就是要查出这些记录,所以SELECT显的尤为重要,对于查询处理,可以分为逻辑查询和物理查询,逻辑查询表示执行SELECT语句时应该产生什么样的结果,而物理查询表示MySQL如何得到这个结果的。本章来说一下逻辑查询。在SQL语句中,最先处理的就是FROM语句,最后执行的是LIMIT语句,如果把所有的语句都用上,如GROUP BY、ORDER BY,那么大致可以分为10个步骤,如下所示,每个操作都会产生一张虚拟表。下面通过一个实际例子来分析一下,首先创建两张表,用户和订单。插入数据。好,现在来查询一下来自内蒙,且订单数量小于3的用户,SQL如下。有数据有SQL,下面分析一下具体流程。1. 笛卡尔乘积首先要做的是对FROM语句前后的两张表进行笛卡尔乘积,那么什么是笛卡尔乘积?举个例子来说,假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。所以,对应上面的数据,最终会产生一张虚拟表VT1,他将包含35行数据,具体数据如下所示。2. ON过滤器下一步,通过ON后面的添加过滤掉不需要的数据,在上述SQL中,条件是user.userId = orders.userId
,所以通过上面生成的虚拟表VT1,除去不相关的数据,生成新的虚拟表VT2,最终的结果如下。3.添加外部行这一步只有在连接类型为OUTER JOIN才发生。LEFT OUTER JOIN把左表记为保留表,RIGHT OUTER JOIN把右表作为保留表,FULL OUTER JOIN表示都作为保留免费主机域名表,添加外部行的工作就是在上一步的基础上添加保留表中被过滤条件过滤掉的数据,非保留表的数据被赋值NULL。最终生成下面的结果,记为虚拟表VT3。4. WHERE过滤器这一步很简单,条件为city="内蒙"
,即只保留下city为内蒙的列,并生成新的虚拟表VT4。最终结果如下。5. GROUP BY 分组这步将上一个步骤进行分组,并生成新的虚拟表VT5,结果如下。6.HAVING筛选分完组,我们就可以筛选了,选出count(orders.orderId)的数据即可,最终结果如下。
7.处理SELECT列表虽然SELECT是查询中最先被指定的部分,但是直到这里才真正进行处理,在这一步,将免费主机域名SELECT中指定的列从上一步产生的虚拟表中选出。8.应用DISTINCT如果查询语句中存在DISTINCT子句,则会创建一张内存临时表,这张内存临时表的表结构和上一步产生的虚拟表一样,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来去除重复数据。另外对使用了GROUP BY语句的查询,再使用DISTINCT是多余的,因为已经进行了分组,不会移除任何行。9.排序和LIMIT最后就是排序,返回新的虚拟表。结果如下。但是在本例子中没有使用到LIMIT,如果使用到了,那么则从选出指定位置开始的指定行数感谢你能够认真阅读完这篇文章,希望小编分享的“MySQL中逻辑查询的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持云技术,关注云技术行业资讯频道,更多相关知识等着你来学习!
相关推荐: mssql access数据库利用top分页的方法
这篇文章主要讲解了“mssql access数据库利用top分页的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mssql access数据库利用top分页的方法”吧!复制代码 代码如下:感谢各位的阅读,以…