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)
它的功能是 如果value为if1,则返回then1的值,如果value为if2,则返回then2的值,如果value为if3,则返回then3的值,如果以上条件都不满足,返回else的值。
8. 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 链接两张表。