zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    设计模式-观察者模式
    获取ubuntu中软件包的有用地址
    vim 简单命令
    adb logcat 日志过滤
    shell编程——
    shell编程——参数传递
    Chromecast
    linux 广播
    【转】Git命令解说
    linux 多播
  • 原文地址:https://www.cnblogs.com/pacoson/p/3522285.html
Copyright © 2011-2022 走看看