oracle数据操纵语言(DML)data manipulation language(续集)

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 than one 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.

posted @ 2014-01-16 12:04  PacosonSWJTU  阅读(280)  评论(0编辑  收藏  举报