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中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中的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的⽤法
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用法
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的用法区别
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的用法
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
