SQL逻辑查询语句执行顺序
发布时间:2020-12-12 00:03:03 所属栏目:MySql教程 来源:网络整理
导读:一 SELECT语句关键字的定义顺序 select_list left_table join_type right_table join_condition where_condition group_by_list having_condition order_by_condition limit_number 二 SELECT语句关键字的执行顺序 ( ) ) select_list ) left_table ) join_ty
一 SELECT语句关键字的定义顺序select_list left_table join_type right_table join_condition where_condition group_by_list having_condition order_by_conditionlimit_number二 SELECT语句关键字的执行顺序() ) select_list) left_table) join_type right_table) join_condition) where_condition) group_by_list) having_condition) order_by_condition) LIMIT limit_number三 准备表和数据1. 新建一个测试数据库TestDB; TestDB;2.创建测试表table1和table2; () () INNODB CHARSET<span style="color: #0000ff;">CREATE <span style="color: #0000ff;">TABLE<span style="color: #000000;"> table2( order_id <span style="color: #0000ff;">INT <span style="color: #808080;">NOT <span style="color: #0000ff;">NULL<span style="color: #000000;"> auto_increment,customer_id <span style="color: #0000ff;">VARCHAR(<span style="color: #800000; font-weight: bold;">10<span style="color: #000000;">),<span style="color: #0000ff;">PRIMARY <span style="color: #0000ff;">KEY<span style="color: #000000;">(order_id) )ENGINE<span style="color: #808080;">=INNODB <span style="color: #0000ff;">DEFAULT CHARSET<span style="color: #808080;">=UTF8; 3.插入测试数据; table1(customer_id,city) (, table1(customer_id,city) (, table1(customer_id,city) (,city) (,<span style="color: #0000ff;">INSERT <span style="color: #0000ff;">INTO table2(customer_id) <span style="color: #0000ff;">VALUES(<span style="color: #ff0000;">'<span style="color: #ff0000;">163<span style="color: #ff0000;">'<span style="color: #000000;">);<span style="color: #0000ff;">INSERT <span style="color: #0000ff;">INTO table2(customer_id) <span style="color: #0000ff;">VALUES(<span style="color: #ff0000;">'<span style="color: #ff0000;">163<span style="color: #ff0000;">'<span style="color: #000000;">); <span style="color: #0000ff;">INSERT <span style="color: #0000ff;">INTO table2(customer_id) <span style="color: #0000ff;">VALUES(<span style="color: #ff0000;">'<span style="color: #ff0000;">9you<span style="color: #ff0000;">'<span style="color: #000000;">); <span style="color: #0000ff;">INSERT <span style="color: #0000ff;">INTO table2(customer_id) <span style="color: #0000ff;">VALUES(<span style="color: #ff0000;">'<span style="color: #ff0000;">9you<span style="color: #ff0000;">'<span style="color: #000000;">); <span style="color: #0000ff;">INSERT <span style="color: #0000ff;">INTO table2(customer_id) <span style="color: #0000ff;">VALUES(<span style="color: #ff0000;">'<span style="color: #ff0000;">9you<span style="color: #ff0000;">'<span style="color: #000000;">); <span style="color: #0000ff;">INSERT <span style="color: #0000ff;">INTO table2(customer_id) <span style="color: #0000ff;">VALUES(<span style="color: #ff0000;">'<span style="color: #ff0000;">tx<span style="color: #ff0000;">'<span style="color: #000000;">); <span style="color: #0000ff;">INSERT <span style="color: #0000ff;">INTO table2(customer_id) <span style="color: #0000ff;">VALUES(<span style="color: #0000ff;">NULL); 准备工作做完以后,table1和table2看起来应该像下面这样: mysql customer_id city hangzhou 9you shanghai baidu hangzhou tx hangzhou rows (mysql<span style="color: #808080;">> <span style="color: #0000ff;">select <span style="color: #808080;">* <span style="color: #0000ff;">from<span style="color: #000000;"> table2;<span style="color: #808080;">+<span style="color: #008080;">--<span style="color: #008080;">--------+-------------+ <span style="color: #808080;">| order_id <span style="color: #808080;">| customer_id <span style="color: #808080;">| <span style="color: #808080;">+<span style="color: #008080;">--<span style="color: #008080;">--------+-------------+ <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">1 <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">163 <span style="color: #808080;">| <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">2 <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">163 <span style="color: #808080;">| <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">3 <span style="color: #808080;">| 9you <span style="color: #808080;">| <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">4 <span style="color: #808080;">| 9you <span style="color: #808080;">| <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">5 <span style="color: #808080;">| 9you <span style="color: #808080;">| <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">6 <span style="color: #808080;">| tx <span style="color: #808080;">| <span style="color: #808080;">| <span style="color: #800000; font-weight: bold;">7 <span style="color: #808080;">| <span style="color: #0000ff;">NULL <span style="color: #808080;">| <span style="color: #808080;">+<span style="color: #008080;">--<span style="color: #008080;">--------+-------------+ <span style="color: #800000; font-weight: bold;">7 rows <span style="color: #808080;">in <span style="color: #0000ff;">set (<span style="color: #800000; font-weight: bold;">0.00 sec) 四 准备SQL逻辑查询测试语句a.customer_id,(b.order_id) table1 table2 a.customer_id a.city (b.order_id) total_orders ;五 执行顺序分析在这些SQL语句的执行过程中,都会产生一个虚拟表,用来保存SQL语句的执行结果(这是重点),我现在就来跟踪这个虚拟表的变化,得到最终的查询结果的过程,来分析整个SQL逻辑查询的执行顺序和过程。 执行FROM语句 第一步,执行 关于什么是笛卡尔积,请自行Google补脑。经过FROM语句对两个表执行笛卡尔积,会得到一个虚拟表,暂且叫VT1(vitual table 1),内容如下: ![]() |