oracle中group by用法

oracle中group by用法

摘要:

1.Oracle 中 Group By 概述

2.Group By 的基本语法

3.Group By 的常见用法

1.按某一列分组

2.按多列分组

3.使用聚合函数

4.使用 rollup 和 cube

5.使用 having 子句

4.Group By 的高级用法

1.去除重复记录

2.分组排序

3.结合其他 SQL 语句

5.Group By 在实际应用中的案例

正文:

在 Oracle 数据库中,Group By 是一个非常重要的 SQL 语句组成部分,它可以帮助我们对查询结果进行分组和汇总。本文将详细介绍 Oracle 中

Group By 的用法,包括基本语法、常见用法、高级用法以及在实际应用中的案例。

1.Oracle 中 Group By 概述 Group By 是 SQL 语句中用于对查询结果进行分组和汇总的关键字。通过使用 Group By,我们可以将查询结果按照某一列或多个列进行分组,并对每组数据进行汇总。

2.Group By 的基本语法

在 Oracle 中,Group By 的基本语法如下:

```sql

SELECT column1, column2, aggregate_function(column)

FROM table_name

WHERE condition

GROUP BY column1, column2

ORDER BY column1, column2;

```

其中,`aggregate_function` 可以是 `COUNT`、`SUM`、`AVG`、`MAX`、`MIN` 等聚合函数,`column1` 和 `column2` 是需要分组的列,`condition` 是查询条件,`ORDER BY` 子句用于对分组后的结果进行排序。

3.Group By 的常见用法

接下来,我们将介绍 Group By 的常见用法:

3.1 按某一列分组

```sql

SELECT department, COUNT(employee_id)

FROM employees

GROUP BY department; ```

上述语句将按照 `department` 列对 `employees` 表进行分组,并计算每个部门的员工数量。

3.2 按多列分组

```sql

SELECT department, job_title, COUNT(employee_id)

FROM employees

GROUP BY department, job_title;

```

上述语句将按照 `department` 和 `job_title` 列对 `employees` 表进行分组,并计算每个部门、职位的员工数量。

3.3 使用聚合函数

```sql

SELECT department, SUM(salary)

FROM employees

GROUP BY department;

```

上述语句将按照 `department` 列对 `employees` 表进行分组,并计算每个部门的员工总薪资。

3.4 使用 rollup 和 cube

```sql

SELECT department, SUM(salary) FROM employees

GROUP BY department

ROLLUP(department);

```

上述语句将按照 `department` 列对 `employees` 表进行分组,并计算所有部门的员工总薪资。

```sql

SELECT department, SUM(salary)

FROM employees

GROUP BY department, job_title

CUBE(department, job_title);

```

上述语句将按照 `department` 和 `job_title` 列对 `employees` 表进行分组,并计算所有部门、职位的员工总薪资。

3.5 使用 having 子句

```sql

SELECT department, COUNT(employee_id)

FROM employees

GROUP BY department

HAVING COUNT(employee_id) > 10;

```

上述语句将按照 `department` 列对 `employees` 表进行分组,并筛选出员工数量大于 10 的部门。

4.Group By 的高级用法

除了上述常见用法外,Group By 还有一些高级用法,如下:

4.1 去除重复记录

```sql

SELECT department, COUNT(DISTINCT employee_id)

FROM employees

GROUP BY department;

```

上述语句将按照 `department` 列对 `employees` 表进行分组,并计算每个部门的不同员工数量。

合集下载

oracle中insertall的用法

oracle中insertall的用法

oracle中insertall的⽤法

oracle中insert all的⽤法

现在有个需求:将数据插⼊多个表中。怎么做呢?可以使⽤insert into语句进⾏分别插⼊,但是在oracle中有⼀个更好的实现⽅式:使⽤

insert all语句。

insert all语句是oracle中⽤于批量写数据的 。insert all分⼜为⽆条件插⼊和有条件插⼊。

⼀、表和数据准备

--创建表

CREATE TABLE stu(

ID NUMBER(3),

NAME VARCHAR2(30),

sex VARCHAR2(2)

);

--删除表

drop table stu;

drop table stu1;

drop table stu2;

--向stu表中插⼊数据

INSERT INTO stu(ID, NAME, sex) VALUES(1, '成都', '⼥');

INSERT INTO stu(ID, NAME, sex) VALUES(2, '深圳', '男');

INSERT INTO stu(ID, NAME, sex) VALUES(3, '上海', '⼥');

--复制表结构创建表stu1,stu2

CREATE TABLE stu1 AS SELECT t.* FROM stu t WHERE 1 = 2;

CREATE TABLE stu2 AS SELECT t.* FROM stu t WHERE 1 = 2;

--查询表

select * from stu;

select * from stu1;

select * from stu2;

⼆、insert all⽆条件插⼊

将stu表中的数据插⼊stu1和stu2表中可以这样写

insert all

into stu1 values(id,name,sex)

into stu2 values(id,name,sex)

select id,name,sex from stu;

三、insert all有条件插⼊

oracle中的mergeinto用法解析

oracle中的mergeinto用法解析

oracle中的mergeinto⽤法解析

oracle中的merge into⽤法解析

merge into的形式

MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)

WHEN MATCHED THEN

[UPDATE sql]

WHEN NOT MATCHED THEN [INSERT sql]

作⽤:判断B表和A表是否满⾜on条件,如果满⾜则⽤B表去更新A表,如果不满⾜,则将B表数据插⼊A表,但有很多可选项。

例如:

1:正常模式

2:只update或者只insert

3:带条件的update或带条件的insert

4:全插⼊insert实现

5:带delete的update -------------------不做讲解

⼀:正常模式

例如:

MERGE INTO A_MERGE A

USING (select B.AID,,B.YEAR from B_MERGE B) C

ON (A.id=C.AID)

WHEN MATCHED THEN UPDATE SET A.YEAR=C.YEAR

WHEN NOT MATCHED THEN

INSERT(A.ID,,A.YEAR) VALUES(C.AID,,C.YEAR);

commit;

解析:

1:被更新的表写在MEGER INTO之后

2:更新来源数据表写在USING之后,并将相关字段查询出来,为查询结果定义别名

3:ON之后表⽰更新满⾜的条件

4:WHEN MATCHED THEN:表⽰当满⾜条件时要执⾏的操作。

5:UPDATE SET 被更新表.被更新字段 = 更新表.更新字段---此更新语句不同于常规更新语句

6:WHEN NOT MATCHED THEN:表⽰当不满⾜条件时要执⾏的操作。

Oracle中union的用法

Oracle中union的用法

Oracle中union的⽤法

UNION 指令的⽬的是将两个 SQL 语句的结果合并起来,可以查看你要的查询结果.

例如:

SELECT Date FROM Store_Information

UNION

SELECT Date FROM Internet_Sales

注意:union⽤法中,两个select语句的字段类型匹配,⽽且字段个数要相同,如上⾯的例⼦,在实际的软件开发过程,会遇到更复杂的情况,具体请看

下⾯的例⼦

select '1' as type,FL_ID,FL_CODE,FL_CNAME,FLDA.FL_PARENTID from FLDA

WHERE ZT_ID=2006030002

union

select '2' as type,XM_ID,XM_CODE ,XM_CNAME ,FL_ID from XMDA

where exists (select * from (select FL_ID from FLDA WHERE ZT_ID=2006030002 ) a where XMDA.fl_id=a.fl_id)

order by type,FL_PARENTID ,FL_ID

这个句⼦的意思是将两个sql语句union查询出来,查询的条件就是看XMDA表中的FL_ID是否和主表FLDA⾥的FL_ID值相匹配,(也就是存在).

UNION在进⾏表链接后会筛选掉重复的记录,所以在表链接后会对所产⽣的结果集进⾏排序运算,删除重复的记录再返回结果。

在查询中会遇到 UNION ALL,它的⽤法和union⼀样,只不过union含有distinct的功能,它会把两张表了重复的记录去掉,⽽union all不会,所以从

效率上,union all 会⾼⼀点,但在实际中⽤到的并不是很多.

表头会⽤第⼀个连接块的字段。。。。。。。。。。

⽽UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数

Oracle中Using用法

Oracle中Using用法

Oracle中Using用法

1. 静态SQLSQL与动态SQL

Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理。通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式。

本文主要就动态SQL的开发进行讨论,并在最后给出一些实际开发的技巧。

2. 动态SQL程序开发

理解了动态SQL编译的原理,也就掌握了其基本的开发思想。动态SQL既然是一种”不确定”的SQL,那其执行就有其相应的特点。Oracle中提供了Execute immediate语句来执行动态SQL,语法如下:

Excute immediate 动态SQL语句 using 绑定参数列表 returning into 输出参数列表;

对这一语句作如下说明:

1) 动态SQL是指DDL和不确定的DML(即带参数的DML)

2) 绑定参数列表为输入参数列表,即其类型为in类型,在运行时刻与动态SQL语句中的参数(实际上占位符,可以理解为函数里面的形式参数)进行绑定。

3) 输出参数列表为动态SQL语句执行后返回的参数列表。

4) 由于动态SQL是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。

为了更好的说明其开发的过程,下面列举一个实例:

设数据库的emp表,其数据为如下:

ID NAME SALARY

100 Jacky 5600

101 Rose 3000

102 John 4500

要求:

SQL中order by 、group by 、having的用法区别

SQL中order by 、group by 、having的用法区别

order by 、group by 、having的用法区别

order by 从英文里理解就是行的排序方式,默认的为升序。 order by

后面必须列出排序的字段名,可以是多个字段名。

group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。

什么是“聚合函数”?

像sum()、count()、avg()等都是“聚合函数”

使用group by 的目的就是要将数据分类汇总。

一般如:

select 单位名称,count(职工id),sum(职工工资) form [某表]

group by 单位名称

这样的运行结果就是以“单位名称”为分类标志统计各单位的职工人数和工资总额。

在sql命令格式使用的先后顺序上,group by 先于 order by。

select 命令的标准格式如下:

SELECT select_list

[ INTO new_table ]

FROM table_source

[ WHERE search_condition ]

[ GROUP BY group_by_expression ]

[ HAVING search_condition ]

1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使 2 用

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)

例如,有如下数据库表:

A B

1 abc

1 bcd

1 asdfg

如果有如下查询语句(该语句是错误的,原因见前面的原则)

select A,B from table group by A

该查询语句的意图是想得到如下结果(当然只是一相情愿)

A B

abc

1 bcd

asdfg

Oracle中having、group by的用法

Oracle中having、group by的用法

Having

这个是用在聚合函数的用法。当我们在用聚合函数的时候,一般都要用到

GROUP BY 先进行分组,然后再进行聚合函数的运算。运算完后就要用到

HAVING 的用法了,就是进行判断了,例如说判断聚合函数的值是否大于某一

个值等等。

select customer_name,sum(balance)

from balance

group by customer_name

having balance>200; yc_rpt_getnew

order by 、group by 、having的用法区别

order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须

列出排序的字段名,可以是多个字段名。

group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用

时至少需要一个分组标志字段。

什么是“聚合函数”?

像sum()、count()、avg()等都是“聚合函数”

使用group by 的目的就是要将数据分类汇总。

一般如:

select 单位名称,count(职工id),sum(职工工资) form [某表]

group by 单位名称

1 这样的运行结果就是以“单位名称”为分类标志统计各单位的职工人数和工资总

额。

在sql命令格式使用的先后顺序上,group by 先于 order by。

select 命令的标准格式如下:

SELECT select_list

[ INTO new_table ]

FROM table_source

[ WHERE search_condition ]

[ GROUP BY group_by_expression ]

[ HAVING search_condition ]

1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须

浅谈Oracle数据库中Merge Into的用法

浅谈Oracle数据库中Merge Into的用法 曹国强 (云南省楚雄师范学院) 摘要:Merge Into语句是Oracle从9j开始新增的一种语法,是Oracle 中的一个非常有用的功能,它主要用来合并update和insert语句,即用一个 表中的数据来修改或插入到另一个表中,是update还是insert主要依据于 所指定的条件判断的,它的主要原则是“有则更新,无则插入”,比如说要用 Merge Into来实现用B表来更新A表中的数据,如果A表中没有,贝0把B 表的数据插入A表。在使用DBMS过程中,我们总是难以避免的遇到像这样 的需求,如果不使用Merge Into语句,我们将不得不在程序中增加大段的 代码,这样实现起来不仅费时麻烦而且容易出错。 关键词:用途语法操作改进 1 Merge Into语句在Oracle中的用途 Merge Into语句是Oracle从9i开始新增的一种语法,是Ora— cle中的一个非常有用的功能,它类似干MySQL中的insert into on duplicate key ̄ 单从字面意思上来看,Merge是合并、兼并的意思,顾名思义, Merge Into的用途就是对目标表进行匹配,并根据是否匹配条件进 行分别处理,它主要用来合并Update和Insert语句,即用一个表中 的数据来修改或插入到另一个表中。通过Merge Into语句,我们能 够在~个语句中对一个表同时执行Insert和Update操作,根据这 个表或子查询的连接条件对另外一张表进行查询,连接条件匹配上 的进行Update操作,并且在其后面还可接删除操作,无法匹配的执 行lnsert,它能减少执行多条Insert和Update语句,且插入或者修 改的操作取决于on子句的条件。这个语法仅需要一次全表扫描就 完成了全部工作,执行效率要高于Insert+Update。 2 Merge Into的语法和基本操作 2.1语法 MERGE INTO[your table—name】Irename your table here] USING([write your query here])[rename your query—sql and using just like a table] ON([conditional expression here1 AN D【…】_..) WHEN MATHED THEN 『here you can execute some update sql or something else 1 WHEN N0T MATHED THEN [execute somethinq else here!】 其中:  ̄into子句:指定所要修改或者插入数据的目标表 ②using子句:指定用来修改或者插入的数据源。数据源可以是 表、视图或者一个子查询语句。 ⑧0n子句:指定执行插入或者修改的满足条件。在目标表中符 合条件的每一行,oracle用数据源中的相应数据修改这些行。对于不 满足条件的那些行,oracle则插入数据源中相应数据。 @when matched l not matched子句:通知oracle如何对满 足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。  ̄merge—update子句:执行对目标表中的字段值修改。当在符 合on子句条件的情况下执行。如果修改子句执行,则目标表上的修 改触发器将被触发。 限制:当修改一个视图时,不能指定一个default值。 ( ̄merge_insert子句:执行当不符合on子句条件时,往目标表 中插入数据。如果插入子句执行,则目标表上插入触发器将被触发。 限制:当修改一个视图时,不能指定一个default值。 例:教务处对计算机专业学生的《算法与数据结构》成绩做了部 分调整,现在要把调整后的成绩更新到原数据表中,假设调整后的数 据保存在表tmp—score,原数据保存在表my score,则程序可写成: merge into my_score m using tmp_score t on (m.student_id=t.studenLid and m.subject_id:t. subject_id) when matched then update set m.score1=t.score1, m.score2=t.score2, m.score3=t.score3, m.score=t.score when not matched then insert values( t.student_id, t.subjecLid, t.score1, t.score2, t.score3, t.score) 2.2 Merge Into的基本操作 (上接第228页) 第一个不同之处:VMware本身庞大而复杂,但KVM十分简 洁。使用VMware使得非常复杂的X86架构完全虚拟化,并且性能 和稳定性都非常好,这是它的长处,但同时就很多方面而言, VMware是一个基础破坏技术,它只用软件技术进行管理,因此也使 得它自身变得非常庞大和复杂。而KVM,基于最新的硬件虚拟技术, 所以就其本身而论,它非常小大约只有1万行代码左右且相当简 单。 第二个不同之处在于使用成本,VMware是有专利的,而KVM 是开源的,这点对于市场尤为重要。 4.2 Xen Xen是一个独立的内核,而KVM只是内核的一个模块,因此在 开发的难度上差别显而易见。 Xen可同时提供半虚拟化和完全虚拟化,它被设计成一个独立 的内核,它只需要Linux执行I,0,这样就使得它必须具有非常强大 的功能,自己的调度程序、内存管理器、计时器和机器初始化程序等 等。而KVM只是内核的一个模块,它使用标准的Linux调度程序、内 存管理器和其他服务。因此KVM开发者们可以集中精力在虚拟化 上,将虚拟技术建立在内核上而不是去替换内核。 4.3 QEMU 229 OEMU是一个用户空间模拟器,它可以在不同宿主处理器上模 拟很多的客户处理器,并且性能非常好。但用户空间架构不允许它在 无内核加速器的条件下解决先天的速度问题。KVM依然认可QE— MU的实用价值,使用它进行l/0硬件模拟。 总之,KVM是第一个进入内核的虚拟化解决方案,还有其他一 些方法一直在为进入内核而竞争,但是由于KVM需要的修改较少, 并且可以将标准内核转换成一个系统管理程序,因此它的优势不言 而喻。 KVM的另外~个优点是它本身是内核的一部分,因此可以利用 内核自身的优化和改进。和其他独立的系统管理程序方案相比,这种 方法是一种不可能过时的技术。KVM有两个最大的缺点,分别是:第 一,需要较新的能够支持虚拟化的处理器;第二,需要一个用户空间 的QEMU进程来提供I/0虚拟化。但是不论好坏,KVM位于内核 中,这对于现有解决方案来说是一个巨大的飞跃。 参考文献: n1何晓龙,宋吉广.KVM:驶入虚拟化快车道:Linux内核虚拟化KVM详 解;2007年.软件世界.第11期. 【2】丁涛,郝沁汾,张冰.内核虚拟机调度策略的研究与分析【A】;2010系统 仿真技术及其应用学术会议论文集【Cl,2010年.

sql中GROUP BY与HAVING用法

SQL GROUP BY

实例

O_Id

OrderDate

OrderPrice

Customer

1

2008/12/29

1000

Bush

2

2008/11/23

1600

Carter

3

2008/10/05

700

Bush

4

2008/09/28

300

Bush

5

2008/08/06

2000

Adams

6

2008/07/21

100

Carter

现在,我们希望查找每个客户的总金额(总订单)。

我们使用下列

SQL

语句:

SELECT Customer,SUM(OrderPrice) FROM Orders

GROUP BY Customer

结果集类似这样:

Customer SUM(OrderPrice)

Bush 2000

Carter 1700

Adams 2000

很棒吧,对不对?

GROUP BY

一个以上的列

我们也可以对一个以上的列应用

GROUP BY

语句,就像这样:

SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders

GROUP BY Customer,OrderDate

SQL HAVING 实例

O_Id OrderDate OrderPrice Customer

1 2008/12/29 1000 Bush

2 2008/11/23 1600 Carter

3 2008/10/05 700 Bush

4 2008/09/28 300 Bush

5 2008/08/06 2000 Adams

6 2008/07/21 100 Carter

现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。

SELECT Customer,SUM(OrderPrice) FROM Orders

WHERE Customer='Bush' OR Customer='Adams'

oracle中CASE的用法

oracle中CASE的⽤法

1.第⼀种⽤法:可以称为简单变量;

SELECT ename,

(CASE deptno

WHEN 10 THEN 'ACCOUNTING'

WHEN 20 THEN 'RESEARCH'

WHEN 30 THEN 'SALES'

WHEN 40 THEN 'OPERATIONS'

ELSE 'Unassigned'

END ) as Department

FROM emp;

ENAME DEPARTMENT

---------- ----------

SMITH RESEARCH

ALLEN Unassigned

WARD SALES

JONES RESEARCH

MARTIN SALES

BLAKE SALES

CLARK ACCOUNTING

SCOTT RESEARCH

KING ACCOUNTING

TURNER SALES

ADAMS RESEARCH

JAMES SALES

2.第⼆种⽤法:可以称为条件表达式;

SELECT ename, sal, deptno,

CASE

WHEN sal <= 500 then 0

WHEN sal > 500 and sal<1500 then 100

WHEN sal >= 1500 and sal < 2500 and deptno=10 then 200

WHEN sal > 1500 and sal < 2500 and deptno=20 then 500

WHEN sal >= 2500 then 300

ELSE 0

END "bonus"

FROM emp;

ENAME SAL DEPTNO bonus

---------- ---------- ---------- ----------

SMITH 800 20 100

ALLEN 1600 90 0

WARD 1250 30 100

JONES 2975 20 300

MARTIN 1250 30 100

BLAKE 2850 30 300

oracle中mergeinto用法解析

oracle中mergeinto⽤法解析

转⾃:/31397003/viewspace-2139948/

oracle中merge into⽤法解析

merge into语法:

merge into [target-table] a using [source-table sql] b on([conditional expression] and [...]...)

when matched then

[update sql]

when not matched then

[insert sql]

作⽤:判断B表和A表是否满⾜on中条件,如果满⾜则⽤b表去更新a表,如果不满⾜,则将b表数据插⼊a表但是有很多可选项,如下:1.正常模式

2.只update或者只insert

3.带条件的update或带条件的insert

4.全插⼊insert实现

5.带delete的update(觉得可以⽤3来实现)

下⾯⼀⼀测试。

测试建以下表: create table a_merge

(

id number not null,

name varchar2(12) not null,

year number

);

create table b_merge

(

id number not null,

aid number not null,

name varchar2(12) not null,

year number,

city varchar2(12)

);

create table c_merge

(

id number not null,

name varchar2(12) not null,

city varchar2(12) not null

);

commit;

各表的表结构截图如下所⽰:SQL> desc a_merge

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档