Oracle数据库中的高级查询以及表连接/内连接/外连接

版权声明:作者: 子非鱼Leo 关于作者:专注大数据,java学习! 本文为博主原创文章,欢迎转载,但未经博主同意必须保留此段声明,且在文章页面明显位置给出原文链接 如有问题, 欢迎共同进步!邮箱[email protected] 原文链接 https://blog.csdn.net/Leo1120178518/article/details/86002190

主要针对以下问题进行讲解:
1.列别名和表别名
2.select…from where…group by…having…order by…
3.order by 排序 正序,逆序,单列排序,多列排序
4.rownum rowid Oracle的伪列
5.函数:单行函数(日期函数,字符函数,数学函数,转换函数,其他),多行函数
6.聚合函数(max ,min avg,sum,count)
7.group by 分组
8.having关键字

1.列别名和表别名

加类别名

语法: 字段名 as 字段别名
select 'dear '||ename from emp;
针对表中字段的别名称为列别名

第一种写法: select 'dear '||ename as 姓名 from emp;
as 是可以省略的
第二种写法:别名可以加双引号 select 'dear '||ename “姓名” from emp;
双引号可以省略
有一种情况双引号不能省略:别名中有空格,双引号不能省略

表别名

        语法 : 表名  表别名

–查询10部门的员工的姓名和工作
select ename,sal,job from emp where deptno=10;
–给emp表一个别名 语法 : 表名 表别名
select e.ename,e.sal,e.job from emp e where e.deptno=10;
select ename,sal,job from emp e where deptno=10; 一张表可以这样不会出问题,但是多张表后就不可以了。

 --规则:一旦给了表别名后,所有字段的使用都要:表别名.字段名
                    --  注意  :表别名是没有as的

2.select…from where…group by…having…order by…

  注意事项:(1)select ...from...必不可少的
                 eg:select sysdate from dual;
            (2)该语句的执行顺序,按照这样的顺序where...group by...having...order by...
            (3)这些关键字不能掉换顺序,可以没有,但是如果有的话,是不能掉换顺序的

3.order by 排序 正序,逆序,单列排序,多列排序

   单列排序
   
问题:查询emp表中员工的姓名,工资,按照工资降序排序
select ename,sal from emp order by sal desc;
问题:查询emp表中员工的姓名,工资,按照工资升序排序
 select ename,sal from emp order by sal asc;
  asc可以省略,默认情况下就是升序排列
  
  --总结:语法结构:select....from...order by 字段名  asc/desc
          --ASC是升序,desc是降序  如果不写默认是升序
     问题:查询部门20的员工的姓名和工资,并且按照工资进行降序排序
     select  ename,sal from emp where deptno=20 order by sal desc;
     
     多列排序
     --问题:查询emp表中的员工的姓名,部门编号,工资,先按照部门进行升序排列,同部门内部按照工资进行降序排列
      select  ename,deptno,sal from emp where deptno=20 order by deptno asc,sal desc;

多列排序总结:
(1)多列排序语法 order by 字段名1 asc|desc 字段名2 asc|desc
(2)多列排序的执行顺序,先按照字段1排序,然后在字段1排序的基础上,然后再按照字段2排序,,,,以此往下

4.rownum rowid Oracle的伪列

rownum

主要是用来做分页过程(web开发中)**

   select *from emp;
     
     select rownum,emp.*from emp;      (emp.*   别名)
  --rownum 相当于给查询结果的每一行编一个序列,并没有存储在emp表中
     select rownum ,e.* from emp e where deptno=30;                              
            --可以看出rownum是动态变化的
    问题1:查询emp表的前五条记录
               select  *from emp where rownum<=5;
         问题2:查询emp表中的3-5条记录
               select  *from emp where rownum>=3 and rownum<=5; 这样是查询不出来的,因为>在rownum是无法使用的
               select  rownum ro,e.*from emp e where ro>=3 and ro<=5;同样解决不了。
               
               select  * from(select  rownum ro,e.*from emp e) where ro>=3 and ro<=5;   这样就可以使用了(子查询)
                 >   >=符号是是不管用的
  总结:(1)rownum<2   rownum<=2  rownum=1 这样是可以使用的
                  --不能是rownum>2或者是rownum>=2  rownum=2

–重点

         问题3:查询emp表中工资最高的前五名的员工姓名,工作,工资
               select ename,job,sal from emp where rownum<=5 order by sal desc;   
                                                        //查询结果是不正确的,因为只对先进行取前五条,再进行了排序
               
               select *from (select ename,job,sal from emp order by sal desc)x where rownum<=5; 这样是正确的
         要先排序,再取前五行
         
         问题4:查询emp表中工资最高的3-5名员工的姓名,工作,工资
--分析   --(1)select  ename ,job,sal from emp order by sal desc   --记为x
            --(2)取x得3-5行:select *from (select rownum ro,x.* from x) where ro>=3 and ro<=5;
            --(3)替换 select *from (select rownum ro,x.* from (select  ename ,job,sal from emp order by sal desc)x) where ro>=3 and ro<=5;

rowid

        **:表示的记录的物理地址,不随记录的在查询结果中的顺序的改变而改变,唯一的且固定的
       --并没有写在表结构中**
       select rowid,e.*from emp e;
       
       select rowid ,e.* from emp e where ename='CLARK';

聚合函数(max ,min avg,sum,count)

  问题1:求emp表中员工的总数
  
  select  count(*) from emp;   求记录的总数
  也可以是这种形式
  select count(empno) from emp;
  
  问题2:求emp表中工资最高的那个员工的工资
  
  select max(SAL) FROM EMP;
  
  问题3:求emp表中工资最低的员工的工资
  
  select min(sal) from emp;
  
  问题4:求该公司员工的平均工资
  select avg(sal) from emp;
  
  问题5:求该公司每个月一个总开支(工资和奖金)
  select sum(sal+comm) from emp;   //此处结果有问题   null和数值不能直接相加
  select sum(sal+nvl(comm,0)) from emp; 

—补充:nvl(comm,0) :判断comm是否为null 要是null 返回为0,要不是null 返回comm

sum

语法:sum(distinct|all)
参数:all表示对所有的值 (缺省),distinct只对不同的值
解释:求总和

示例:
select sum(distinct sal) from emp;
select sum(all sal) from emp;

avg

语法:avg(distinct|all)
参数:all表示对所有的值 (缺省),distinct只对不同的值
解释:求平均值

示例:
select avg(distinct sal) from emp;
select avg(all sal) from emp;

max

语法:max(distinct|all)

参数:all表示对所有的值 (缺省),distinct只对不同的值
解释:求最大值

示例:
select max(distinct sal) from emp;

min

语法:min(distinct|all)
参数:all表示对所有的值 (缺省),distinct只对不同的值
解释:求最小值

示例:
select min(all sal) from emp;

count

语法:count(distinct|all)

参数:all表示对所有的值 (缺省),distinct只对不同的值(相同值只取一次)
解释:求记录、数据个数。

示例:
select count(sal) from emp;
select count(distinct sal) from emp;

.group by 分组

  问题1:求emp表中每个部门的员工的总人数,请列出部门的编号和总人数,和平均工资
  
  select deptno,count(*),agv(sal) from emp group by deptno;
  问题2:求部门10的员工的个数,员工的平均工资,请列出部门的编号和总人数,以及平均工资
--group by 使用规则:
         --出现在select后面的字段,除了聚合函数之外,其他字段内容必须出现在group by之后
         --如果不按照上述规则写,报错,不是单组分组函数,使用会出错。报错,不是单组函数或者不是group by表达式

问题3:查询部门10的员工人数和平均工资
select count(*),avg(sal) from emp where deptno=10;

 --多字段分组的一个问题

问题4:查询emp表中每个部门,每个职位的员工人数;

select deptno,job,count(*) from emp group by deptno,job;
–注意:多字段分组,分组的顺序是按照字段的先后顺序来的

问题5:查询emp表中,每个部门的编号,并且按照部门人数进行降序排序

select deptno,count() from emp group by deptno order by count() desc;

8.having关键字,主要是和group连用,并且针对聚合函数条件进行二次条件限定的

问题6:查询emp表中每个部门的人数,找出人数大于3的部门,并按照总人数降序排列

select deptno,count() from emp group by deptno having count()>3 order by count(*) desc;

注意事项:

注意事项:(1)聚合函数的条件,不能出现在from ,where子句,不能出现在group by 后面,
           聚合函数可以出现在select子句,having子句  order by 子句
              
   (2)where子句中放的是普通条件,不涉及到聚合函数的条件
   (3)having 子句中不能放普通条件,涉及聚合函数的条件

高级查询2

主要针对以下问题进行说明:
1.表连接(内连接,外连接(左外连接,右外连接,全外连接))
2.表连接:两表连接,三表连接,四表连接
3.子查询:单行子查询,多行子查询
4.子查询:any all
5.视图:什么是视图?视图的作用?怎么创建和删除视图?
6.索引:什么是索引?索引的作用?怎么创建合适的索引?创建删除和维护索引语法?

等值连接

--1.问题:查询每个员工的部门名称,列出员工姓名和部门名称
select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno

–表连接中别名的使用:
为了避免出现“未明确定义列”的错误,建议使用表别名.字段名的方式引用字段

总结:select…from 表1,表2,表3,… where 连接条件1 and 连接条件2 and …
连接条件:e.deptno=d.deptno等值连接的条件,所以这种连接成为等值连接

不等值连接

非等值连接是指在多个表之间使用非等号连接,查询在多个表中有非等值关联关系的数据。非等值连接操作符包括>、>=、<、<=、<>以及between…and、like、in等。

例:查找每个员工的薪水等级

2. 问题:查询员工表中,每个员工的工资等级,列出员工姓名,工资和工资等级
select e.ename,e.sal,s.grade from emp e,salgrade s
where e.sal between s.losal and s.hisal;

自连接:

自连接是一种特殊的连接,数据的来源是一个表,即关联关系来自于单表中的多个列。比如职员表中的经理列,就参照了本表中职员编码列,即经理也是机构下的职员之一。
自连接是通过将表别名虚拟成两个表的方式实现,可以是等值的或不等值的连接。
例:查询每个职员经理的名字以及经理的员工编号

--3. 查询所有比自己领导入职早的员工的姓名和上级领导的姓名
select w.ename as 员工姓名,m.ename as 上级领导姓名
from emp w,emp m where w.mgr=m.empno and w.hiredate<m.hiredate;

内连接:

--1.问题:查询每个员工的部门名称,列出员工姓名和部门名称
select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;

–总结:select…from 表1 inner join 表2 on 连接条件 where 查询条件

–问题:查询部门10中每个员工的工资等级

select e.ename,s.grade from emp e
inner join salgrade s
on e.sal between s.losal and s.hisal             --连接条件
where e.deptno=10;    --查询条件

--问题:查询emp表中部门名称为ACCOUNTING的员工的姓名,和部门位置

select e.ename,d.loc from emp e,dept d

where e.deptno=d.deptno and d.dname='ACCOUNTING';

select e.ename,d.loc from emp e inner join dept d

on e.deptno=d.deptno

where d.dname='ACCOUNTING';

–查询高于自己部门平均工资的员工的信息,列出部门平均工资

--(1)获得每个部门的平均工资
select deptno,avg(sal) avg_sal from emp group by deptno;   --x

--(2) 将x表和emp表做表连接
select e.*,x.* from emp e,x where e.deptno=x.deptno and e.sal>x.avg_sal;

--(3)替换x

select e.*,x.* from
emp e,(select deptno,avg(sal) avg_sal from emp group by deptno)x
where e.deptno=x.deptno and e.sal>x.avg_sal;

内连接和外连接

针对内连接和外链接,我们通过图表进行详细说明

A表(父母表):
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Leo1120178518/article/details/86002190
今日推荐