基本SQL语句练习(order by,group by,having)

一、GROUP BY 和ORDER BY

1.使用Order by 进行排序,默认升序ASC,降序则使用DESC;(还可以这样:order by 1表示按第一列排序;order by 2 desc表示按第2列降序排序,order by 3...)
SELECT JOB_ID,SALARY FROM EMPLOYEES ORDER BY JOB_ID; 
JOB_ID	SALARY
AC_ACCOUNT	8300.00
AC_MGR	12008.00
AD_ASST	4400.00
AD_PRES	24000.00
AD_VP	17000.00
AD_VP	17000.00
FI_ACCOUNT	8200.00
FI_ACCOUNT	9000.00
FI_ACCOUNT	6900.00
FI_ACCOUNT	7700.00
FI_ACCOUNT	7800.00
FI_MGR	12008.00
HR_REP	6500.00
IT_PROG	9000.00
IT_PROG	6000.00
IT_PROG	4200.00
IT_PROG	4800.00
IT_PROG	4800.00
MK_MAN	13000.00
MK_REP	6000.00
PR_REP	10000.00

2.使用GROUP BY子句进行分组
使用GROUP BY子句时必须满足以下条件:
在SELECT 子句的后面只可以有两类表达式:统计函数和进行分组的列名
在SELECT 子句中的列名必须是进行分组的列,除此之处添加其它列名都是错误的,但是GROUP BY子句后面的列名可以不出现在SELECT子句中。
如果使用了WHERE子句,那么所有参加分组计算的数据必须首先满足WHERE子句指定的条件。
在默认情况下,将按照GROUP BY子句指定的分组进列升序排序,如果需要重新排序,可以使用ORDER BY 子句指定新的排序顺序。
SELECT JOB_ID,AVG(SALARY),SUM(SALARY),MAX(SALARY),COUNT(JOB_ID) FROM EMPLOYEES GROUP BY JOB_ID;
JOB_ID	AVG(SALARY)	SUM(SALARY)	MAX(SALARY)	COUNT(JOB_ID)
IT_PROG	5760	28800	9000	5
AC_MGR	12008	12008	12008	1
AC_ACCOUNT	8300	8300	8300	1
ST_MAN	7280	36400	8200	5
PU_MAN	11000	11000	11000	1
AD_ASST	4400	4400	4400	1
AD_VP	17000	34000	17000	2
SH_CLERK	3215	64300	4200	20
FI_ACCOUNT	7920	39600	9000	5
FI_MGR	12008	12008	12008	1
PU_CLERK	2780	13900	3100	5
SA_MAN	12200	61000	14000	5
MK_MAN	13000	13000	13000	1
PR_REP	10000	10000	10000	1
AD_PRES	24000	24000	24000	1
SA_REP	8350	250500	11500	30
MK_REP	6000	6000	6000	1
ST_CLERK	2785	55700	3600	20
HR_REP	6500	6500	6500	1

3.
SELECT DEPARTMENT_ID,JOB_ID,AVG(SALARY),SUM(SALARY),MAX(SALARY),COUNT(*) FROM EMPLOYEES GROUP BY DEPARTMENT_ID,JOB_ID;
DEPARTMENT_ID	JOB_ID	AVG(SALARY)	SUM(SALARY)	MAX(SALARY)	COUNT(*)
110	AC_ACCOUNT	8300	8300	8300	1
90	AD_VP	17000	34000	17000	2
50	ST_CLERK	2785	55700	3600	20
80	SA_REP	8396.55172413793	243500	11500	29
50	ST_MAN	7280	36400	8200	5
80	SA_MAN	12200	61000	14000	5
110	AC_MGR	12008	12008	12008	1
90	AD_PRES	24000	24000	24000	1
60	IT_PROG	5760	28800	9000	5
100	FI_MGR	12008	12008	12008	1
30	PU_CLERK	2780	13900	3100	5
50	SH_CLERK	3215	64300	4200	20
20	MK_MAN	13000	13000	13000	1
100	FI_ACCOUNT	7920	39600	9000	5
	SA_REP	7000	7000	7000	1

4.ROLLUP:在最后一行列出统计汇总
SELECT  JOB_ID,AVG(SALARY),SUM(SALARY),MAX(SALARY),COUNT(*) FROM EMPLOYEES GROUP BY ROLLUP(JOB_ID);
JOB_ID	AVG(SALARY)	SUM(SALARY)	MAX(SALARY)	COUNT(*)
AC_ACCOUNT	8300	8300	8300	1
AC_MGR	12008	12008	12008	1
AD_ASST	4400	4400	4400	1
AD_PRES	24000	24000	24000	1
AD_VP	17000	34000	17000	2
FI_ACCOUNT	7920	39600	9000	5
FI_MGR	12008	12008	12008	1
HR_REP	6500	6500	6500	1
IT_PROG	5760	28800	9000	5
MK_MAN	13000	13000	13000	1
MK_REP	6000	6000	6000	1
PR_REP	10000	10000	10000	1
PU_CLERK	2780	13900	3100	5
PU_MAN	11000	11000	11000	1
SA_MAN	12200	61000	14000	5
SA_REP	8350	250500	11500	30
SH_CLERK	3215	64300	4200	20
ST_CLERK	2785	55700	3600	20
ST_MAN	7280	36400	8200	5
	6461.83177570093	691416	24000	107

5.CUBE:在第一行列出统计汇总
SELECT  JOB_ID,AVG(SALARY),SUM(SALARY),MAX(SALARY),COUNT(*) FROM EMPLOYEES GROUP BY CUBE(JOB_ID);
JOB_ID	AVG(SALARY)	SUM(SALARY)	MAX(SALARY)	COUNT(*)
	6461.83177570093	691416	24000	107
AD_VP	17000	34000	17000	2
AC_MGR	12008	12008	12008	1
FI_MGR	12008	12008	12008	1
HR_REP	6500	6500	6500	1
MK_MAN	13000	13000	13000	1
MK_REP	6000	6000	6000	1
PR_REP	10000	10000	10000	1
PU_MAN	11000	11000	11000	1
SA_MAN	12200	61000	14000	5
SA_REP	8350	250500	11500	30
ST_MAN	7280	36400	8200	5
AD_ASST	4400	4400	4400	1
AD_PRES	24000	24000	24000	1
IT_PROG	5760	28800	9000	5
PU_CLERK	2780	13900	3100	5
SH_CLERK	3215	64300	4200	20
ST_CLERK	2785	55700	3600	20
AC_ACCOUNT	8300	8300	8300	1
FI_ACCOUNT	7920	39600	9000	5

二、HAVING子句

HAVING子句通常与GROUP BY子句一起使用,在完成对分组结果集进行统计之后,使用HAVING子句再次对结果集进行筛选。如果不使用GROUP BY子句,HAVING子句功能与WHERE子句一样。HAVING与WHERE的不同之处在于HAVING子句与组相关。如果指定了WHERE子句,而没有指定GROUP BY子句,那么HAVING子句将应用于WHERE子句的输出,并且整个输出被看作是一个组。如果SELECT语句即没有指定WHERE子句,也没有指定GROUP BY子句,那么HAVING子句将应用于FROM子句的输出,并且将其看作是一个组。
在SELECT语句中,首先由FROM子句找到数据表,WHERE子句则接收FROM子句输出的数据,而HAVING子句则接收来自GROUP BY、WHERE或FROM子句的输入。
SELECT  JOB_ID,AVG(SALARY),SUM(SALARY),MAX(SALARY),COUNT(*) FROM EMPLOYEES GROUP BY JOB_ID HAVING AVG(SALARY)>10000;
JOB_ID	AVG(SALARY)	SUM(SALARY)	MAX(SALARY)	COUNT(*)
AC_MGR	12008	12008	12008	1
PU_MAN	11000	11000	11000	1
AD_VP	17000	34000	17000	2
FI_MGR	12008	12008	12008	1
SA_MAN	12200	61000	14000	5
MK_MAN	13000	13000	13000	1
AD_PRES	24000	24000	24000	1
原文地址:https://www.cnblogs.com/rusking/p/3780854.html