HAVING函数使用(分组案例使用)子查询

WHERE 中不允许使用统计函数,,WHERE子句是在GROUP BY之前执行的,还没进行分组,所以使用另一个子句完成 :HAVING子句

没有GROUP BY不允许出现HAVING子句、

SELECT job,ROUND(avg(sal),2)
FROM EMP
GROUP BY JOB 
HAVING AVG(sal) >2000 ;
在GROUP BY 后面使用HAVING使用,HAVING可以直接 使用HAVING函数

例:求不是销售员的工资,大于5000,并以降序排列

SELECT  job ,sum(sal) sam
FROM emp
WHERE job <> 'SALESMAN' 
GROUP BY JOB
HAVING sum(sal) >5000
ORDER BY sam desc;

领取佣金和不领取佣金人数及平均工资 

SELECT '领取佣金'info, COUNT(*) ,AVG(sal)
FROM EMP 
WHERE  COMM is not NULL
UNION
SELECT '不领取佣金'info, COUNT(*) ,AVG(sal)
FROM EMP 
WHERE  COMM is NULL;


查询总体格式如下

SELECT   

FROM  

[WHERE 条件]

GROUP BY [分组字段,分组字段2...]

HAVING [分组过滤字段】

[ORDER BY   排序字段   [asc |DESC]]

字查询都使用“()”声明。字查询最多是在WHERE或者FROM中

SELECT * 
FROM EMP 
WHERE SAL = (SELECT MIN(sal) FROM EMP );

WHERE:子查询返回单行单列,单行多列,多行单列

SQL> SELECT * FROM emp

 WHERE (job,sal)=

(SELECT job,sal FROM emp WHERE ename ='FORD') ;

多行多列

1,IN   与 NOT  IN
SELECT * FROM emp WHERE SAL [NOT] IN
SELECT sal FROM emp 
WHERE job = 'MANAGER')  ;


2 、ANY,如果是=ANY,其结果和IN功能是一样的,如果 是>ANY表示比最大的值还要大的,<ANY表示比最大的值还要小的


SQL> SELECT * FROM emp WHERE SAL >ANY (
  2  SELECT sal FROM emp
  3  WHERE job = 'MANAGER')  ;

     EMPNO ENAME                JOB                       MGR HIREDATE
---------- -------------------- ------------------ ---------- --------------
      7839 KING                 PRESIDENT                     17-11月-81
      7902 FORD                 ANALYST                  7566 03-12月-81
      7788 SCOTT                ANALYST                  7566 19-4月 -87
      7566 JONES                MANAGER                  7839 02-4月 -81
      7698 BLAKE                MANAGER                  7839 01-5月 -81


注:一定要保证查询对象中没有NULL

3、ALL的两种操作使用形式

  3.1 >all:比查询中返回的最大值还要大的值

     <all:比查询中返回最小 的值还要小的值

4 、exists () 判断

如果子查询中有数据返回(不管什么数据)表示条件成立,返回相应的值,如果有数据返回就返回数据,如果没有数据就返回没有数据 

使用exists()是只要子数据返回是否有行,有行就是成立,返回相应值 还有NOTEXISTS()

SELECT * FROM EMP WHERE  NOT EXISTS(
SELECT 'HELLO' FROM DUAL WHERE '1' = '21') ;


SELECT * FROM EMP WHERE  EXISTS(
SELECT 'HELLO' FROM DUAL WHERE '1' = '21') ;

IN是对数据进行判断,EXISTS()是对行进行判断

HAVING: 子查询返回 单行单列,而且要使用统计函数进行过滤

FROM:   子查询返回多行多列(表)

SELECT子句:一般返回单选单列 ,并且需要某些查询的时候使用。



  • blogger

版权所有:oldboy ---- 《HAVING函数使用(分组案例使用)子查询
本文地址:http://www.bokeren.cc/post-118.html
除非注明,文章均为 《悠然生活的平淡博客-博客人linux运维之家》 原创转载请注明本文地址,谢谢。


相关推荐

你肿么看?

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。