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.

oracle数据操纵语言(DML)data manipulation language(续集)的更多相关文章

  1. oracle数据操纵语言(DML)data manipulation language

    数据库操纵语言(DML)用于查询和操纵模式对象中的数据,它不隐式地提交当前事务. SELECTINSERTUPDATEDELETECALLEXPLAIN PLANLOCK TABLEMERGE使用算术 ...

  2. 数据库原理及应用-SQL数据操纵语言(Data Manipulation Language)和嵌入式SQL&存储过程

    2018-02-19 18:03:54 一.数据操纵语言(Data Manipulation Language) 数据操纵语言是指插入,删除和更新语言. 二.视图(View) 数据库三级模式,两级映射 ...

  3. Hive 6、Hive DML(Data Manipulation Language)

    DML主要是对Hive 表中的数据进行操作的(增 删 改),但是由于Hadoop的特性,所以单条的修改.删除,其性能会非常的低所以不支持进行级操作: 主要说明一下最常用的批量插入数据较为常用的方法: ...

  4. (让你提前知道软件开发33):数据操纵语言(DML)

    文章2部分 数据库SQL语言 数据操纵语言(DML) 数据操纵语言(Data Manipulation Language,DML)包含insert.delete和update语句,用于增.删.改数据. ...

  5. MySQL之数据操纵语言(DML)

    数据操纵语言(DML) 数据操纵语(Data Manipulation Language),简称DML. DML主要有四个常用功能. 增 删 改 查 insert delete update sele ...

  6. 【转】Hive Data Manipulation Language

    Hive Data Manipulation Language Hive Data Manipulation Language Loading files into tables Syntax Syn ...

  7. 30442数据操纵语言DML

    5.5 SQL的数据操纵功能 5.5.1 数据插入 使用CREATE语句创建的数据表还只是一个“空壳”,表中没有任何数据.利用SQL语言提供的INSERT语句可以完成向数据表插入数据的任务. INSE ...

  8. 【MySQL笔记】数据操纵语言DML

    1.数据插入   INSERT INTO table_name (列1, 列2,...) VALUES(值1, 值2,....),(第二条),(第三条)...   注: 1)如果表中的每一列均有数据插 ...

  9. mysql数据库-mysql数据定义语言DDL (Data Definition Language)归类(六)

    0x01 创建数据库并指定字符集和排序规则 -- 三种实例写法 create database temptab2 character set utf8 collate utf8_general_ci; ...

随机推荐

  1. JavaScript神一样的变量系统

    话说上一篇介绍了JavaScript故事版的身世之谜.看官你估计也明白JavaScript出生之时,就未曾托于重任.布兰登-艾奇估计也没料到今天的JavaScript变得如此重要.要不然,当年他也不会 ...

  2. GET与POST提交

    get是从服务器上获取数据,post是向服务器传送数据. get 是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,[在URL中可以看到].post是通过HTT ...

  3. Ubuntu创建launcher

    创建Launcher 以创建pycharm的launcher为例 创建文件pycharm.desktop 编辑该文件加入如下行: [Desktop Entry] Name=Pycharm #显示名称 ...

  4. 你真的会玩SQL吗?实用函数方汇总

    http://www.cnblogs.com/zhangs1986/p/4917800.html 实用函数方法 由于有些知识很少被用到,但真需要用时却忘记了又焦头烂额的到处找. 现在将这些‘冷门“却有 ...

  5. 常见的Unix指令

    ls -1 列出当前目录下的所有内容(文件/文件夹) pwd 显示当前操作的目录 cd   改变当前操作的目录 who 显示当前用户 clear 清屏 mkdir 新建一个目录 touch 新建一个文 ...

  6. Queue and Message

    #ifndef __QUEUE_H__ #define __QUEUE_H__ #include <stdint.h> #include <stdlib.h> #include ...

  7. WatchKit App Submission Issues

    查看原文: http://leancodingnow.com/watchkit-app-submission-issues/ I submitted a new version of my app P ...

  8. PL/pgSQL RETURNS TABLE 例子

    实验如下: RETURNS TABLE 中的变量名和SQL文中的变量名同名时,执行时会出错: pgsql=# create table sales(itemno integer,quantity in ...

  9. 解决IE6不支持position:fixed属性

    最近在优化网站浮动广告时候遇见了IE6不支持position:fixed属性.上网收集了一下解决方案 比较好的方案就是利用css表达式进行解决 补充:CSS Expression (CSS 表达式), ...

  10. 【6】连续序列和为s

    题目:输入一个整数s,打印出全部和为s的连续整数序列(至少含有2个数).比如输入9,则输出2.3.4和4.5两个序列 方案一:因为序列至少要2个数,则两个数上限值为(1+s)/2,我们能够枚举该序列的 ...