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.可以是哟集合操作将多个查询结果合并到一起显示,但是要求,多个查询的返回的列的结果相同;