explain select orders.*,(select name from products where products.id = orders.user_id) from orders;
复制代码
2.5 derived:派生表,在 FROM 子句的查询语句,表示从外部数据源中推导出来的,而不是从 SELECT 语句中的其他列中选择出来的。
set session optimizer_switch='derived_merge=off'; #关闭 MySQL5.7 对衍生表合并优化
explain select * from (select user_id from orders where id = 1) as temp;
set session optimizer_switch='derived_merge=on'; #还原配置
复制代码
2.6 union:分 union 与 union all 两种,若第二个 select 出如今 union 之后,则被标记为 union;假如 union 被 from 子句的子查询包含,那么第一个 select 会被标记为 derived;union 会针对相同的结果集举行去重,union all 不会举行去重处理。
explain
select * from (
select id from products where price = 10
union
select id from orders where user_id in (1,2)
union
select id from users where name = '张三' ) as temp;
复制代码
explain
select * from (
select id from products where price = 10
union all
select id from orders where user_id in (1,2)
union all
select id from users where name = '张三' ) as temp;
复制代码
2.7 dependent union:当 union 作为子查询时,其中第一个 union 为 dependent subquery,第二个 union 为 dependent union。
explain
select * from orders where id in (
select id from products where price = 10
union
select id from orders where user_id = 2
union
select id from users where name = '张三' );
复制代码
2.8 union result:假如两个查询中有相同的列,则会对这些列举行重复删除,只保留一个表中的列。