oracle sql

查看Oracle数据库版本

以下任意一条命令

select * from v$version;

select version from v$instance;

Select version FROM Product_component_version   Where SUBSTR(PRODUCT,1,6)='Oracle';

 

1.dual

Oracle提供的最小的工作表,只有一行一列,具有某些特殊功用
dual 是一张伪表,因为它不存数据.
当我们不需要从某张表获取数据时,单纯地想得到一些我们想要的信息.并且需要select完成,可以用dual 表来帮助查询。比如:

--序列:
select sequence_name.nextval from DUAL;
--当前时间: 
select sysdate from dual;
--计算: 
select 444*7 from dual; 

 2.oracle sequence

修改sequence的 初始值

Alter Sequence S_Sequence_Name Increment By 24690;
Select S_Sequence_Name.NextVal From Dual;
Alter Sequence S_Sequence_Name Increment By 1;

 3.oracle sql 分页实现 

--实现分页
--1 把table中 所有记录查出来 
select * from table_a;
--2 根据rownum 查出 <= max 的 所有记录
select rownum,a.* from (select * from table_a) a  where rownum <=10;
--3 再根据 新表的rownum 查出 >min 的所有记录
select * from (select rownum as my_rownum,a.* from (select * from table_a) a  where rownum <=10) where my_rownum >5;

 4.分析性函数partition by

 分析性函数partition by 按照某个字段 分区,它并不会影响表中的记录条数,会返回所有记录。partition by 一般 和rank()   dense_rank() row_number() 一起使用。
 row_number()  会为查询出来的每一行记录生成一个序号,依次排序且不会重复 
 rank() 返回 结果集的 分区内每行的排名,行的排名是相关行之前的排名数加一,每个分区排名从1开始
 dense_rank() 同rank()   rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。

比如在表里t_student字段 class_no,student_no,student_name,studen_score 等字段。

--在t_student表中 class_no有多个不同的值; 每个class_no的取值 对应多个studen_score。

--如果要取每个班级考试的第一名名 即:每个class_no的 最高的student_score, 那就可以用分区来实现。
 select *
   from (select rank() over(partition by t.class_no order by t.student_score) mm,
                t.*
           from t_student t)
  where mm = 1;


--如果要取每个班级考试的前三名 即:每个class_no的 最高的三个student_score, 那就可以用分区来实现。
 select *
   from (select rank() over(partition by t.class_no order by t.student_score) mm,
                t.*
           from t_student t)
  where mm <= 3;


--根据class_no进行分区,在每个分区内按照student_score来排序
--rank() over(partition by class_no order by student_score) mm 

 

5.sql left join 时 on 和 where的差别
where 是对连接的整体做限制,on是只对连接做限制
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

--这样会查询出a表的全部记录
select * from a left join b on a.column1 = b.column1  and b.column2 = 'xx';

--这样不一定会查询出a表的全部记录
select * from a left join b on on a.column1 = b.column1  where b.column2 = 'xx';

 

6.Oracle函数 NVL( string1, replace_with)

它的功能是如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL

7.Oracle函数 DECODE(value,if1,then1,if2,then2,if3,then3,...,else)

它的功能是   如果valueif1,则返回then1的值,如果valueif2,则返回then2的值,如果valueif3,则返回then3的值,如果以上条件都不满足,返回else的值。

8. case when then else  end

case when then else end

oracle 中分页查询同时进行排序,但出现重复数据
sql会先生成rownum后执行order by子句,因而排序后结果不对
https://blog.csdn.net/LisaYuanThink/article/details/78967334
https://blog.csdn.net/kane0409/article/details/80050683 
https://blog.csdn.net/a491857321/article/details/50956819
排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件

 

    

full join 
SQL中join的用法解析(inner join、full out join、left join) https://blog.csdn.net/Megustas_JJC/article/details/86092980
full join  如果需要两个表的所有记录,需要使用full join 链接两张表。

 

posted on 2022-04-08 17:14  dreamstar  阅读(160)  评论(0编辑  收藏  举报