《复杂查询实现多表数据的访问》由会员分享,可在线阅读,更多相关《复杂查询实现多表数据的访问(48页珍藏版)》请在金锄头文库上搜索。
1、4Copyright Oracle Corporation, 2001. All rights reserved.从多表中显示数据4-2Copyright Oracle Corporation, 2001. All rights reserved.目标完成本课后, 您应当能够执行下列操作: 写SELECT 语句使用等值和非等值连接从多个表中访 问数据 使用外连接查看不满足连接条件的数据 使用一个自连接,连接一个表到它自己4-3Copyright Oracle Corporation, 2001. All rights reserved.大纲 笛卡尔积 连接的类型 ORACLE的所有连接Equi
2、join 等值Non-equijoin 非等值Outer join 外连接 Self join 自连接 SQL:1999适应性连接Cross joins 交叉连接Natural joins 自然连接Using clause 使用子句Full or two sided outer joins 全连接或双向外连接对于外连接的任意连接条件4-4Copyright Oracle Corporation, 2001. All rights reserved.从多表中获得数据EMPLOYEES DEPARTMENTS 4-5Copyright Oracle Corporation, 2001. All r
3、ights reserved.笛卡尔乘积 笛卡尔乘积的形成,当: 一个连接条件被遗漏时 一个连接条件不正确时 在第一个表中的所有行被连接到第二个表的所有行时 为了避免笛卡尔乘积的形成,在WHERE 子句中应当总 是包含正确的连接条件4-6Copyright Oracle Corporation, 2001. All rights reserved.笛卡尔乘积的产生笛卡尔乘积 20x8=160 rowsEMPLOYEES (20 rows)DEPARTMENTS (8 rows)4-7Copyright Oracle Corporation, 2001. All rights reserved.
4、大纲笛卡尔积 连接的类型 ORACLE的所有连接Equijoin 等值Non-equijoin 非等值Outer join 外连接 Self join 自连接 SQL:1999适应性连接Cross joins 交叉连接Natural joins 自然连接Using clause 使用子句Full or two sided outer joins 全连接或双向外连接对于外连接的任意连接条件4-8Copyright Oracle Corporation, 2001. All rights reserved.Equijoin 等值 Non-equijoin 非等值 Outer join 外连接 Se
5、lf join 自连接连接的类型Cross joins 交叉连接 Natural joins 自然连接 Using clause 使用子句 Full or two sided outer joins 全连接或双向外连接 Arbitrary join conditions forouter joins 对于外连接的 任意连接条件SQL: 1999 适应连接:Oracle所有的连接 (8i 以前):4-9Copyright Oracle Corporation, 2001. All rights reserved.用Oracle 语法连接表使用一个连接从多个表中查询数据在WHERE 子句中写连接条
6、件. 当多个表中有相同的列名时,将表名作为列名的前缀SELECTtable1.column, table2.column FROMtable1, table2 WHEREtable1.column1 = table2.column2;4-10Copyright Oracle Corporation, 2001. All rights reserved.大纲笛卡尔积 连接的类型 ORACLE的所有连接Equijoin 等值Non-equijoin 非等值Outer join 外连接 Self join 自连接 SQL:1999适应性连接Cross joins 交叉连接Natural joins
7、自然连接Using clause 使用子句Full or two sided outer joins 全连接或双向外连接对于外连接的任意连接条件4-11Copyright Oracle Corporation, 2001. All rights reserved.什么是等值连接?EMPLOYEES DEPARTMENTS Foreign keyPrimary key4-12Copyright Oracle Corporation, 2001. All rights reserved.SELECT employees.employee_id, employees.last_name, emplo
8、yees.department_id, departments.department_id,departments.location_id FROM employees, departments WHERE employees.department_id = departments.department_id;用等值连接返回记录4-13Copyright Oracle Corporation, 2001. All rights reserved.使用AND 操作符附加搜索条件EMPLOYEES DEPARTMENTS 4-14Copyright Oracle Corporation, 2001
9、. All rights reserved.限制不明确的列名 在多表中使用表前缀限制修饰列名 用表前缀改善性能 用列别名区别有相同名称,但在不同表中的列4-15Copyright Oracle Corporation, 2001. All rights reserved.SELECT e.employee_id, e.last_name, e.department_id,d.department_id, d.location_id FROM employees e , departments d WHERE e.department_id = d.department_id;使用表别名 使用表
10、别名简化查询 使用表别名改善性能.4-16Copyright Oracle Corporation, 2001. All rights reserved.多于两个表的连接EMPLOYEES LOCATIONS DEPARTMENTS 为了连接n 个表,你最少需要n-1 个连接条件。例如, 为了连接3 个表,最少需要两个连接4-17Copyright Oracle Corporation, 2001. All rights reserved.大纲笛卡尔积 连接的类型 ORACLE的所有连接Equijoin 等值Non-equijoin 非等值Outer join 外连接 Self join 自连
11、接 SQL:1999适应性连接Cross joins 交叉连接Natural joins 自然连接Using clause 使用子句Full or two sided outer joins 全连接或双向外连接对于外连接的任意连接条件4-18Copyright Oracle Corporation, 2001. All rights reserved.非等值连接EMPLOYEESJOB_GRADES在EMPLOYEES 表中的工资 必须在JOB_GRADES 表中 的最低工资和最高工资之间4-19Copyright Oracle Corporation, 2001. All rights re
12、served.用非等值连接返回记录SELECT e.last_name, e.salary, j.grade_level FROM employees e, job_grades j WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;4-20Copyright Oracle Corporation, 2001. All rights reserved.大纲笛卡尔积 连接的类型 ORACLE的所有连接Equijoin 等值Non-equijoin 非等值Outer join 外连接 Self join 自连接 SQL:1999适应性连接C
13、ross joins 交叉连接Natural joins 自然连接Using clause 使用子句Full or two sided outer joins 全连接或双向外连接对于外连接的任意连接条件4-21Copyright Oracle Corporation, 2001. All rights reserved.外连接EMPLOYEESDEPARTMENTS在部门190中无雇员4-22Copyright Oracle Corporation, 2001. All rights reserved.外连接语法 你可以用一个外连接查看那些不满足连接条件的行 外连接运算符是加号(+)SELEC
14、T table1.column, table2.column FROMtable1, table2 WHEREtable1.column(+) = table2.column;SELECT table1.column, table2.column FROMtable1, table2 WHEREtable1.column = table2.column(+);4-23Copyright Oracle Corporation, 2001. All rights reserved.SELECT e.last_name, e.department_id, d.department_name FROM
15、 employees e, departments dWHERE e.department_id(+) = d.department_id ; 使用外连接4-24Copyright Oracle Corporation, 2001. All rights reserved.大纲笛卡尔积 连接的类型 ORACLE的所有连接Equijoin 等值Non-equijoin 非等值Outer join 外连接 Self join 自连接 SQL:1999适应性连接Cross joins 交叉连接Natural joins 自然连接Using clause 使用子句Full or two sided outer joins 全连接或双向外连接对于外连接的任意连接条件4-25Copyright Oracle Corporation, 2001. All rights reserved.自连接EMPLOYEES (WORKER)EMPLOYEES (MANAGER)在WORKER 表中的MANAGER_ID 等于MANAGER 表中的EMPLOYEE_ID4-26Copyright Oracle Corporation, 2001. All rights reserved.连接一个表到它本身SELECT worker.last_name | works for |