300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Oracle数据库中的多表查询

Oracle数据库中的多表查询

时间:2019-03-25 16:30:32

相关推荐

Oracle数据库中的多表查询

经验查询:在日后的开发之中,很多人都肯定要接触到许多新的数据库和数据表,那么在这种时候有两种做法; 做法一:新人做法,上来就直接输入以下的命令

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,locfrom 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','第一等工资') gradefrom 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;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。