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. 开发extjs常用的插件

    Spket是目前支持Ext 2.0最为出色的IDE. 它采用.jsb project file 文件并将继承于基类和所有文档的内容嵌入到生成代码提示的Script doc中.注:不支持配置项的代码提示 ...

  2. 获取 CPU 序列号

    function GetCpuID: string; var _eax, _ebx, _ecx, _edx: Longword; s, s1, s2: string; begin asm push e ...

  3. Softmax 回归原理介绍

    考虑一个多分类问题,即预测变量y可以取k个离散值中的任何一个.比如一个邮件分类系统将邮件分为私人邮件,工作邮件和垃圾邮件.由于y仍然是一个离散值,只是相对于二分类的逻辑回归多了一些类别.下面将根据多项 ...

  4. linux tar.gz zip 解压缩 压缩命令

    http://apps.hi.baidu.com/share/detail/37384818 download ADT link http://dl.google.com/android/ADT-0. ...

  5. Java读取Properties配置文件

    1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,使用键值对的形式来保存属性集.不过Properties的键和值都是字符串 ...

  6. 用Python编写九九乘法表考虑print自动换行问题

    编写了一个简单的小程序九九乘法表,代码如下: for i in range(1,10): for j in range(1,i+1): print(" %d*%d=%d" % (j ...

  7. Spark目录

    1. Spark1.0.0 应用程序部署工具spark-submit 2. Spark Streaming的编程模型 3. 使用java api操作HDFS文件 4. 用SBT编译Spark的Word ...

  8. [STAThread]的含义

    Posted on 2007-07-07 10:06 桦林 阅读(33100) 评论(10) 编辑 收藏 [STAThread]STAThread:Single     Thread     Apar ...

  9. Linux中的svn客户端RabbitVCS-2

    我们都知道,自从svn出道以来,很多人都预言,cvs将会被其取代.就如同他们预言maven要取代ant一样.可见,svn的流行.在Windows中,最常用到的开源免费的svn客户端就是Tortoise ...

  10. [置顶] HashMap HashTable HashSet区别剖析

    HashMap.HashSet.HashTable之间的区别是Java程序员的一个常见面试题目,在此仅以此博客记录,并深入源代码进行分析: 在分析之前,先将其区别列于下面 1:HashSet底层采用的 ...