Oracle 多表查询

1.多表查询的实现形式
2.笛卡儿积的处理
3.数据表的连接操作
4.数据的集合操作

【3.确定要使用的数据列】select [distnct]*|列[别名],....|常量
【1.确定数据来源】from 表名[别名],表名[别名]
【2.对数据进行筛选】[where 条件]
【针对返回的结果进行排序】order by 字段[asc|desc,...]

select * from emp,dept ;
--返回的结果条数:emp的数据条数 *dept 表的条数 这种现象称为笛卡儿积;

---消除显示上的笛卡儿积(多表关联的时候可能出现相同列名所有需要定义别名)
select * from emp e,dept d where e.deptno=d.deptno;
--可以消除显示上的笛卡儿积(笛卡儿积在多表查询中一直会存在)如果数据量很大的时候会很慢;
---尽量避免使用多表查询(在数据量很大的时候)
---在任何的条件下多表查询都要有一个前提条件:要有关联字段或条件,不存在这些要求,一定不能做多表查询;
   1.要明确需要使用的数据表
   2.确定已知的关联字段
   

表连接
让等值判断左右两边有一边的数据可以全部显示出来,如果想要实现要用
外链接,"(+)"的语法完成;

关键字"(+)"出现在哪个表的连接列后面,就表明哪个表会以NULL值来填充那些不满足
连接条件并位于该表中的查询列,此时应该以关键字"(+)"对面的表来作为外连接的驱动表;(关键取决于哪个表时驱动表)


左外连接:字段=字段(+)
右外链接:字段(+)=字段
1.内连接(等值连接):所有满足条件的数据都会查出来
select * from emp e,dept d where e.deptno=d.deptno;
  只有当e.deptno=d.deptno才会查询出来,如果此时数据为空(没有部门编号),此条件无法满足,则内容不能显示;
2.外连接(左外连接,右外连接,全外连接)控制左边与右边的数据是否全部显示;
select c.rowid,c.* from emp c;
select * from emp e ,dept d where e.deptno(+)=d.deptno;
---查询每个雇员的姓名,职位,领导姓名
1.emp 表 雇员的姓名,职位
  emp 表 领导姓名
  emp.mgr=memp.empno
  select e.ename,e.job,memp.ename
  from emp e,emp memp where e.mgr=memp.empno(+) 

  select * from emp join dept using(deptno);
  

【3.确定要使用的数据列】select [distnct]*|列[别名],....|常量
  【1.确定数据来源】from 表名1 [cross join tableName2]
  [natural join tableName2]
  [join tableName on(条件)|using(字段)]
  [left|right|full outer join tableName2]
【2.对数据进行筛选】[where 条件]
【针对返回的结果进行排序】order by 字段[asc|desc,...]

  [union |union all|intsect|minu]  
   【3.确定要使用的数据列】select [distnct]*|列[别名],....|常量
  【1.确定数据来源】from 表名1 [cross join tableName2]
  [natural join tableName2]
  [join tableName on(条件)|using(字段)]
  [left|right|full outer join tableName2]
【2.对数据进行筛选】[where 条件]
【针对返回的结果进行排序】order by 字段[asc|desc,...]

相当于多个查询连接为一个查询结果返回,那么多个查询返回的列的结果必须相同;
union 将两个查询连接为一个查询结果返回,如果遇到重复的数据不会重复显示;
union all 将两个查询连接为一个查询结果返回,如果遇到重复的数据会重复显示;
intersect返回两个查询中的相同数据,属于交集操作
minu   返回差集,用以一个集合减去第二个集合的数据集


总结
1.只要是多表查询永远存在笛卡尔积,所有优秀的系统设计时候觉得不可以出现多表查询操作;
2.多表连接查询,必须存在有关联字段或关联条件,否则无法进行多表查询
3.大部分情况下,使用的都是内连接,外连接oracle提供了"(+)"来操作
4.在Oracle以外的数据(sqlserver,mysql)需理由sql:1999语法实现;
5.可以是哟集合操作将多个查询结果合并到一起显示,但是要求,多个查询的返回的列的结果相同;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值