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

sql查询联系(Oracle)

 
阅读更多
------------------------------------ 练习题 一  删除重复记录 ---------------------------------------
前提说明:
distinct  只能在查询时过滤,不能完成本题要的删除功能。  例如 select distinct *  from t6

表的结构:
Sql代码  收藏代码
create table t6( 
       bm char(4), 
       mc varchar2(20) 


表中的数据:

Sql代码  收藏代码
insert into t6 values(1,'aaaa'); 
insert into t6 values(1,'aaaa'); 
insert into t6 values(2,'bbbb'); 
insert into t6 values(2,'bbbb'); 

要求:
删除重复记录

答案:
方法一,好理解:
 
Sql代码  收藏代码
delete from t6 where rowid not in (    
select max(t6.rowid) from  t6 group by     
t6.bm,t6.mc); 
--这里用min(rowid)也可以。 

方法二,比前面的复杂一点:

Sql代码  收藏代码
delete from t6 a where a.rowid!= ( 
select max(rowid) from t6 b where a.bm=b.bm and a.mc=b.mc 



-------------------------------------- 练习题 二  一个查询的练习 ------------------------------------
表的结构:
表1:book表,字段有id(主键),name (书名);
表2:bookEnrol表(图书借出归还登记),字段有id,bookId(外键),dependDate(变更时间),state(1.借出 2.归还)。

创建表的DDL:

Sql代码  收藏代码
create table book( 
  id int , 
  name varchar2(30), 
  PRIMARY KEY (id) 

   
create table bookEnrol( 
  id int, 
  bookId int, 
  dependDate date, 
  state int, 
  FOREIGN KEY (bookId) REFERENCES book(id) ON DELETE CASCADE 


表中的数据:
book表:
id  name               
1   English
2   Math
3   JAVA

bookEnrol表:
id   bookId   dependDate  state
1      1      2009-01-02    1
2      1      2009-01-12    2
3      2      2009-01-14    1
4      1      2009-01-17    1
5      2      2009-02-14    2
6      2      2009-02-15    1
7      3      2009-02-18    1
8      3      2009-02-19    2

插入数据的SQL语句:

Sql代码  收藏代码
insert into book values(1,'English'); 
insert into book values(2,'Math'); 
insert into book values(3,'JAVA'); 
 
insert into bookEnrol values(1,1,to_date('2009-01-02','yyyy-mm-dd'),1) 
insert into bookEnrol values(2,1,to_date('2009-01-12','yyyy-mm-dd'),2); 
insert into bookEnrol values(3,2,to_date('2009-01-14','yyyy-mm-dd'),1); 
insert into bookEnrol values(4,1,to_date('2009-01-17','yyyy-mm-dd'),1); 
insert into bookEnrol values(5,2,to_date('2009-02-14','yyyy-mm-dd'),2); 
insert into bookEnrol values(6,2,to_date('2009-02-15','yyyy-mm-dd'),1); 
insert into bookEnrol values(7,3,to_date('2009-02-18','yyyy-mm-dd'),1); 
insert into bookEnrol values(8,3,to_date('2009-02-19','yyyy-mm-dd'),2); 

要求查询出:  不要使用存储过程

第二个表(bookEnrol)是用来登记的,不管你是借还是还,都要添加一条记录。
请写一个SQL语句,获取到现在状态为已借出的所有图书的相关信息,
ID为3的java书,由于以归还,所以不要查出来。

要求查询结果应为:(被借出的书和被借出的日期)
Id    Name     dependDate
1    English    2009-01-17
2    Math      2009-02-15

答案:
 
Sql代码  收藏代码
select a.id,a.name,b.dependdate from book a,bookenrol b where 
a.id=b.bookid  
and  
b.dependdate in(select max(dependdate) from bookenrol group by bookid ) 
and b.state=1 
如果大家有更好的方法,可以发出来交流一下。

下面是群友发出来的答案:

副主任的答案

Sql代码  收藏代码
select a.bid, bo.name, a.adate    
  from (select t.bookid bid, t.state, count(*) acou, max(t.dependdate) adate    
          from bookenrol t    
         group by t.bookid, t.state    
        having t.state = 1) a,    
       (select t.bookid bid, t.state, count(*) bcou, max(t.dependdate) bdate    
          from bookenrol t    
         group by t.bookid, t.state    
        having t.state = 2) b,    
       book bo    
where a.bid = b.bid(+)    
   and bo.id = a.bid    
   and a.acou <> nvl(b.bcou,0); 

副主任小师姝的答案

Sql代码  收藏代码
select k.id,k.name,a.dependdate 
  from bookenrol a, BOOK k 
where a.id in (select max(b.id) from bookenrol b group by b.bookid) 
   and a.state = 1 
   and a.bookid = k.id; 


小米的答案

Sql代码  收藏代码
select a.id,a.name,b.dependdate from book a, bookenrol b,(select max(dependdate) dependdate 
from bookenrol group by bookid) c where a.id(+) =b.bookid and b.dependdate(+)=c.dependdate and b.state=1; 

----------------------------------------- 练习题 三  一个查询的练习 --------------------------------------
表的结构与数据:
表一:各种产品年销售量统计表  sale
  年       产品           销量  
   2005       a             700  
   2005       b             550  
   2005       c             600  
   2006       a             340  
   2006       b             500  
   2007       a             220  
   2007       b             350 


Sql代码  收藏代码
create table t2 ( 
year_ varchar2(4), 
product varchar2(4), 
sale    number 

 
insert into t2 values('2005','a',700); 
insert into t2 values('2005','b',550); 
insert into t2 values('2005','c',600); 
insert into t2 values('2006','a',340); 
insert into t2 values('2006','b',500); 
insert into t2 values('2007','a',220); 
insert into t2 values('2007','b',350); 
Sql代码  收藏代码
insert into t2 values('2007','c',350); 

要求查询出: 
要求得到的结果应为:
  年       产品           销量  
   2005       a           700  
   2006       b           500  
   2007       b           350  
  即:每年销量最多的产品的相关信息。

答案:

Sql代码  收藏代码
我的: 
select * from t2 a inner join( 
select year_,max(sale) as sl from t2 group by year_) b 
on a.year_=b.year_ and a.sale=b.sl 
 
副主任的: 
select sa.year_, sa.product, sa.sale  
from t2 sa, 
       (select t.year_ pye, max(t.sale) maxcout 
        from t2 t 
        group by t.year_) tmp 
where sa.year_ = tmp.pye 
and sa.sale = tmp.maxcout 

-------------------------------------------- 练习题 四  排序问题 -------------------------------------
表的结构与数据:

Sql代码  收藏代码
create table t4( 
姓名   varchar2(20), 
月积分 varchar2(20), 
总积分 char(3) 

 
insert into t4 values('WhatIsJava','1','99'); 
insert into t4 values('水王','76','981'); 
insert into t4 values('新浪网','65','96'); 
insert into t4 values('牛人','22','9'); 
insert into t4 values('中国队','64','89'); 
insert into t4 values('信息','66','66'); 
insert into t4 values('太阳','53','66'); 
insert into t4 values('中成药','11','33'); 
insert into t4 values('西洋参','257','26'); 
insert into t4 values('大拿','33','23'); 


要求查询出:
如果用总积分做降序排序..因为总积分是字符型,所以排出来是这样子(9,8,7,6,5...),要求按照总积分的数字大小排序。

答案:

Sql代码  收藏代码
我的: 
select * from t4 order by cast(总积分 as int) desc 
小米的: 
select * from t4 order by to_number(总积分) desc; 


---------------------------------------- 练习题 五  查询 --------------------------------------
表的结构与数据:
表A字段如下
month  name income
月份   人员 收入
8      a    1000
9      a    2000
10     a    3000

Sql代码  收藏代码
create table t5 ( 
month int, 
name varchar2(10), 
income number 

insert into t5 values('08','a',1000); 
insert into t5 values('09','a',2000); 
insert into t5 values('10','a',3000); 
 
这个日期要与你做题的日期 相符,才会有当前月,上一个月,下一个月, 过期请自行修改 


要求查询出:
要求用一个SQL语句(注意是一个)得出所有人(不区分人员)每个月及上月和下月的总收入
要求列表输出为:
        月份       当月收入       上月收入       下月收入
---------- ---------- ---------- ----------
         9       2000       1000       3000

答案:
小程的答案:
Sql代码  收藏代码
select o.month,sum(o.income) as cur,(select sum(t.income) from t5 t where t.month=(o.month+1) group by t.month) as next, 
(select sum(t.income) from t5 t where t.month=(o.month-1) group by t.month) as last 
from t5 o where o.month=2 group by o.month 
重庆--小彭:
Sql代码  收藏代码
select month as 月份 ,name as 姓名,sum(income) as 当月工资, 
(select sum(income)  
from t5  
where month = to_number(substr(to_char(sysdate,'yyyy-mm-dd'),7,1))-1) AS 上月工资 , 
(select sum(income)  
from t5  
where month = to_number(substr(to_char(sysdate,'yyyy-mm-dd'),7,1))+1) AS 下月工资  
from t5 where month=substr(to_char(sysdate,'yyyy-mm-dd'),7,1) 
group by month,name 

副主任:

Sql代码  收藏代码
drop table t5 
create table t5 (    
month date,    
name varchar2(10),    
income number    
)    
insert into t5 values(to_date('2010-08-01','yyyy-MM-dd'),'a',1000);    
insert into t5 values(to_date('2010-09-01','yyyy-MM-dd'),'a',2000);    
insert into t5 values(to_date('2010-10-01','yyyy-MM-dd'),'a',3000); 
 
select sum(to_number(substr(to_char(sysdate,'yyyy-MM-dd'),6,2)))/count(*), 
       sum(decode(month, to_date(to_char(add_months(trunc(sysdate),-1),'yyyy-MM'),'yyyy-MM'), income, 0)) 上月, 
       sum(decode(month, to_date(to_char(add_months(trunc(sysdate),0),'yyyy-MM'),'yyyy-MM'), income, 0)) 当月, 
       sum(decode(month, to_date(to_char(add_months(trunc(sysdate),1),'yyyy-MM'),'yyyy-MM'), income, 0)) 下月 
  from t5 
group by name; 




----------------------------------------------- 练习题 其它 ----------------------------------------
rowid 和 rownum 的区别
rowid 用于定位数据表中某条数据的位置,是唯一的、也不会改变
rownum 表示查询某条记录在整个结果集中的位置,
同一条记录查询条件不同对应的 rownum 是不同的而 rowid 是不会变的
分享到:
评论

相关推荐

    oracle SQL查询工具

    oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具...

    sql查询oracle时间段操作

    在SQL查询中对Oracle数据库进行时间段操作是一项关键技能,特别是在数据恢复和历史数据分析时。Oracle数据库提供了多种方式来处理时间范围的数据,包括SQL查询、闪回功能和快照。下面我们将详细探讨这些知识点。 ...

    SqlDbx连接oracle

    SqlDbx是一款轻量级的数据库管理工具,特别适合于SQL查询和数据库开发。它以其直观的用户界面和对多种数据库系统的支持而受到青睐,包括Oracle。本篇将详细介绍如何使用SqlDbx连接到Oracle数据库,以及涉及的相关...

    oracle到sqlserver 跨库查询

    .oracle 到 SQL Server 跨库查询 Oracle 到 SQL Server 跨库查询是指通过网关工具将数据从 SQL Server 数据库中抽取到 Oracle 数据库中。这个过程需要安装和配置网关软件,并进行相应的设置和配置。 一、网关软件...

    sqlserver自动生成sql语句工具sqlserver转oracle

    在IT行业中,数据库管理系统是核心组成部分,SQL Server和Oracle分别是微软和甲骨文公司推出的两款广泛应用的关系型数据库系统。在企业级应用中,有时需要在不同的数据库系统间进行数据迁移或兼容性处理,这就涉及到...

    oracle查看执行最慢与查询次数最多的sql语句

    本文将详细介绍如何查看Oracle数据库中执行最慢和查询次数最多的SQL语句,以帮助DBA(数据库管理员)识别潜在的性能瓶颈。 首先,我们来看如何查询执行最慢的SQL语句。在Oracle中,可以使用`v$sqlarea`视图来获取...

    SQL Server 到 Oracle 的SQL 语法自动翻译器源码

    支持复杂的SQL,例如嵌套/子查询等。 这是小弟为了一个Oracle项目的应急之作,我们的系统(Delphi的三层架构)一直运行在sql server下面, 当时客户指定需要的是支持Oracle版本的应用系统, 这个系统不小,如果...

    SQL SERVER连接oracle数据库几种方法

    OPENQUERY 是 SQL Server 中的一个系统存储过程,用于执行远程查询。我们可以使用 OPENQUERY 来连接 Oracle 数据库。下面是一个示例代码: ```sql SELECT * FROM OPENQUERY(GE160, 'SELECT * FROM DAIMIN.JOBS') `...

    oracle消耗资源的sql查询语句记录

    ### Oracle消耗资源的SQL查询语句记录 在Oracle数据库管理中,监控和优化SQL查询是确保系统性能稳定的关键环节之一。对于那些消耗大量资源的SQL语句进行记录和分析可以帮助DBA快速定位问题并采取相应的优化措施。...

    oracle 查看当前会话执行的sql语句

    ### Oracle 查看当前会话执行的SQL语句 在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看...

    Sql语法转换为Oracle语法

    这通常是因为在系统迁移或跨平台开发时,需要将SQL Server的查询语句适应Oracle数据库的语法。 描述中提到的"SqlConvertToOracle.pas"是一个关键文件,它可能是一个用Delphi编写的源代码文件,包含了实现SQL语句...

    sql_server连接Oracle方法(最全)

    "SQL Server 连接 Oracle 方法" SQL Server 连接 Oracle 方法是数据库管理系统中的一个重要话题。本文将详细介绍如何在 SQL Server 中连接 Oracle 数据库,并解决在连接过程中可能出现的问题。 安装 Oracle 客户端...

    Sqldbx连接OracleX64位,前一个版本放少东西了

    Sqldbx是一款开源的SQL查询工具,它支持多种数据库系统,包括Oracle。然而,由于某种原因(可能是缺失某些组件或依赖),该工具无法正确地与64位Oracle实例建立连接。 描述中的“使用sqldbx.exe连接64位oracle,...

    Oracle SQL Tuning with Oracle SQLTXPLAIN: Oracle Database 12c Edition

    Oracle SQL Tuning with Oracle SQLTXPLAIN: Oracle Database 12c Edition by Stelios Charalambides English | 8 May 2017 | ISBN: 1484224353 | 408 Pages | PDF | 24.39 MB Learn through this practical guide ...

    Sqlserver转Oracle工具

    连接sqlserver数据库后选择相应的数据库-数据表以及目标数据库(目前只有oracle),可以将sqlserver转换成oracle数据,有两种方式,点击转换sql按钮,可以生成sql语句,复制语句到oracle里执行。第二种是连接oracle...

    Oracle SQL 官方文档

    Oracle SQL 是一种强大的数据库查询和编程语言,广泛用于管理和操作Oracle数据库系统。11g第二版(11G2)是Oracle的一个重要版本,提供了许多增强功能和优化。本官方文档集包括四份重要的参考资料,涵盖了Oracle SQL...

    网络环境下连接SQL Server和Oracle 19c的方法.docx

    在网上看了很多资料,感觉不是很仔细,很多同学遇到这个问题,就详细说明一下在局域网环境下Navicat连接SQL Server和Oracle 19c的方法,PL/SQL Developer连接Oracle

    SQL Monitor for Oracle,MySQL和DB2 v2.4.3.6 中文绿色版

    SQL Monitor for Oracle,MySQL and DB2 是款免费的数据库跟踪工具,专门用来分析CPU使用率高的问题。 软件功能: 1. 监控SQL Server的进程和Job,查看当前执行的SQL/命令,并终止之。 2. 对象浏览器,跟 SQL Server...

    Oracle Sql语句转换成Mysql Sql语句

    在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个...

    sqlserver-oracle 数据类型对照

    - `LEVEL`在Oracle的`CONNECT BY`查询中用于表示层级,SQL Server中无直接对应。 了解这些对照关系对于在SQL Server和Oracle之间迁移数据或编写跨平台的SQL脚本至关重要。同时,开发者也需要根据实际需求和数据库...

Global site tag (gtag.js) - Google Analytics