1. 什么是子查询
select max(sal) from emp语句查询出职工的最高工资X,然后将工资X作为过滤条件查询出持最高工资的员工的详细信息,其中
select max(sal) from emp语句即为子查询

in操作符等。如下查询中,子查询
select deptno from emp where sal>2000返回工资大于2000的职工所在的部门编号,外部查询返回对应的部门名称


2. 什么是公共表表达式(CTE)
with cte as (select 1 as one, 2 as two)即为公共表表达式,它是一个命名的(名字叫cte)结果集,而且在该条语句中它可以被当做临时表来引用(最后的select语句引用了它)。初次接触CTE是不是感觉跟派生表子查询很像?没错!他们确实在某些方面很像,如它们都有名字、它们都在单条语句中生效。当然他们也有很多区别,主要区别有:
派生表在查询语句中只能引用一次,而CTE可以引用多次 CTE可以引用自身(递归) CTE可以引用其他CTE CTE相比排查表可读性更高,CTE在语句开头定义临时结果集而不是像派生表一样嵌入到查询语句中


3. 什么是递归公共表表达式(RCTE)
必须使用with recursive定义,否则报错 ERROR 1146 (42S02): Table '[db_name].[cte_name]' doesn't existas后面定义的语句必须用小括号括起来 小括号中的查询语句包含两个select子句,两个select子句使用union all或者union distinct连接。第一个select的查询结果集作为初始数据集;第二个select是循环迭代部分

recursive关键字表示这是一个RCTE(普通CTE也可以使用recursive关键字),第一个
select 1语句用于定义初始数据集;第二个select语句定义循环数据集,每次循环时
n的值都比上一次循环时递增1,直到满足n<10时推出循环

3.1. RCTE案例1(生成序列)
mysql> create table sales(occur_date date,price double);
mysql> insert into sales values(str_to_date('2017-01-03','%Y-%m-%d'),100);
mysql> insert into sales values(str_to_date('2017-01-03','%Y-%m-%d'),200);
mysql> insert into sales values(str_to_date('2017-01-06','%Y-%m-%d'),50);
mysql> insert into sales values(str_to_date('2017-01-08','%Y-%m-%d'),10);
mysql> insert into sales values(str_to_date('2017-01-08','%Y-%m-%d'),20);
mysql> insert into sales values(str_to_date('2017-01-08','%Y-%m-%d'),150);
mysql> insert into sales values(str_to_date('2017-01-10','%Y-%m-%d'),5);



3.2. RCTE案例2(生成层次查询结果集)
create table city(id int primary key not null,name varchar(100),pid int null);
insert into city values(1,'shandong',NULL);
insert into city values(11,'jinan',1);
insert into city values(12,'qingdao',1);
insert into city values(13,'zibo',1);
insert into city values(14,'weilang',1);
insert into city values(111,'gaoxinqu',11);
insert into city values(112,'lixiaqu',11);
insert into city values(113,'shizhongqu',11);
insert into city values(2,'hebei',NULL);
insert into city values(21,'shijiazhuang',2);
insert into city values(22,'tangshanshi',2);
insert into city values(23,'qinhuangdao',2);
insert into city values(211,'changanqu',21);
insert into city values(212,'qiaoxiqu',21);
insert into city values(213,'xinhuaqu',21);

文章转载自TalkingBigData,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




