oracle系列笔记(2)---多表查询

多表查询

上一篇文章主要讲Oracle的单表查询,详情请看链接:单表查询

    这篇文章主要讲四点:

 (1)oracle多表查询    (2)SQL99标准的连接查询   (3)子查询     (4)分级查询

  oracle多表查询有两种方式,一种是oracle所特有的查询方式,一种是SQL99标准的连接查询,是通用的一种多表查询。

   1. Oracle 连接

    等值连接 where中加入连接条件。在表中有相同的列在列名之前可以加上前缀。

--查询 员工的id 员工的姓名  员工的部门名称 员工所在的部门的城市
select e.employee_id,e.first_name,d.department_name,l.city  --这三个属性都不在一个表中,所以要建立关系
from employees e, departments d,locations l 
where e.department_id=d.department_id  and d.location_id =l.location_id


外连接:  使用外连接可以查询不满足条件的数据。外连接的符号(+)

--查询员工的id 姓名 部门名称 要求显示 所有的员工信息 没有部门的员工也要显示出来
select  e.employee_id,e.first_name, d.department_name
from employees  e,departments d
where  e.department_id=d.department_id(+)
--因为有可能有员工是没有部门的,这个时候默认是不显示的,要显示所有员工,就在和员工对面加(+)

--查询员工的id 姓名 部门名称 要求显示 所有的部门信息 没有员工的部门也要显示出来
select  e.employee_id,e.first_name, d.department_name
from employees  e,departments d
where  e.department_id(+)=d.department_id
--同样会有部门没有员工的,同上

自连接就是都在统一表中

--显示所有的员工 姓名 编号 和上一级领导的名字
select e.employee_id,e.first_name, ee.first_name
from employees e, employees ee
where  e.manager_id=ee.employee_id

2.SQL99标准的连接查询

通用的一种多表查询,上面的是oreal特有的

Join  on 

---查询员工的id 姓名 部门的名字
select e.employee_id,e.first_name, d.department_name
from  employees  e join departments d on e.department_id= d.department_id;

Natural join 自然连接  子句会以两个表中具有相同名字的列作为等值连接条件,在表中查询满足条件的数据

-- 部门的id   部门的名称  部门所在城市的名字
select d.department_id,d.department_name,l.city
from departments d  natural join  locations l  --会按顺序查找是否有相同

Join using:使用using子句可以在有多个列满足条件的情况下进行筛选,不要给选中的列加上表名或者前缀或者别名

select e.employee_id,e.last_name,d.location_id
from employees e join departments d using(department_id)--我觉得比Natural join更实用吧

外联接:

Lift outer join on 左外连接

right outer join on 右外连接

Full  outer join on 满外连接: 就是把两边都不满足的选出来

--查询员工的id  员工的姓名  员工的部门  要求 显示所有的员工信息没有部门的员工信息也要显示出来
select  e.employee_id, e.first_name,d.department_name
from employees e left outer join departments d 
on  e.department_id=d.department_id; --左满表示左边全部显示

3.子查询

--查找工资比OConnell工资高的所有人
select  first_name,salary 
from employees e
where e.salary>(select salary from employees where  last_name='OConnelll')
--括号中最后返回的仅仅是OConnell一个人的工资 

oracle 中有两个隐藏列

rowid 是一个唯一的 不会重复  rownum 是隐藏的用来标识当数据行的

Rownum:

-----找出工资最高的前三个
select a.first_name,a.salary from
(select rowid,rownum, e.first_name,e.salary
from employees e 
order by e.salary desc) a
where rownum<=3
--括号中已经对工资进行降序,但rownum在没有排序之前就已经从1,2...开始开好了,
--你最后排序了排序好后rownum变成杂乱的
--,外面又是一个新表,同样也有隐藏的rownum,这个时候同样是1,2....排好序,而且也对于的是降序,
--所以rownum<=3就可以出现工资最高的前三。

分页查询使用oracle语法 写出一个分页查询的sql

--总共有107条件数据  每页显示10条     查询第三页数据  31-40  要求按照工资排序
--第一步完成排序   第二步 固化rownum   第三步根据条件进行筛选

select rn r,t2.first_name,t2.salary from 
(select rownum rn,t1.* from
(select  *
from employees e 
order by e.salary desc) t1) t2
where rn>=31 and rn<=40
--第一个括号仅仅是降序了,第二个括号使rownum 和salary都有序排列,第三才是实例化rownum这个列是他变成真正存在的r列。
--同时where是不能别名的,所以要用rn,而不是r,因为顺序where优先于select

在子查询中使用组函数

--查询工资最低的员工有哪些
select first_name,salary  from employees  
where  salary= (select min(salary) from employees )--括号中就是一个工资最小值

---筛选出比  按照部门分组 得到部门的最低工资  然后找出比 50号部门最低工资高的部门有哪些
--子查询中的 HAVING 子句
select department_id,min(salary) --有min就表示不能有where
from employees e
group by department_id 
having min(salary)>( select min(salary) from  employees  where department_id=50)
--括号中是50号部门的最低工资

多行子查询:

In (等于列表中任意一个)

select  first_name,salary  from employees  e 
where e.salary in( select salary from employees ee where ee.salary<10000) 
--就相当于只要满足里面一个就可以,感觉加个in一点意义都没有

ANY (和子查询返回的任一个值比较)

select  first_name,salary  from employees  e 
where e.salary > any( select salary from employees ee where ee.salary<10000) 
--就相当于和括号中最小的一个值比较

ALL(和子查询返回的所有值比较)

--就相当于和括号中最大的一个值比较


4.分级查询:

可以明确的看到上下级关系

分级查询可以从上往下查询也可以从下往上查询

-- 从底部查询
select employee_id,last_name,job_id,manager_id 
from employees
start with employee_id=104
connect by prior manager_id=employee_id 

运行结果:

--从顶部到底部查询
select last_name,employee_id, manager_id
from employees e 
start with last_name='King'
connect by prior  employee_id =manager_id

--使用level 和lpad  格式化分层查询
select lpad(last_name,length(last_name)+(level*3)-2,'_')
from employees e 
start with last_name='King'
connect by prior  employee_id =manager_id

运行结果:

 

这篇文件就讲到这里,有不足之处欢迎大家留言指点!





  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在短短100天时间内精通Oracle,实战系列非常必要。以下是一个可能的学习计划。 首先,理论基础是至关重要的。花费前几周的时间,系统学习Oracle的基本概念和架构,包括数据库管理、SQL语言、数据模型等。这将为后续的实战提供必要的理论基础。 接下来,通过参加培训班、自学教程或在线课程,学习具体的Oracle实战技能。通过实际操作,掌握数据库的安装与配置、备份与恢复、性能调优、故障排除等方面的知识。在这个阶段,重点是理解各种实际场景下的解决方案,并通过实践来巩固和加深理解。 除了理论和实战技能,还需要有足够的实践。在100天的学习计划中,要尽可能多地进行实际操作和练习。可以利用一些开源项目或者模拟环境来进行练习,例如在自己的电脑上搭建一个本地数据库,或者参与一些实际项目的数据库管理工作。通过实践,可以提高对Oracle的熟悉度和运用能力。 同时,要注重知识的积累和总结。每天抽出时间,记录自己学到的东西,整理笔记,形成自己的学习文档。这将帮助巩固所学知识,也方便以后参考和复习。 最后,与其他Oracle专业人士进行交流和分享也是提升的一种方式。可以参加一些Oracle社群或者论坛,与其他人交流经验,共同学习进步。 总之,想要在短期内精通Oracle,需要合理安排学习计划,理论与实战相结合,注重实践和经验总结。通过坚持不懈的努力,相信能够在100天内达成学习目标。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值