ITPub博客

首页 > 数据库 > Oracle > 显示来自多个表的数据——JOIN

显示来自多个表的数据——JOIN

原创 Oracle 作者:brj880719 时间:2017-09-26 10:00:49 0 删除 编辑

表关系简介


一、语法

  1. SELECT 字段列表
  2.   FROM TABLE1
  3. [CROSS JOIN TABLE2 ] |
  4. [NATURAL JOIN TABLE2 ] |
  5.  [JOIN TABLE2 USING (字段名) ] |
  6.  [JOIN TABLE2 ON (TABLE.COLUMN_NAME = TABLE2.COLUMN_NAME) ] |
  7. [(LEFT | RIGHT | FULL OUT) JOIN TABLE2 ON (TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME) ];

二、自然连接

1、USING
  如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用USING子句来设置用于等值连接的列(参照列)名。
不允许在参照列上使用表名或者别名作为前缀
  1. --99语法
  2. SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAME
  3.   FROM EMP
  4.   JOIN DEPT
  5.  USING (DEPTNO);
  6.  
  7.  --92语法
  8. SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAME
  9.   FROM EMP, DEPT
  10.  WHERE EMP.DEPTNO = DEPT.DEPTNO;
2、ON
  如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用On子句
  1. SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAME
  2.   FROM EMP
  3.   JOIN DEPT
  4.     ON (EMP.DEPTNO = DEPT.DEPTNO);

三、自连接

  自己和自己做链接

  1. --99语法
  2. SELECT WORKER.LAST_NAME EMP, MANAGER.LAST_NAME MGR
  3.   FROM EMPLOYEES WORKER
  4.   JOIN EMPLOYEES MANAGER
  5.     ON (WORKER.MANAGER_ID = MANAGER.EMPLOYEE_ID);
  6.     
  7. --92语法
  8. SELECT WORKER.LAST_NAME EMP, MANAGER.LAST_NAME MGR
  9.   FROM EMPLOYEES WORKER, EMPLOYEES MANAGER
  10.  WHERE WORKER.MANAGER_ID = MANAGER.EMPLOYEE_ID;

四、非等值连接

  1. --99语法
  2. SELECT E.LAST_NAME, E.SALARY, J.GRADE_LEVEL
  3.   FROM EMPLOYEES E
  4.   JOIN JOB_GRADES J
  5.     ON E.SALARY BETWEEN J.LOWEST_SAL AND J.HIGHEST_SAL;
  6.     
  7. --92语法
  8. SELECT E.LAST_NAME, E.SALARY, J.GRADE_LEVEL
  9.   FROM EMPLOYEES E, JOB_GRADES J
  10.  WHERE E.SALARY BETWEEN J.LOWEST_SAL AND J.HIGHEST_SAL;

五、INNER|OUTER 连接

1、INNER 连接
  两个表连接,只返回匹配的行,被称为内连接。
  1. --查询所有员工以及其部门名字
  2. --99语法
  3. SELECT LAST_NAME, DEPARTMENT_NAME
  4.   FROM EMPLOYEES E
  5.  INNER JOIN DEPARTMENTS D
  6.     ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

  7. --92语法
  8. SELECT LAST_NAME, DEPARTMENT_NAME
  9.   FROM EMPLOYEES E, DEPARTMENTS D
  10.  WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID;
2、LEFT OUTER | RIGHT OUTER 连接
  两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接。
  1. --哪些部门没有员工,看出部门名字
  2. --99语法
  3. SELECT DEPARTMENT_NAME
  4.   FROM EMPLOYEES E
  5.  RIGHT JOIN DEPARTMENTS D
  6.     ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
  7.  WHERE LAST_NAME IS NULL;

  8. --92语法
  9. SELECT DEPARTMENT_NAME
  10.   FROM EMPLOYEES E, DEPARTMENTS D
  11.  WHERE E.DEPARTMENT_ID(+) = D.DEPARTMENT_ID
  12.    AND LAST_NAME IS NULL;
3、FULL OUTER 连接
  两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行,这种连接称为全外联接。
  1. --99
  2. SELECT E.LAST_NAME, D.DEPARTMENT_ID, D.DEPARTMENT_NAME
  3.   FROM EMPLOYEES E
  4.   FULL OUTER JOIN DEPARTMENTS D
  5.     ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

  6. --92
  7. SELECT E.LAST_NAME, D.DEPARTMENT_ID, D.DEPARTMENT_NAME
  8.   FROM EMPLOYEES E, DEPARTMENTS D
  9.     ON E.DEPARTMENT_ID(+) = D.DEPARTMENT_ID(+);

六、笛卡尔积

笛卡尔集会在下面条件下产生:

1、连接条件被遗漏
2、连接条件不正确
3、所有表中的所有行互相连接

  1. --99语法
  2. SELECT E.LAST_NAME, D.DEPARTMENT_ID, D.DEPARTMENT_NAME
  3.   FROM EMPLOYEES E
  4.  CROSS JOIN DEPARTMENTS D;

  5. --92语法
  6. SELECT E.LAST_NAME, D.DEPARTMENT_ID, D.DEPARTMENT_NAME
  7.   FROM EMPLOYEES E, DEPARTMENTS D;


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24851054/viewspace-2145429/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 使用子查询
请登录后发表评论 登录
全部评论

注册时间:2014-12-06

  • 博文量
    75
  • 访问量
    67567