oracle中复杂SQL语句——(2020提升版)

本文深入探讨了Oracle数据库中的SQL语句使用,包括如何处理重复数据、查询执行顺序、EXISTS的运用、复杂SQL思维训练、自连接、CASE WHEN的用法、更新语句和分析函数的应用等,旨在提升SQL查询技能。
摘要由CSDN通过智能技术生成

一、sql语句实现重复数据只显示一次 ,或者删除重复数据

大家首先会想到:distinct。有如下数据表A:
id    title      grief
1    标题1  简介1 
2    标题2  简介2 
3    标题1  简介3 
4    标题2  简介2

对于title字段,若实现重复数据只显示一条,可用如下sql语句:
select distinct title from A 
但这样返回的只有一个title字段。

扩展:
如果要实现title字段重复数据只显示一条,并且要返回多个字段,使用distinct就不行了。以下sql语句解决以上问题。
select  *  from A where id in (select min(id) from course group by title,grief);   
(这里min也可以改为max) 

对于数据表重复数据只保留一条,以下sql语句可实现。
delete A where   id   not   in( select   max(id)   from   A group   by   title,grief );   
(这里max也可以改为min) 

二、oracle 查询重复数据并且删除, 只保留一条数据的SQL语句

delete from t_account where feedate in (
  select feedate
          from t_account
  group by feedate
  having count(1)>1
) and id not in (
  select min(id)
          from t_account
  group by feedate
  having count(1)>1
)

---------------------------------------------------------------------------------------------
delete from (
  select * from t_account 
  where id not in(select min(id) from t_account group by feedate)
) t;

---------------------------------------------------------------------------------------------
delete from t_account
 where id in (select id
                from t_account
               where feedate in (select feedate
                                   from t_account
                                  group by feedate
                                 having count(*) > 1)
              minus
              select min(id)
                from t_account
               where feedate in (select feedate
                                   from t_account
                                  group by feedate
                                 having count(*) > 1)
               group by feedate)

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

delete from t_account where id in 
(
  select id from 
    (
    select rank() over(order by feedate) r ,ac.* from t_account ac
    minus
    select row_number() over(order by feedate) r, ac.* from t_account ac
    )
);

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

delete  from t_account top 
where 
to_char(top.feedate)in(
       select up1.up1date from 
       (select to_char(feedate) up1date,count(id) up1num from t_account  group by(to_char(feedate)) ) up1
       where up1.up1num>1
) 
and
top.id not in(
        select min(tac.id) up3id from (
             select up1.up1date up2date from 
             (select to_char(feedate) up1date,count(id) up1num from t_account  group by(to_char(feedate)) ) up1
             where up1.up1num>1
       )up2 left join t_account tac on up2.up2date=to_char(tac.feedate) group by to_char(tac.feedate)  
);

三、oracle经典SQL语句大全

一、基础
1、说明:创建数据库
CREATE DATABASE database-name 
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack 
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表: 
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2... from tab_old definition only
5、说明:删除新表
drop table tabname 
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col) 
说明:删除主键: Alter table tabname drop primary key(col) 
8、说明:创建索引:create [unique] index idxname on tabname(col....) 
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement 
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
AUNION 运算符 
UNION 运算符通过组合其他两个结果表(例如 TABLE1TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALLUNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2BEXCEPT 运算符 
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALLEXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 
CINTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALLINTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 
注:使用运算词的几个查询结果行必须是一致的。 
12、说明:使用外连接 
A、left (outer) join: 
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 
SQL: select a.a, a.b, a.c, b.c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值