Oracle_day02

oracle第二天总结
(1)单表查询(完整语句:select from where group by having order by ) <除了第5点,其他都要求掌握>
   1.select 查询语句
     去重:select distinct deptno,mgr  作用于多列
     别名:select ename (as) "员工姓名",sal 工资 from emp;
     连接: select '员工姓名:' || ename from emp;  concat(,)  
     聚合函数:sum(),max(),min(),avg(),count()
   2.where 过滤语句
     =,!=,>,>=,<=
     not between and 边界 小值在前,大值在后
     and 和or 逻辑运算 从右边往左边执行
     is not null  ??=null 这是错误的写法
     not like==>select * from teacher where teacher_name like '%r_%' escape 'r';  
      in(10,20)  not in(10,20)特别注意要在使用not in 要防止出现null
   3.group by 分组(非聚合函数中的列都要参与group by的分组)
     select 中查询显示列并且为非聚合函数的列都要参与到group by分组中
     select deptno,max(sal) from emp group by deptno;//这里的deptno为非聚合函数的列,所有需要参与到分组中去
     select deptno,job,max(sal) from emp group by deptno,job;//多列分组,首先按照deptno分组,相同的组再按照job分组
     使用having来过滤分组后的结果
   4.order by 排序
     order by deptno,sal desc 多列排序:首先是按照deptno 升序排列,然后按照sal 降序排列
   5.伪列rowid和rownum
     rowid:每一行的物理地址    rownum:每一行排序的序号
     select rowid,rownum,empno,ename from emp;
     ROWID                  ROWNUM      EMPNO ENAME
    ------------------ ---------- ---------- ------
    AAAMfPAAEAAAAAgAAA          1       7369 SMITH
    AAAMfPAAEAAAAAgAAB          2       7499 ALLEN
    AAAMfPAAEAAAAAgAAC          3       7521 WARD
    AAAMfPAAEAAAAAgAAD          4       7566 JONES
    AAAMfPAAEAAAAAgAAE          5       7654 MARTIN
    AAAMfPAAEAAAAAgAAF          6       7698 BLAKE
    AAAMfPAAEAAAAAgAAG          7       7782 CLARK
    AAAMfPAAEAAAAAgAAH          8       7788 SCOTT
    AAAMfPAAEAAAAAgAAI          9       7839 KING
    AAAMfPAAEAAAAAgAAJ         10       7844 TURNER
    AAAMfPAAEAAAAAgAAK         11       7876 ADAMS
(2)多表查询<掌握多表联合查询和外连接>
    where A.xxx=B.xxx<只要2个表能够建立关联关系,2个表都能够联合查询>
    外连接:全集表和子集表(全集表在哪边,就是哪边连接;(+)是帮助我们子集表)
    sql99标准:
     A  a left  join B b on  a.col1=b.col2  左连接
     A  a right join B b on  a.col1=b.col2  右连接
    orcle:
     A  a , B b where  a.col1(+)=b.col2 右连接
     A  a , B b where  a.col1 =b.col2(+) 左连接
        
    select d.deptno 部门编号,d.dname 部门名称,count(e.empno) 部门总人数 from emp e, dept d  where e.deptno(+)=d.deptno
    group by d.deptno,d.dname order by d.deptno;
(3)子查询(select的语句嵌套)
    子查询放在哪里?select ,from ,where
    子查询用什么关键字连接?单行子查询使用(=,<>,>,>=,<,<=),多行子查询使用单行运算符和(in(),any(),all())
    子查询和主查询执行顺序?一般首先执行子查询,相关子查询首先执行主查询;

(4)分页查询<掌握>
    一张表不经过任何操作默认带有rownum行号,经过排序操作之后,该行号也随着排序了,但不是从1-2-3排序的
   为了重新按照1-2-3排序,需要将参与排列的表放入from中构成一张新的表;新表的顺序是按照1-2-3排序的
   rownum 不能直接rownum>1,但是可以使用rownum<6
   为了使用rownum>1,我们把rownum当成列来使用而不是行号;
    select * from (select rownum rm,e1.* from (select rownum,e.* from emp e order by sal desc)
    e1  where rownum<8 ) e2 where rm>2;
(5)函数
   字符函数
    length(),concat(),substr(),trim()
   数值函数
       round() trunc()
       select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,round(45.926,-1) 四,round(45.926,-2) 五 from dual;
       select trunc(45.926,2) 一,trunc(45.926,1) 二,trunc(45.926,0) 三,trunc(45.926,-1) 四,trunc(45.926,-2) 五 from dual;
   日期函数
       sysdate  systimestamp
       next_day(,'星期一')
       last_day()
       trunc()
   查看并修改oracle默认日期格式:
       select * from v$nls_parameters;
       alter sessin|system set NLS_DATE_FORMATE=’yy-mm-dd’;
   转换函数
       to_char() 可以转换成日期或者指定格式
       to_number() 字符串转换成数字
       to_date() 字符串转换日期
(6)其他函数
   关于null的函数:
       nvl(a,b)    a为null,则返回b
       nvl2(a,b,c) a为null,则返回c,否则返回b
       nullif(a,b) a=b,则返回null,否则返回a
   条件语句函数
       case when then else end
       decode(ename,'',,,,)
   分析排名函数
       rank() over(order by xxx )       相同的值排名相同,排名跳跃
       DENSE_RANK() over(order by xxx)  相同的值排名相同,排名连续
       ROW_NUMBER() over(order by xxx)  连续的排名,无论值是否相等
(7)集合操作
       union 去重,union all不去重
       集合参与运算(并集,交集,差集)需要每一个集合的列个数和类型要一样;
       order by放在最后;

原文地址:https://www.cnblogs.com/datapool/p/6943791.html