SQL查询语句(SELECT)进阶分组函数(Group Functions):对多行进行操作,并为每一组给出一个结果。
AVG([DISTINCT|ALL] expression) 平均值
COUNT ({ * | [DISTINCT|ALL] expression}) 含有非NULL的行数
MAX ([DISTINCT|ALL] expression) 最大值
MIN ([DISTINCT|ALL] expression) 最小值
STDDEV ([DISTINCT|ALL] expression) 统计标准差
SUM ([DISTINCT|ALL] expression) 加总
VARIANCE ([DISTINCT|ALL] expression) 统计方差
例子
SQL> SELECT AVG(sal), MAX(sal),
2 MIN(sal), SUM(sal)
3 FROM emp
4 WHERE job LIKE 'SALES%';
AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)
-------- --------- --------- ---------
1400 1600 1250 5600
分组函数(Group Functions):数据分组使用GROUP BY子句将表中的行划分成小组语法:
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
SQL> SELECT deptno, AVG(sal)
2 FROM emp
3 GROUP BY deptno;
DEPTNO AVG(SAL)
--------- ---------
10 2916.6667
20 2175
30 1566.6667
分组函数(Group Functions):数据分组(用多列)
SQL> SELECT deptno, job, sum(sal)
2 FROM emp
3 GROUP BY deptno, job;
DEPTNO JOB SUM(SAL)
--------- --------- ---------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 6000
20 CLERK 1900
...
9 rows selected.
分组函数(Group Functions):非法使用分组函数
在WHERE子句中不能直接使用组函数。
在HAVING子句中可以直接使用组函数。
SQL> SELECT deptno, AVG(sal)
2 FROM emp
3 WHERE AVG(sal) > 2000(报错)
4 GROUP BY deptno;
WHERE AVG(sal) > 2000
*
ERROR at line 3:
ORA-00934: group function is not allowed here
限制选择租
SQL查询语句(SELECT)进阶
分组函数(Group Functions):限制选择组
使用HAVING子句来限制选择组
在HAVING子句中能够使用组函数
语法:
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
分组函数(Group Functions):限制选择组(HAVING子句)[请注意group by having 以及 order by 的顺序 ]
SQL> SELECT job, SUM(sal) PAYROLL
2 FROM emp
3 WHERE job NOT LIKE 'SALES%'
4 GROUP BY job
5 HAVING SUM(sal)>5000
6 ORDER BY SUM(sal);
JOB PAYROLL
--------- ---------
ANALYST 6000
MANAGER 8275
分组函数(Group Functions):组函数嵌套
SQL> SELECT max(avg(sal))
2 FROM emp
3 GROUP BY deptno;
MAX(AVG(SAL))
-------------
2916.6667
子查询( subquery ):
子查询(内部查询)在主查询之前执行。
子查询的查询结果提供给主查询(外部查询)使用。
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
子查询( subquery ):使用原则
子查询应该封装在括号内。
子查询在比较条件的右边。
子查询中一般不使用ORDER BY子句。
单行子查询使用单行操作符,对行子查询使用多行操作符。
子查询( subquery ):非法的子查询
SQL> SELECT empno, ename
2 FROM emp
3 WHERE sal =
4 (SELECT MIN(sal)(报错)
5 FROM emp
6 GROUP BY deptno);
ERROR:
ORA-01427: single-row subquery returns more thanone row
no rows selected
子查询( subquery ):多行子查询
返回多行查询结果
使用多行(multiple-row)比较操作
举例
SQL> SELECT e.empno, e.ename
2 FROM emp e
3 WHERE EXISTS (SELECT 'X'
4 FROM dept d
5 WHERE e.deptno=d.deptno
6 and d.loc= 'NEW YORK');
Insert 新增加行到表中
使用上面的语法仅仅只能插入一行数据
SQL> INSERT INTO dept (deptno, dname, loc)
2 VALUES (50, 'DEVELOPMENT', 'DETROIT');
1 row created.
插入SYSDATE函数值, SYSDATE函数返回当前的日期和时间。
SQL> INSERT INTO emp (empno, ename, job,
2 mgr, hiredate, sal, comm,
3 deptno)
4 VALUES (7196, 'GREEN', 'SALESMAN',
5 7782, SYSDATE, 2000, NULL,
6 10);
1 row created.
在插入多行数据。
SQL> INSERT INTO managers(id, name, salary, hiredate)
2 SELECT empno, ename, sal, hiredate
3 FROM emp
4 WHERE job = 'MANAGER';
3 rows created.
注:不能使用VALUES子句
UPDATE语法:
UPDATE table
SET column = value [, column = value]
[WHERE condition];
SQL> UPDATE emp
2 SET deptno = 20
3 WHERE empno = 7782;
1 row updated.
使用子查询更新行的多列数据
SQL> UPDATE emp
2 SET (job, deptno) =
3 (SELECT job, deptno
4 FROM emp
5 WHERE empno = 7499)
6 WHERE empno = 7698;
1 row updated.
使用子查询更新行数据
SQL> UPDATE employee
2 SET deptno = (SELECT deptno
3 FROM emp
4 WHERE empno = 7788)
5 WHERE job = (SELECT job
6 FROM emp
7 WHERE empno = 7788);
2 rows updated.