小案例1:
建表test1 test2 test3 :
DROP TABLE IF EXISTS `test1`;CREATE TABLE `test1` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of test1-- ----------------------------INSERT INTO `test1` VALUES ('1', '测试');INSERT INTO `test1` VALUES ('2', '测试');DROP TABLE IF EXISTS `test2`;CREATE TABLE `test2` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of test2-- ----------------------------INSERT INTO `test2` VALUES ('1', null);DROP TABLE IF EXISTS `test3`;CREATE TABLE `test3` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of test3-- ----------------------------INSERT INTO `test3` VALUES ('1', null);
执行sql 这个sql没有实际业务意义 只是为了简单使用一个case练习一下explain:
explain select d1.ct ,(select id from test3 ) id from (select count(1) ct from test1 where name ='测试') d1union ( select name,id from test2)
结果:
结果说明:
按照执行顺序说:
第四行(第1个执行)
执行 select name,id from test2
select_type 为 union 说明第四个select是 union的第二个select
第二行 (第2个执行)
select count(1) ct from test1 where name =‘测试’
查询结果包含在from中 所以select_type是DERIVED
第三行(第3个执行)
select id from test3
select_type 为 SUBQUERY 因为他是第一个select的子查询
第一行(第4个执行)
select d1.ct , id
from d1
他是union中的第一个select select_type 为PRIMARY 表示他是外层查询,table标记为 表示查询结果来自一个衍生表,derived3表示衍生来自id=3 的 select 也就是第二行
第五行(最后一个执行)
select_type 为 UNION RESULT 他只是合并两边select的结果
也就是<union1,4> 1表示id=1的结果 4表示id=4的结果 把两个结果进行union