ORACLE 查询语句讲义

  1 查询语句基础知识:


           select
                   列  "别 名",列,...     (显示列)
           from 表名         
           where 条件
           group by 分组列,分组列
           having  聚合函数条件
           order by 列 desc , 列 asc
 条件:
     比较运算符 =,<>,>,<,>=,<=
     逻辑运算符 not 非 ,and 并且,or 或者
       列名 > 值   and  列名< 值           
       not(列名=值)  
  等值范围判断  (数字,日期 ,文字)
     列名 in(值1,值2,值3) <--------> 列 = 值1 or 列=值2 or 列=值3
  值1和值2之间范围判断包含边界 (数字,日期)  
     列名 begin 值1 and 值2  <--------> 列 >=值1 and 列 <=值2
  模糊查询  (文字)
     通配符的种类 % 0到多个任意字符 , _ 1个任意字符 
     列名 like '通配符'
           select * from emp
           where  hiredate between to_date('1981-1-1','yyyy-mm-dd') 
                               and to_date('1981-12-31','yyyy-mm-dd') 
排序 
    排序方式 
    asc 升序(默认),desc 降序,紧跟列名不能跨越逗号
    order by 列
    主排序列,次要排序列
    
  select * from emp
  order by job ,sal desc
  备注:不区分大小写('值'例外)    
        单引号表示字符串: '字符串'
        逗号:分割列
        能用列名的地方,就可使用函数,计算列


2 聚合函数 (统计分析,表):

count条数,sum某列和,avg某列平均,min某列最小值,max某列最大值
    -- select ename, to_char(hiredate,'yyyy'),nvl(comm,0) from emp
select count(*),sum(comm),avg(nvl(comm,0)) from emp
     注意:1 count 对记录行来说的,其他对应具体列(数值列)
           2 所有函数空行不记录在内
           3 聚合函数旁边存在非聚合函数列,该列必须放入group by 中 
           4 排序列,having 非聚合函数条件列 必须在select中列出来的列才能排序
           5 非聚合函数条件放where中,聚合函数条件放having中
select to_char(hiredate,'yyyy'),
      min(sal+nvl(comm,0)),max(sal+nvl(comm,0)),avg(sal+nvl(comm,0)) from emp
--where to_char(hiredate,'yyyy')='1981'
group by to_char(hiredate,'yyyy')
having count(*)>1


  3表关联: 查多的一方,条件在1 的一方


       select * from 表1 ,表2,表3 
              where 表1.主键=表2.外键 
              and  表1.键=表3.键
       1        1
       2        2
       ----------------------------a-------
       1      1
       1      2
       2      1 
       2      2
       
       select * from dept
       select ename from dept ,emp where emp.deptno=dept.deptno and dname='ACCOUNTING'


  4表链接:(从多个表里查内容,要显示多个表的数据)


       内链接:查多的一方,条件在1 的一方
        select * from 表1 
                inner join 表2 on 表1.主键=表2.外键
                inner join 表3 on 表1.主键=表3.外键
                
        select dname,count(*) from dept inner join emp on emp.deptno=dept.deptno
         group by dname 
         
         外联接:在inner join 基础上+关联不上的数据
                    left  以 join 左边表为准 
                    right 以 join 右边为准
                    full  在inner join 基础上+左,右表关联不上的数据
                select * from 表1 
                 left outer join 表2 on 表1.主键=表2.外键
                 right outer join 表3 on 表1.主键=表3.外键
                 full outer join 表4  on 表4.主键=表3.外键
         
         select * from dept full outer join emp on dept.deptno=emp.deptno
         where emp.ename is null or dept.deptno is null
        
         select count(yg.ename), jl.ename from emp yg inner join emp jl on 
                  yg.mgr=jl.empno
                  group by jl.ename


 5 示例    语句  
           

--显示  部门名称 为Accounting 的员工  及 其经理的名字     
      select yg.ename,jl.ename from emp yg 
             inner join dept on dept.deptno=yg.deptno
             left join emp jl on yg.mgr=jl.empno
      where dname='ACCOUNTING'
--查询员工名字包含A的所有员工及所在部门名称
      select ename,dname from emp left join dept on dept.deptno=emp.deptno
      where ename like'%A%'
--查询部门的平均工资大于2000的部门名字
select dname,avg(nvl(sal,0)) from emp right join dept on dept.deptno=emp.deptno
group by dname
having avg(nvl(sal,0))<2000
--查询1981-1-1至 1982-12-31之间雇佣员工人数大于2的部门名称
select dname,count(ename) from emp right join dept on dept.deptno=emp.deptno
where hiredate between  to_date('1981-1-1','yyyy-mm-dd')
               and  to_date('1982-12-31','yyyy-mm-dd')  
group by dname
having count(ename)>2      
--查询没有员工的部门名称
    select dname from emp right join dept on dept.deptno=emp.deptno
       where ename is null
--查询各个经理的名字及所在部门名字  
--distinct去重复行        
     select  jl.ename,dname,count(*) from emp yg inner join emp jl on yg.mgr=jl.empno
                     inner join dept on jl.deptno=dept.deptno
        group by jl.ename,dname
--查询 有佣金(列名  comm ) 的部门名字 及 人数                             
  select dname,Count(*) from emp right join dept on dept.deptno=emp.deptno           
  where comm is not null
  group by dname        

--查询所有部门人数
        select dname ,count(emp.ename) from emp 
               right outer join dept on emp.deptno=dept.deptno
         group by dname            
--各岗位,各部门(显示部门名)的平均工资         
select job,dname ,avg(sal+nvl(comm,0)) from emp 
               right outer join dept on emp.deptno=dept.deptno
         group by job,dname
           

  • 33
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值