group by XXX :以XXX进行分组
order by YYY:以YYY进行排序
一,如果一个查询中使用了分组函数,任何不在分组函数中的列或表达式必须要在group by中,
且group by语句中不能使用别名否则出错。
注:在having,where,group by子句中不能使用别名,但在order by 字句中可使用别名
oracle 规定where子句不可以使用分组函数,这时我们必须使用having子句方可完成功能。
select job_id,avg(sal)
from emp
having avg(salsry)>1500
group by job_id;
使用having子句时,oracle系统的处理顺序是:
1,首先对数据行进行分组。
2,把所得到的分组应用到分组函数中。
3,最好显示满足having条件的记录。
三,分组函数的嵌套
使用嵌套查询:
SELECT W_T_SEQ.NEXTVAL,
NUMBER,
ROW_NO
FROM (SELECT NUMBER,
ROW_NO
FROM IMP_T IP
WHERE IP.NUMBER = '80112'
ORDER BY IP.ROW_NO)
group by,order by 和rownum并用实例:
select name
from (
select name,min(row_no)
from table_name
where id = '123456'
group by name
having count(1) > 1
roder by row_no)
where rownum = 1
下列语句的执行顺序是:
1,执行where子句,查出job符合条件的记录。
2,根据job进行分组。
3,根据分组情况求出各组的平均工资。
4,找出各组中最大和最小的平均工资。
再如下列语句:
-
select xxx_name, count(*) as counter
-
from table_y
-
where where_condition
-
group by xxx_name
-
having having_condition
-
order by zzz
当看到一个类似上述的包含了where, group by, having, order by等关键字的SQL时,要首先要知道其执行顺序是怎样的,才能判断出其所表达的含义;
下面列出其执行顺序:
1. 根据where子句选择行;
2. 根据group by 子句组合行;
3. 根据having子句筛选组;
4. 根据order by子句中的分组函数的结果对组进行排序,order by必须使用分组函数或者使用Group by子句中指定的列;
下面看一个例子:
-
select CategoryName, count(*), AVG(Rating)
-
from BOOKSHELF
-
where Rating>1
-
group by CategoryName
-
having CategoryName like 'A%'
-
order by count(*) desc
我们现在知道,其执行顺序如下:
1.基于Where Rating>1 筛选出符合条件的行;
2.基于group by CategoryName 对筛选的结果进行分组;
3.为每个CategoryName组计算Count(*)
4. 基于having CategoryName like 'A%'留下符合条件的组
5. 根据order by 的条件对剩下的行组进行排序,SQL中的count(*)也是分组函数