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. 非阻塞同步机制与CAS操作

    锁的劣势 Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程 持有守护变量的锁,都采用独占的方式来访问这些 ...

  2. 结构类模式(二):桥接(Bridge)

    定义 将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化. 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维 ...

  3. Castle IOC容器内幕故事(下)

    主要内容 1.ComponentModelBuilder 和 Contributors 2.Contributors分析 3.Handles分析 4.ComponentActivator分析 一.Co ...

  4. chrome 41 空格  

    chrome 41对半角空格的解析 当做一个汉字宽度来处理了. 导致很多网站出现异常. 目前能想到的方法是删掉用来规范格式的空格. 老版chrome chrome41 和讯网也有这种问题 有更好的处理 ...

  5. Flex Builder 开发语言切换问题

    1.Flex Builder 4.6切换语言 打开\Adobe\Adobe Flash Builder 4.6\FlashBuilder.ini -nlzh_CN-startupeclipse/plu ...

  6. WM_QUIT,WM_CLOSE,WM_DESTROY 消息出现顺序及调用方式

    http://bbs.ednchina.com/BLOG_ARTICLE_3005455.HTM VC中WM_CLOSE.WM_DESTROY.WM_QUIT消息出现顺序及调用方式 wxleasyla ...

  7. WatchKit App Submission Issues

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

  8. discuz问题综合

    1.discuz x2搬家问题:搬家后,需要修改数据库的配置文件,包含:      主要的配置文件有三个:config目录下的config_global.php和config_ucenter.php以 ...

  9. 使用NSData来加载文件

    1. Loading Data from Files and URLs // Assuming that there is a text file at /Examples/Test.txt: NSS ...

  10. kickstart一键自动安装Linux系统

    kickstart,无人值守,自动安装系统.本文介绍kickstart的用法. #安装系统的信息——可以参考 [root@larrywen pdf]# vim ~/anaconda-ks.cfg 第一 ...