`
wlh269
  • 浏览: 455848 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ORACLE查询基础

阅读更多
例题:如何删除表中重复的记录?
 --建表
create   table   a   (   
  bm   char(4), --编码   
  mc   varchar2(20) --名称   
 )   
 
--插入记录         
 insert   into   a   values('1111','0001'); 
 insert   into   a   values('1112','0002');  
 insert   into   a   values('1113','0003');  
 insert   into   a   values('1114','0004');  
  
--制造4条重复记录
 insert into a select * from a;

--(找到重复记录)8条记录的后四条 
 select rowid ,a1.bm,a1.mc 
from a a1
where a1.rowid=(
 select max(a2.rowid)
  from  a a2
  where a2.bm=a1.bm
   and a2.mc=a1.mc
)

--删除重复记录   
 delete from a a1
  where a1.rowid != (select max(rowid)
                      from a a2
                     where a1.bm = a2.bm
                       and a1.mc = a2.mc);


--注意:找到重复记录的方法和下面的关联查询的区别
--16条记录
 select a1.rowid,a2.rowid,a1.*,a2.*
  from  a a1,a a2
  where a2.bm=a1.bm
   and a2.mc=a1.mc
   




例题,
分组查询:
按部门求每个部门薪水的前2名?





create table DEPT
(
  DEPTNO   VARCHAR2(20),
  DEPTNAME VARCHAR2(20)
)
;


create table EMP
(
  ENO    VARCHAR2(20),
  ENAME  VARCHAR2(20),
  SAL    VARCHAR2(20),
  DEPTNO VARCHAR2(20)
)
;


insert into DEPT (DEPTNO, DEPTNAME)values ('001', '开发一部');
insert into DEPT (DEPTNO, DEPTNAME)values ('002', '开发二部');
commit;

insert into EMP (ENO, ENAME, SAL, DEPTNO)
values ('00001', '谷超', '2500', '001');
insert into EMP (ENO, ENAME, SAL, DEPTNO)
values ('00002', '武立海', '1000', '001');
insert into EMP (ENO, ENAME, SAL, DEPTNO)
values ('00003', '张三', '2000', '002');
insert into EMP (ENO, ENAME, SAL, DEPTNO)
values ('00004', '李四', '4000', '002');
insert into EMP (ENO, ENAME, SAL, DEPTNO)
values ('00005', '赵柳', '5000', '001');
insert into EMP (ENO, ENAME, SAL, DEPTNO)
values ('00006', '王八', '5000', '001');
commit;






1.分组求出每个部门薪水最高的前2名雇员(普通sql方法查询)

select deptno, ename, sal       
from emp e1      
where       
   (   
    select count(1)      
    from emp e2      
    where e2.deptno=e1.deptno and e2.sal>=e1.sal   
   ) <=2
order by deptno, sal desc;  



2.分组求出每个部门薪水最高的前2名雇员,(利用分区功能)

select * from       
(select deptno,ename,sal,row_number() over (partition by deptno      
    order by sal desc) rn       
from emp)       
   where rn<=2;
 


备注:
   --row_number() 自然排序,无并列排序  1,2,3
   --rank() 有并列排名,两个第一名,接着是第三名  1,1,3
   --dense_rank() 有并列排名,两个第一名,接着是第二名 1,1,2





例二:
建立三张表:注意学生选课程时候一门课程只选择一次,这和查询的时候具体的操作密切相关
create table s(
 sno number(4) primary key ,
 sname varchar2(8)
);

create table c(
 cno number(4) primary key,
 cname varchar2(8),
 teacher varchar2(8)
);

create table sc(
  sno number(4) references s(sno),
  cno number(4) references c(cno),
  score number(2)
);


insert into s values (1101,'zhangs');
insert into s values (1102,'lisi');
insert into s values (1103,'wangwu');
insert into c values (1,'物理','teacher6');
insert into c values (2,'化学','teacher2');
insert into c values (3,'中文','teacher3');
insert into c values (4,'体育','teacher5');


insert into sc values (1101,1,61);
insert into sc values (1101,4,64);
insert into sc values (1102,1,66);
insert into sc values (1102,2,53);
insert into sc values (1102,4,34);
insert into sc values (1103,1,84);
insert into sc values (1103,2,55);
insert into sc values (1103,3,65);
insert into sc values (1103,4,24);

commit;



--统计每门课程被多少人选择了;
select cno ,count(cno) 
from sc 
group by cno


--选择2门以上课程的学生学号

select sno
	from sc
	group by sno
	having count(sno)>2


--选择2门以上课程的学生信息

select * 
from s
where exists (
 select 'x'
 from sc
 where sc.sno=s.sno 
  group by sc.sno
  having count(sc.sno)>2
)

select * 
from s
where s.sno in(
	select sno
	from sc
	group by sno
	having count(sno)>2
)


--没有选择'teacher2'所授课程的学生的信息?

-错误的
select sc.sno from sc 
where sc.cno not in
(select c.cno from c where c.teacher='teacher2')
-正确的
select *
from s
where s.sno not in
(select sno 
from sc
where cno='2')

select *   
from s   
where  not exists  
(select 'x'    
from sc  
where cno='2'and sc.sno= s.sno 
) 

select * 
from s
where not exists(--注意 not exsits
 select 'x'
 from sc
 where  exists(--注意  exsits
  select 'y'
  from c
  where sc.cno=c.cno and sc.sno=s.sno and c.teacher='teacher2'
 
 )

)



--选择了所有课程的学生的学号(分两步:a.统计每个学生所学的课程;b.统计所有课程数)
select sc.sno from sc group by sc.sno having count(sc.sno) --统计每个学生所学的课程
       =(select count(*) from c)--统计所有课程数

--所有学生都选择的课程

方法一:
select * from c where cno in(
select cno
from sc
group by cno 
having count(cno)  --统计每门课程被选择数		
= (select count(*) from s)--统计所有学生数
)

方法二:
select * 
from c 
where exists(   
  select 'x'   
  from sc  
  where sc.cno=c.cno 
  group by cno    
  having count(cno)  --统计每门课程被选择数        
  = (select count(*) from s)--统计所有学生数   
) 

方法三:
select * from 
(select c.cno,c.cname,count(sc.sno) as c_s
from sc,c
where sc.cno=c.cno
group by c.cno,c.cname) a,		--统计每门课程被选择数		
(select count(*) as all_s from s)b  --统计所有学生数
where a.c_s=b.all_s



例子2:
[color=red][size=medium]创建一张销售交易表:(注:一个人可以购买多种商品;一种商品可以被多个人购买;一个人可以多次购买同一种商品,但是数量随意[/size])
[/color]
[color=darkred][size=medium]与例1不同的地方就在一个人可以多次购买同一件商品,也就是说同一个购买者和同一商品在数据表中可以有多条记录;但是例1中学生选择课程,在SC表中是不可能有重复的记录的;[/size]
 [/color]

商店交易数据表deal:
购买人:buyer   商品名称:product_name    数量:num
A, 甲, 4				
A, 乙, 6								
B, 丙, 3								
B, 丁, 9								
C, 甲, 7								
C, 丁, 2								
A, 丙, 5								
C, 丁, 1								
B, 丙, 5								
A, 乙, 2	
							
 
create table deal ( --交易
 buyer varchar2(4),
 product_name  varchar2(20),
 num   number(3)
);

--插入数据(一个人可以购买多种商品;一种商品可以被多个人购买;一个人可以多次购买同一种商品,但是数量随意)
insert into deal values('A','甲',4);
insert into deal values('A','乙',6);
insert into deal values('B','丙',3);
insert into deal values('B','丁',9);
insert into deal values('C','甲',7);
insert into deal values('C','丁',2);
insert into deal values('A','丙',5);
insert into deal values('C','丁',1);
insert into deal values('B','丙',5);
insert into deal values('A','乙',2);
commit;



--每个人购买每种商品的数量
select buyer,product_name,sum(num)
from deal
group by buyer,product_name

--购买2中以上商品的购物者
select t.buyer
from 
(select buyer,product_name
from deal
group by buyer,product_name
)t
group by t.buyer 
having count(t.buyer)>2


--销售的数量最大的商品

--方法一,普通方式:
select * from(
  select d.product_name as name,sum(num) as total   
  from deal d   
  group by d.product_name
  order by total desc
)
where rownum=1

--方法二,普通方式:

select d.product_name as name,sum(num) as total
from deal d
group by d.product_name
having sum(num)=
(
select max(t.total)
from
(select d.product_name as name,sum(num) as total
from deal d
group by d.product_name
) t
)

--方法三:(视图方式)

create view  v$_deal as (
  select d.product_name as name,sum(num) as total
  from deal d
  group by d.product_name
)

select v$_deal.name,v$_deal.total
from v$_deal
where v$_deal.total=(
select max(v$_deal.total)
from v$_deal
)

0
0
分享到:
评论

相关推荐

    Oracle基础查询关联查询练习题.docx

    Oracle 基础查询关联查询练习题 Oracle 基础查询关联查询练习题中涉及到多种查询类型,包括基础查询、关联查询、分组查询等。下面我们将对每个练习题的知识点进行详细解释。 1. 基础查询 基础查询是指从数据库中...

    Oracle查询优化改写技巧与案例

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    Oracle查询优化改写技巧与案例2.zip

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    oracle查询优化pdf

    首先,Oracle查询优化的基础是SQL(结构化查询语言)。优化查询通常从编写高效的SQL语句开始,包括选择合适的索引、避免全表扫描、减少子查询以及合理使用JOIN操作。在Oracle中,理解执行计划至关重要,因为它是...

    oracle基础教程

    oracle基础教程 课程说明 1 课程介绍 1 课程目标 1 相关资料 1 第1章 ORACLE数据库概述 2 1.1 产品概述 2 1.1.1 产品简介 2 1.1.2 基本概念 3 1.2 ORACLE系统结构 4 1.2.2 ORACLE物理结构 4 1.2.3 系统全局区 6 ...

    Oracle数据库基础教程[孙风栋等编著][习题解答

    本教程《Oracle数据库基础教程》由孙风栋等编著,旨在帮助初学者系统地理解和掌握Oracle数据库的基本概念、操作以及应用。 教程中的习题解答部分是学习过程中的重要辅助资料,它可以帮助读者检验自己的理解程度,...

    oracle 基础oracle 基础oracle 基础oracle

    以下将基于这些信息,详细阐述Oracle数据库的基础知识。 ### Oracle Database 11g 概述 #### 一、Oracle Database 简介 Oracle Database 是一款由美国Oracle公司开发的关系型数据库管理系统(RDBMS)。它提供了...

    【oracle】oracle查询优化改写

    在"Oracle_chaxunyouhuagaixiejiqiaoyuanli_20180929.pdf"这份文档中,可能会详细讲解以上提到的概念,并提供实际案例和技巧,帮助你深入理解和应用Oracle查询优化改写。通过学习这些内容,你将能够更好地诊断和解决...

    oracle 查询部分ppt

    《玩转Oracle查询部分》这份PPT是针对Oracle数据库系统中的查询操作进行深入探讨的资料。Oracle数据库系统作为全球广泛使用的数据库管理系统之一,其查询语言SQL(Structured Query Language)是数据库管理员、开发...

    oracle查询一个月之内数据

    根据提供的标题、描述、标签及部分内容,我们可以了解到本篇文章主要关注的是如何在Oracle数据库中查询一个月内的数据。这里的关键在于日期范围的确定以及如何利用Oracle的内置函数来完成这一任务。接下来,我们将...

    Oracle数据库基础ppt

    本教程基于Oracle 11g版本,旨在为初学者提供全面的数据库管理、应用与开发基础知识。通过以下章节的讲解,我们可以深入理解Oracle数据库的核心概念和技术。 首先,"第1章 Oracle 11g简介"介绍了Oracle 11g的主要...

    Oracle核心基础总结

    "Oracle核心基础总结"涵盖了Oracle数据库系统的基础知识,对于初学者和需要巩固基础的IT从业者来说,是非常宝贵的资源。以下是Oracle核心基础的一些关键知识点: 1. 数据库概念:了解数据库的基本构成,如表、索引...

    Oracle基础教程

    Oracle 基础教程 Oracle 是一款流行的关系型数据库管理系统,由 Oracle 公司开发和维护。作为一个功能强大且广泛应用的数据库管理系统,Oracle 具有强大的数据存储和管理能力,广泛应用于各种 Industries,包括金融...

    sql查询oracle时间段操作

    首先,SQL查询是获取特定时间段内数据的基础。在Oracle中,可以使用`BETWEEN`关键字来筛选特定日期范围内的记录。例如,如果你有一个名为`orders`的表,其中包含`order_date`列,你可以这样查询2020年1月1日至2020年...

    Oracle数据库基础操作

    本文将深入探讨Oracle数据库的基础操作,包括数据的增加、删除、修改和查询,以及常用的数据库命令。 首先,让我们从创建数据库开始。在Oracle中,数据库是由一个或多个表空间组成的,表空间又包含数据文件。使用`...

    oracle查询优化改写技巧与案例

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    Oracle四大宝典之一:Oracle Sql基础 中文版

    第三章 ORACLE SQL 单行函数 第四章 从多表中查询数据 第五章 用组函数合计数据 第六章 子查询 第七章 操纵数据 第八章 创建和管理表 第九章 内置约束 第十章 创建视图 第十一章 其他数据库对象 第十二章 控制用户...

Global site tag (gtag.js) - Google Analytics