日期:2014-05-16  浏览次数:20369 次

多表之间的数据查询(join)
多表之间的数据查询(join)
    
多个表之间关系:一对多|(多对一)  多对多 一对一 3种
表与表之间数据的完整性:
     1. 关系的完整性约束:实体完整性、参照完整性、用于定义的完整性。 必 
               须满足实体完 整性和参照完整性.   
     2. 实体完整性:规定了字段|属性的约束
     3. 参照完整性:关系与关系之间的引用 某个字段的约束  外键
        备注:实体完整性及参照完整性是任何关系数据库必须满足的条件。
     4. 用户定义完整性:举例:在学生表中 学生的年龄不能够大于60(用户
                                    自定义的条件)
以员工表与部门表为例:(一对多的关联)
部门表:
-- Create table
create table DEPT
(
  DEPTNO NUMBER(2) not null,
  DNAME  VARCHAR2(14),
  LOC    VARCHAR2(13)
)
tablespace SYSTEM
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints
alter table DEPT
  add constraint DEPT_PRIMARY_KEY primary key (DEPTNO)
  using index
  tablespace SYSTEM
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
员工表:
-- Create table
create table EMP
(
  EMPNO    NUMBER(4) not null,
  ENAME    VARCHAR2(10),
  JOB      VARCHAR2(9),
  MGR      NUMBER(4),
  HIREDATE DATE,
  SAL      NUMBER(7,2),
  COMM     NUMBER(7,2),
  DEPTNO   NUMBER(2) not null
)
tablespace SYSTEM
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints
alter table EMP
  add constraint EMP_PRIMARY_KEY primary key (EMPNO)
  using index
  tablespace SYSTEM
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
alter table EMP
  add constraint EMP_FOREIGN_KEY foreign key (DEPTNO)
  references DEPT (DEPTNO);
alter table EMP
  add constraint EMP_SELF_KEY foreign key (MGR)
  references EMP (EMPNO)
  disable;

基本连接查询
  在emp表与dept表之间存在着多对一的关联关系(现实中还有其他的关联),往往我们希望查询出更多信息,这时候我们就要用到连接查询。
//查询员工及部门的详细信息  但是会产生一个笛卡尔积的效果
SQL> select * from emp,dept;
//怎么避免笛卡尔积呢?加入where查询条件 引用关系的比较
SQL> select * from emp ,dept where emp.deptno = dept.deptno;
//别名查询 为表起别名 采用别名查询
SQL> select * from emp e,dept d  where e.deptno=d.deptno;
//注意 以下写法是有问题的:ORA-00918: 未明确定义列
SQL> select e.empno,e.ename,deptno,d.dname from emp e,dept d where e.deptno=d.deptno;
备注说明:deptno在两个表中都存在,所以一定要使用前缀区分。
SQL> select e.empno,e.ename,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;
综上所述 创建连接查询时应遵循如下规则:
from子句应当包括所有的表名
where子句应定义连接条件 两个表1一个等值条件 三个表 2个等值条件…依次类推。
备注:连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
当列名为多个表共有时,列名必须被限制。


   
使用join连接查询
      语法:
        Fr