oracle-sql执行规则分析

create table girls(
       id varchar2(20),
       name varchar2(20),
       salary number,
       type char
);
insert into girls values ('g_1', '张雨绮', '10000', '1');
insert into girls values ('g_2', '迪丽热巴', '30000', '1');
insert into girls values ('g_4', '心乱如麻', '20000', '0');
insert into girls values ('g_5', '沉鱼落雁', '5000', '0');
insert into girls values ('g_6', '闭月羞花', '3000', '0');

       首先我们根据from,获取一个大的集合Set<每一行数据对应的Object>,然后where对这个集合进行过滤,这里还没有开始进行select字段过滤,我们设置的别名肯定是没有生效的,然后我们开始进行select,我们想要获取一些我们想要的数据,这个数据可以是Object的属性,也可以是写死的值,也可以是获取Object的属性后进行了一些if else , + , - 我们想要的操作,还可以是写死的值,总之我们想怎样来就怎样来。
select name, salary * 100 , '身价:' || salary, 1 from girls;
       然后就是group by
select max(id), max(salary) as nm, type as ty from girls group by ty;
select max(id), max(salary) as nm, type as ty from girls group by type;
简答利用别名测试一下就可以知道,group by是在select之前就生效了的,在from和where之后,我们已经得到一个大的Set(Object),此时我们再次对这个Set进行迭代,把某一个属性相同的Object,放到同一个Set中,然后将这个Set放到我们设置好的成员变量Set<Set<Object>>,having就是对这个Set<Set<Object>>进行再一次的迭代过滤
把不满足条件的Set<Object>移除掉,因为此时是一个组为单位了,此时如果我们的select的属性不是Object的属性,那你分组对我有意义吗,没意义,只是可能让我显示,的行数变少了而已,可能以前最外层的Set(Object)的Size是5,现在你给我变成了Set<Set<Object>>,Size变成了2,我只能显示两条而已嘛,但是如果不是这样,我们想去操作这个Set里面的Set<Object>,很明显是没有办法去操作不是分组的属性的撒,那些属性属于Object,不是属于Set<Object>,其实我们可以把这个Set<Object>当成一个另一个大的对象来看,它有属性,我们分组的属性type,有max(salary),min(salary),有一些oracle提供好的通过算好的值,这些也就是聚合函数的意义。
select 'blossom', 1995, type, max(salary) from girls group by type;
       having也就是对这个大的对象的属性进行过滤罢了,同样利用别名就可以测试处having就在group by之后select之前的,别名还没生效,只能用这个大的对象的属性来进行过滤,所以在oracle中没有group by,having是不能存在的,违背了规则
select 'blossom', 1995, type, max(salary) as maxsalary from girls group by type having max(salary) > 20000;
       最后就是order by,最后我们再对select之后的数据进行排序,明显此时已经是别名已经生效了,可以使用别名了,如果是group by的语句,用别名这里就可以避免再次计算。
select max(id), max(salary) as nm, type as ty from girls group by type order by type;

       请把表和数据创建好,sql执行来看看就一目了然。

猜你喜欢

转载自blog.csdn.net/blossomfzq/article/details/82892663
今日推荐