- 浏览: 97762 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
鸟气凌人:
最经正在看基础
Oracle PL/SQL中游标和游标变量的使用 -
matraxa:
讲得很清楚,顶一个!
JVM垃圾回收机制总结(1) —基本概念 -
ZavaKid:
顶楼主,通俗易懂。
byw,上面的图用什么软件画的?
JVM垃圾回收机制总结(1) —基本概念 -
47478220:
对这里还不太了解,学习了。
Java 虚拟机体系结构
一、Group by
Group by子句(利用group by子句分组数据,当select语句中使用到组函数和字段一起连用时会用到group by,否则会出现错误)
Group by把select查询的结果集分成几个小组,这个group by子句可以跟在where后面且在having前面。Group by子句也会触发排序操作,会按分组字段排序。
格式:
Select [组函数和分组的字段].....from 表名 group by[字段1],[字段2],。。。。。。;
Oracle sql语句顺序:
a. Select 显示字段或组函数 from 表名
b. [ Where 过滤条件] (不能使用组函数 ,不能使用列别名)
c. [Group by 分组条件] (不能使用列别名,只可是字段名,不可是组函数)
d. [Having 分组的过滤条件] (可以使用组函数)
e. [ Order by 排序 ] (可以使用列别名,可以使用组函数)
说明:其中的[ ]是可选项
注意:group by分组不能用列的别名
注意:只要写了group by子句,select后就只能用group by之后的字段或者是组的函数。Having子句可以过滤组函数结果或者分组的信息,并且写在group by子句后。
使用group by子句时,必须满足下面的一些原则:
a、在select子句的后面,只能有两种类型的表达式,一种是组函数,一种是出现在group by子句后面的列名。
b、没有出现在group by子句后面的列名不能出现在select子句中非组函数表达式中,但是出现在group by子句后面的列名可以不出现在select子句中非组合函数表达式中。
c、如果使用了where子句,那么所有参加分组计算的数据必须首先满足where子句指定的条件。
d、在默认情况下,系统按照group by子句中指定的列升序排列,但是可以使用order by子句指定新的排列顺序。
使用group by 常见的错误:
a、如果在select语句中没有出现group by子句,那么不能在select子句中同时出现单个列名和组函数的混合现象。
b、如果希望限制分组中的数据,那么可以使用having子句而不能使用where子句。即having中可以出现组函数而where不能出现组函数。
注意1:在没有group by时,select后不能把普通字段和组函数同时使用
注意2:where子句只能够过滤记录,放单行函数。Where后面跟随的条件是对所有数据的过滤的条件,在where子句中不能出现组函数。
注意3:如果希望按照多个列分组,那么会在group by子句后面出现多个列名。这些列名称得顺序非常重要。因为不同的顺序有不同的结果。
例子1:
查询求各个部门的最小,最高,工资之和
select dept_id,min(salary),max(salary),sum(salary) from s_emp group by dept_id;
例子2:
查询求各个部门的最小,最高,工资之和,部门名称
select e.dept_id,d.name,min(salary),max(salary),sum(salary) from s_emp e , s_dept d where e.dept_id=d.id group by e.dept_id,d.name;
例3:
找出各个部门的平均工资
select dept_id,avg(salary) from s_emp group by dept_id;
注:在没有group by时,select后不能把普通字段和组函数同时使用
例4:
求各个部门不同职位有多少人
select dept_id,title,count(*) from s_emp group by dept_id,title;
例5:求除了42部门以外的各个部门的平均工资
select dept_id,avg(salary) from s_emp where dept_id<>42 group by dept_id;
例7:求各个部门的平均工资
select max(d.name),max(r.name),avg(salary) from s_emp e,s_dept d,s_region r where e.dept_id=d.id and d.region_id=r.id group by dept_id;
二、Having
Having子句(是对分组之后的数据进行过滤,所以使用having时必须用group by先分组)
Having中的组函数可以不是select 中的组函数,利用having子句过滤分组的行。
注意:having要先过滤掉不需要的记录,然后再进行分组操作,提高效率。having子句可以过滤组函数结果或是分组的信息,且写在group by子句后。
例:
求平均工资大于2000的部门
select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>2000;
三、组函数:
1、Oracle 服务器按下面的顺序求子句的值:
a. 如果语句包含一个 WHERE 子句,服务器建立侯选行。
b. 服务器确定在 GROUP BY 子句中指定的组。
c. HAVING 子句进一步约束不满足在 HAVING 子句中分组标准的结果分组。
2、组函数的类型:
•AVG 平均值
•COUNT 计数
•MAX 最大值
•MIN 最小值
•STDDEV 标准差
•SUM 合计
•VARIANCE 方差
a.所有组函数忽略空值。为了用一个值代替空值,用 NVL、NVL2 或 COALESCE 函数。
b.DISTINCT 使得函数只考虑不重复的值;ALL 使得函数考虑每个值,包括重复值。默认值是 ALL ,因此不需要指定。
c.用于函数的参数的数据类型可以是 CHAR、VARCHAR2、NUMBER 或 DATE。
d.当使用 GROUP BY 子句时,Oracle 服务器隐式以升序排序结果集。为了覆盖该默认顺序,DESC 可以被用于 ORDER BY 子句。
使用类型:可以使用MIN 和MAX 用于任何数据类型,AVG、SUM、VARIANCE 和 STDDEV 函数只能被用于数字数据类型。
COUNT 函数
COUNT 函数有三中格式:
COUNT(*) 返回select语句的标准行,包括重复行,空值列的行
COUNT(expr) 由 expr 指定的非空值的数。
COUNT(DISTINCT expr) 返回在列中的由 expr 指定的唯一的非空值的数。
在组函数中使用NVL 函数: NVL 函数强制组函数包含空值
Java代码
SELECT AVG(NVL(commission_pct, 0))FROM employees;
四、多于一个列的分组
显示在每个部门中付给每个工作岗位的合计薪水的报告。(先按部门分组,再按部门下工作岗位分组)
Java代码
SELECT department_id dept_id, job_id, SUM(salary)FROM employeesGROUP BY department_id, job_id ;
SELECT 子句指定被返回的列:
部门号在 EMPLOYEES 表中
Job ID 在 EMPLOYEES 表中
你在 GROUP BY 子句中指定的组中所有薪水的合计
FROM 子句指定数据库必须访问的表:EMPLOYEES 表。
GROUP BY 子句指定你怎样分组行:
首先,用部门号分组行。
第二,在部门号的分组中再用 job ID 分组行。
五、非法使用组函数:
1.在SELECT 列表中的任何列或表达式(非计算列)必须在GROUP BY 子句中,在GROUP BY 子句中的列或表达式不必在SELECT 列表中。
Java代码
SELECT department_id, COUNT(last_name)FROM employees;
SELECT department_id, COUNT(last_name)
*
ERROR at line 1:ORA-00937: not a single-group group
SELECT department_id, COUNT(last_name)FROM employees; SELECT department_id, COUNT(last_name) * ERROR at line 1:ORA-00937: not a single-group group
无论何时,你在同一个 SELECT 语句中使用单独的列 (DEPARTMENT_ID) 和组函数 (COUNT) 的混合时,你必须包括一个 GROUP BY 子句来指定单独的列 (在本例中,DEPARTMENT_ID)。如果缺少 GROUP BY,将会出现错误信息 “not a single-group group function”,并且一个星号 (*) 位于有问题的列的下面。你可以添加 GROUP BY 子句来纠正幻灯片中的这个错误。
Java代码
ELECT department_id, count(last_name)
FROM employees
GROUP BY department_id;
SELECT department_id, count(last_name) FROM employees GROUP BY department_id;
2.非法使用Group 函数的查询
不能使用WHERE 子句来约束分组,可以使用HAVING 子句来约束分组,在WHERE 子句中不能使用组函数作为条件,只能用非计算列。
例子:
Java代码
SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id;
WHERE AVG(salary) > 8000
*
ERROR at line 3:ORA-00934: group function is not allowed here
SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id; WHERE AVG(salary) > 8000 * ERROR at line 3:ORA-00934: group function is not allowed here
WHERE 子句不能用于限制组。幻灯片中的 SELECT 子句结果出现错误。因为使用 WHERE 子句限制了那些只有部门的平均薪水大于 $8,000 的分组才能显示。你可以用 HAVING 约束组来纠正幻灯片中的错误。
Java代码
SELECT department_id, AVG(salary)
FROM employees;
HAVING AVG(salary) > 8000
GROUP BY department_id;
SELECT department_id, AVG(salary) FROM employees; HAVING AVG(salary) > 8000 GROUP BY department_id;
6.约束分组结果
用HAVING 子句约束分组:
1.行被分组
2.应用组函数
3.匹配HAVING 子句的组被显示
例子:
Java代码
SELECT job_id, SUM(salary) PAYROLL FROM employees
WHERE job_id NOT LIKE '%REP%' GROUP BY job_id
HAVING SUM(salary) > 13000 ORDER BY SUM(salary);
SELECT job_id, SUM(salary) PAYROLL FROM employees WHERE job_id NOT LIKE '%REP%' GROUP BY job_id HAVING SUM(salary) > 13000 ORDER BY SUM(salary);
7.嵌套组函数
求每个部门的最大平均薪水。
Java代码
select max(avg(salary)) from employees group by department_id;
发表评论
-
Oracle中函数使用技巧(2) - NULLIF
2013-07-09 01:42 821NULLIF 函数 功能 通过比较表达式提供 ... -
Oracle中函数使用技巧(1) - Decode
2013-07-09 01:38 692ecode()函数是ORACLE PL/SQL是功能强大的函 ... -
Oracle数据库备份与恢复的三种方法
2013-07-09 00:56 659Oracle数据库有三种标准的备份方法,它们分别是导出/导 ... -
Oracle 字符集详解
2013-07-09 00:31 606一、什么是Oracle字符集 Oracle字 ... -
Oracle中逻辑导出Exp/导入Imp详解
2013-07-09 00:27 967导入/导出是O ... -
Oracle触发器详细介绍(二)
2011-08-11 15:46 1347Sql代码 --触发器 trigger ... -
Oracle 游标的使用(二)
2011-08-11 15:44 1237Sql代码 --ref 游标 /* ... -
exp/imp命令详解
2011-06-27 16:45 1169exp/imp两个命令可以说是oracle中最常用的命令了。 ... -
ora-00020超出最大进程数的解决方法
2011-06-23 09:42 1794一般原因是因为你的应用程序的连接数超过了ORACLE系统设 ... -
ORACLE中客户端连接服务器端常见问题与解决
2011-06-23 09:36 1056要排除客户端与服务器 ... -
Oracle 常用数据字典
2011-06-23 09:33 888--Oracle 数据字典 --Oracle 数据字典 ... -
ORACLE函数大全
2011-04-14 16:55 657SQL中的单记录函数1.ASCII返回与指定的字符对应的十进制 ... -
ORACLE面试题及答案
2011-04-14 16:54 14741.解释冷备份和热备份 ... -
Oracle(SQL)优化
2011-04-14 16:47 8091. 选用适合的优化器 Ora ... -
ORACLE AUTOTRACE介绍
2011-04-14 16:46 1056AUTOTRACE是一项 SQL*Plus 功 ... -
Oracle数据字典
2011-04-14 16:44 772oracle数据库系统是一个复杂的软件系统。如果不了解 ... -
Oracle SQL合并查询笔记
2010-11-14 10:45 1107在Oracle sql查询过程当中,可以使用 ... -
Oracle SQL子查询笔记
2010-11-14 00:53 2387子查询是指嵌入在其他SQL语句中的SELECT语 ... -
Oracle 连接查询学习笔记
2010-11-13 20:51 772一、内连接和外连接 内连接用于返回满足连接条件的记录;而 ... -
Oracle 统计分组语句
2010-11-12 17:24 1345在应用系统开发中,进行需要统计数据库中的数据,当执 ...
相关推荐
总结了开发中Oracle常用到的一些函数,希望对大家有所帮助。 1、单行函数:表的每行都会有一个结果(字符函数、数字函数、日期函数、转换函数) 单行函数可以嵌套。嵌套函数的执行顺序是由内到外。 2、多行函数:表...
PLSQL开发笔记和小结;分析函数简述 ROW_NUMBER () OVER([partition_clause] order_by_clause) dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值...
分析函数是 Oracle 专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计。本文总结了若干分析函数的使用方式,供大家学习参考,有...
第五章:分组函数 第六章:数据限定和排序 第七章:复杂查询(上):多表连接技术 第八章:复杂查询(下):子查询 第二部分:用户及数据库对象 第九章:用户访问控制 第十章:Oracle的事务和锁 第十一章:...
1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42...
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...
通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 ...
通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 ...
(1) 了解Oracle的工作环境和基本使用方法。 (2) 练习标准SQL的数据操作,查询命令及其查询优化。 (3) 学会使用高级SQL命令,排序、分组、自连接查询等。 (4) 学会使用SQL*PLUS命令显示报表,存储到文件等。 【实验...
1.6 小结 第2章使用SQL*Plus工具 2.1 启动、退出SQL*Plus 2.1.1启动、退出SQL*Plus 2.1.2 设置操作界面风格 2.1.3 获取SQL*Plus命令的帮助 2.2 编辑、运行语句和命令 2.3 DESCRIBE命令 2.4...
常见错误: ORA-00001:违反唯一约束条件(主键错误) ORA-00028:无法连接数据库进程 ORA-00900:无效sql语句 ORA-00904:字段名写错或是建表时最后一个字段有逗号 ...ORA-00937:不是单组分组函数 ORA-00942:
4.3字符串是大小写敏感的,在比较时严格区分大小写 8 4.4 where子句后面可以跟多个条件表达式 8 4.5 between and运算符 8 4.6 in运算符(多值运算符) 8 4.7 like运算符 9 4.8 is null运算符 9 4.9比较和逻辑运算符...
1.6 认证小结 1.7 本章 测试题 1.7.1 自测题 1.7.2 实验题 1.7.3 自测题答案 1.7.4 实验题答案 第2章 使用SQLSELECT语句检索数据 2.1 列出SQLSELECT语句的性能 2.1.1 SQLSELECT语句介绍 2.1.2 ...
1.5 本章小结 8 1.6 测试用例 8 第2章 表扫描 9 2.1 入门 10 2.2 提高 14 2.2.1 块大小的影响 14 2.2.2 CPU成本计算 16 2.2.3 CPU成本计算的作用 22 2.3 BCHR 24 2.4 并行执行 27 2.5 索引快速全扫描 30 2.6 分区 32...
文章目录数据库介绍MySql介绍添加数据导入数据查询数据内连接左外连接/右外连接子查询约束函数聚合函数分组函数数学函数字符串函数日期时间函数条件判断函数系统信息函数加密函数格式化函数自定义函数视图事务存储...
1.4 小结 7 第2章 检索数据 8 2.1 SELECT语句 8 2.2 检索单个列 9 2.3 检索多个列 10 2.4 检索所有列 11 2.5 小结 12 第3章 排序检索数据 13 3.1 排序数据 13 3.2 按多个列排序 15 3.3 按列位置排序 15 ...
17.5 小结 第18章 事务控制与并发处理 18.1 SQL事务控制 18.1.1 事务控制的引入 18.1.2 事务的特性 18.1.3 SQL中与事务有关的语句 18.2 事务控制的具体实现 18.2.1 开始事务 18.2.2 SET ...
学习过 SQL 的人都知道,使用聚合函数(AVG、SUM、COUNT、MIN/MAX 等)和分组操作(GROUP BY)可以对数据进行基本的统计分析,例如统计公司员工的人数、每个部门的平均月薪等。如果想要回顾这些基础概念,可以参考这...