Oracle数据库01
常用函数
COUNT(*):统计所有的数据量,没有过滤功能
COUNT(字段):统计出指定字段不为null的数据量,有过滤功能
COUNT(DISTINCT 字段):统计指定字段不为空并且去掉重复数据之后的数据量
其实统计函数是为分组查询而服务的,之所以现在没有分组也能使用是因为把所有的数据当成了一组
SUM(字段):计算出指定字段的数据之和(字段是数字才有意义)
AVG(字段):计算出指定字段的平均值(字段是数字才有意义)
MAX(字段):统计出指定的字段中最大值(字段是日期或者数字才有意义)
MIN(字段):统计出指定的字段中最小值(字段是日期或者数字才有意义)
SYSDATE:取得当前日期(SELECT SYSDATE FROM dual;)
分组统计查询
④SELECT * 【显示数据】
①FROM 数据来源,数据来源。。。 【找到数据来源】
②WHERE 过滤条件 【过滤出满足条件的数据】
③GROUP BY 分组字段 【GROUP BY子句,对满足条件的数据进行分组】
⑤ORDER BY 排序字段 排序方式(ASC |DESC) 【指定是否按照排序的方式显示】
SELECT dname,COUNT(*) 人数 --对分组后的数据进行统计
FROM emp e,dept d --数据需要来自两张数据表
WHERE e.deptno=d.deptno --消除笛卡尔积
GROUP BY dname; --按照部门分组
使用统计函数要注意的问题
①如果SELECT子句使用了统计函数同时没有GROUP BY子句那么SELECT子句中只能出现统计函数,不能出现其他任何字段
②如果在SELECT子句中使用了统计函数同时有GROUP BY子句则在SELECT子句中只能出现统计函数和分组的字段。
③如果SELECT子句中使用了嵌套的统计函数,则不管是否有GROUP BY子句那么SELECT子句中不能出现统计函数之外任何字段。
HAVING子句
1、HAVING子句用于对查询表结构进行处理,可用于分组之后,多和GROUP BY一起使用,放在GROUP BY之后,可包含聚合函数。
2、HAVING子句可用于GROUP BY 之后,语法类似于WHERE子句,WHERE子句用于GROUP BY之前。
3、HAVING子句中的字段必须是上层结果表中有的。
4、HAVING子句中可以使用聚合函数,WHERE语句中不可以使用聚合函数
5、HAVING子句执行顺序:WHERE语句>GROUP BY>聚合函数>HAVING
WHERE子句和HAVING子句的区别:
WHERE子句在GROUP BY子句之前执行,不能在WHERE子句中使用统计函数
HAVING子句在GROUP BY之后执行,可以在HAVING子句中对统计函数进行过滤
WHERE子查询
将一个查询的结果作为另一个查询(主查询)的数据来源或者判断条件来查询
SELECT *
FROM emp
WHERE sal<(SELECT AVG(sal) FROM emp);
SELECT AVG(sal) FROM emp; [返回的结果是单行单列类型]
子查询需要用小括号括起来
方式一:
SELECT *
FROM emp
WHERE job=(SELECT job FROM emp WHERE ename=’SCOTT’) AND
sal=(SELECT sal FROM emp WHERE ename=’SCOTT’) AND
ename <> ‘SCOTT’;
方式二:
SELECT *
FROM emp
WHERE (job,sal)=(
SELECT job,sal FROM emp WHERE ename=’SCOTT’ ) AND ename <> ‘SCOTT’;
主查询中的条件判断字段的顺序要子查询中需要查询的字段的顺序保持一致
子查询的返回值是单行多列的结果
sal>any:表示的是sal大于子查中的任意一个值。
sal<any:表示的是sal小于子查中的任意一个值。
ANY:大于最小的,小于最大的。
All:和每一个进行比较(大于最大的,者小于最小的)
HAVING子查询
HAVING子句是对分组统计函数进行过滤的子句,也可以在HAVING子句中使用子查询。
FROM子查询
FROM子句的数据来源不仅仅是数据表,还可以是一个查询的结果。一般FROM子查询的返回类型是多行多列的结果集。
总结:
1、FROM子查询的数据来源是另外一个查询的结果,这个子查询的结果相当于一张临时的数据表
2、必须为子查询定义别名(不写语法也不会出错,但是要规范,以及方便后面的调用)
3、如果要使用子查询中的字段则应该使用“别名.字段名”的方式进行引用。