Oracle数据库中的多表查询

Oracle数据库 专栏收录该内容
13 篇文章 1 订阅
经验查询:
在日后的开发之中,很多人都肯定要接触到许多新的数据库和数据表,那么在这种时候有两种做法;
做法一:新人做法,上来就直接输入以下的命令
select * from 表名称;
如果此时数据量较大的话,以上无法浏览数据,二有可能造成系统的死机;
做法二:老人做法,先看一下有多少条记录
select count(*) from 表名称;
笛卡尔积问题:
本问题在数据库的操作之中被称为笛卡尔积,就表示多张表的数据乘积的意思,但是这种查询结果肯定不是用户所希望的,那么该如何去掉笛卡尔积呢?
最简单的方式是采用关联字段的形式,emp表和dept表之间现在存在了deptno的关联字段,所以现在可以从这个字段上的判断开始

当查询之中,不同的表中有了相同字段名称的时候,访问这些字段必须加上表名称,即“表.字段”。

多表查询(条件查询):
在之前所使用的查询操作中,都是从一张表之中查询出所需要的内容,那么如果现在一个查询语句需要显示多张表的数据,则就必须应用到多表查询的操作,而多表查询的语法如下:

但是以上的程序也存在一个问题,在之前访问表中字段的时候使用的是“表.字段”名称,那么如果说现在假设表名称很长,例如:“yinhe_diqiu_yazhou_zhongguo_beijing_xicheng_ren”,所以一般在进行多表查询的时候往往都会为表起一个别名,通过别名.字段的方式进行查询。

多表查询实例:
各个表的字段:

1.查询出每一位雇员的编号、姓名、职位、部门名称、位置
1).确定所需要的数据表
emp表:可以查询出雇员的编号、姓名、职位
dept表:可以查询出部门名称和位置
2).确定表的关联字段:emp.deptno=dept.deptno
 select empno,ename,job,dname,loc from dept, emp 
    where dept.deptno=emp.deptno;
2.查询雇员的姓名、职位、领导是姓名(两个emp表,e.mgr=em.empno)
 select e.ename,e.job,em.ename from emp e,emp em 
    where e.mgr= em.empno;
1.查询出每一位雇员的编号、姓名、职位、部门名称、位置
1).确定所需要的数据表
emp表:可以查询出雇员的编号、姓名、职位
dept表:可以查询出部门名称和位置
2).确定表的关联字段:emp.deptno=dept.deptno

3.查询出每个雇员的编号、姓名、基本工资、职位、领导的姓名、部门名称及职位
select e.empno,e.ename,e.sal,e.job,em.ename mgrname,dname,loc
   from emp e,emp em, dept 
   where e.deptno= dept.deptno and e.mgr=em.empno;
4.查询出每一个雇员的编号、姓名、工资、部门名称、工资所在公司的工资等级,并且,等级的数字替换成文字,例如:1替换成'第五等级';2替换成'第四等级',以此类推
select e.empno,e.ename,e.sal,d.dname,decode(s.grade,'1','第五等工资','2','第四等工资','3','第三等工资','4','第二等工资','5','第一等工资') grade
   from emp e, dept d, salgrade s 
   where e.deptno= d.deptno and (e.sal between s.losal and s.hisal);
多表查询(左右连接):
Oracle独有:

(+):代表连接方向
主表的数据可以完全查出来
左连接:左边的表是主表,右连接:右边的表是主表
如果(+)在右边,是左连接(左边的表是主表);
如果(+)在左边,是右连接(右边的表是主表)
select e.ename, e.job, em.ename 
   from emp e, emp em 
   where em.empno= e.mgr(+);
以上是Oracle数据库独有的多表查询的方法,下面介绍一下所有数据库通用的语法结构
通用SQL语法:
除了以上的表连接操作之外,在SQL语法之中,也提供了另外一套用于表连接的操作SQL,格式如下:

通用语法1 :交叉连接
用于产生笛卡尔积
select * from emp cross join dept;  
等同于:
select * from emp ,dept;
笛卡尔积本身并不属于无用的内容,在某些情况下还是需要使用的
通用语法2 :自然连接(有约束条件时使用)
自动找寻两/多个表与表之间的外键关联关系(消除笛卡尔积)
select * from emp NATURAL join dept;
等同于:
select * from empt, dept where emp.deptno=dept.deptno;
但是并不是所有的字段都是关联字段,设置关联字段需要通过约束指定
通用语法3 :JOIN USING子句,相同字段名称可以使用
select * from emp join dept using (deptno);
用户自己指定一个消除笛卡尔积的关联字段
通用语法4 :JOIN ON子句,不相同字段名称也可以使用
select * from emp join dept on(emp.deptno=dept.deptno);
用户自己指定一个消除笛卡尔积的关联条件
通用语法5: 外链接
左外连接(左边的表是主表):left outer join...on
select * from emp LEFT OUTER join dept on emp.deptno=dept.deptno;
右外链接(右边的表是主表):right outer join...on
select * from emp RIGHT OUTER join dept on emp.deptno=dept.deptno;
全连接
select * from emp FULL OUTER join dept on emp.deptno=dept.deptno;
通用语法6 统计函数
在之前学习过一个count()函数,此函数的功能可以统计出表中的数据量,实际上这个就是一个统计函数,而常用的统计函数有如下几个:
COUNT():查询表中的数据记录
AVG():求出平均值
SUM():求和
MAX():求出最大值
MIN():求出最小值
练:统计出公司的所有雇员,每个月支付的平均工资及总工资
select trunc(AVG(sal)) avg, sum(sal) from emp;
通用语法7 :分组查询
首先必须先明确一点,什么情况下可能分组,例如:
>>公司的所有雇员,要求男性一组,女性一组,之后可以统计男性和女性的 数量
>>按照年龄分组,18岁以上的分一组,18岁以下的分一组
>>按照地区分组:北京人一组,上海人一组,四川人一组
如果这些信息都保存了数据库之中,肯定在数据的某一列上回存在重复的内容,例如;按照性别分组的时候,性别肯定有重复(男和女),按照年龄分组(有一个范围的重复),按照地区分组(有一个地区的信息重复)
所以,分组之中有一个不成文的规定:当数据重复的时候分组才有意义,以为一个人也可以一组(没什么意义)
分组查询语句(group by 放在最后写):

练:按照部门编号分组,求出每个部门的人数,平均工资
group by语句使用,除了统计函数以外,要查询的字段必须包含在group by中
select deptno,count(*),trunc(avg(sal),2) from emp group by deptno;





  • 19
    点赞
  • 2
    评论
  • 79
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值