Oracle学习教程 多表连接和子查询


支持SQL1999的新连接标准 包括以下新的TABLE JOIN的句法结构 • CROSS JOIN——它在两个表格中创建了一个笛 卡尔积,就象是在Oracle8i中没写WHERE时一样 • NATURAL JOIN——这是一个很有用的Oracle9i的 句法,它通过从WHERE子句中自动连接标准来改 善SQL的稳定性 • USING子句——它可以通过名字来具体指定连接 支持SQL1999的新连接标准 • ON子句——这个句法允许在两个表中为连接具体 指定列名 • LEFT OUTER JOIN——它返回表格中左边的行和 右边的数值,如果没有搭配的行的话,则返回空 • RIGHT OUTER JOIN——它返回表格中右边的行 和左边的数值,如果没有搭配的行的话,则返回 空 • FULL OUTER JOIN——它返回的是两个表格中所 有的行,用空填满每一个空格。这在Oracle8i中则 没有相应的此种句法 SQL1999新连接标准语法 SELECT table1.column, table2.column FROM table1 [CROSS JOIN table2] | [NATURAL JOIN table2] | [JOIN table2 USING (column_name)] | [JOIN table2 ON(table1.column_name = table2.column_name)] | [LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)]; 交叉连接 CROSS JOIN • CROSS JOIN产生了一个笛卡尔积,就象是在连接 两个表格时忘记加入一个WHERE子句一样 Select last_name, department_id from employees,departments; • 在Oracle9i中,可以使用CROSS JOIN 来达到相同 的结果 Select last_name, department_id from employees cross join deptartments; 自然连接 NATURAL JOIN • NATURAL JOIN 子句基于两个表中列名完全相同 的多个列产生连接 • 从两个表中选出连接列的值相等的所有行 • 如果两个列的名称相同,但是具有不同的数据类型, 则查询会返回一个错误 Select last_name, department_name from departments natural join employees; USING子句 •如果一些列有相同的名称但是类型不匹配,自然连接将 出错,可以在自然连接的 NATURAL JOIN 子句上使用 USING 子句来设置用于等值连接的 •不要在参照列上使用表名或者别名作为前缀 Select department_name, city from departments JOIN locations USING (location_id); ON子句 •自然连接的条件是基于表中所有同名列的等值连接 •为了设置任意的连接条件或者指定连接的列,需要 使用ON子句 •连接条件与其它的查询条件分开书写 •使用ON 子句使查询语句更容易理解 Select department_name, city from department d JOIN location l ON (d.location_id = l.id); 多表连接 多表连接就是两个以上的表被连接所用的 Select emp_id, city_name, dept_name from locations l JOIN departments d ON (d.location_id = l.location_id) JOIN employees e ON (d.department_id = e.department_id); 左外连接 LEFT OUTER JOIN 在LEFT OUTER JOIN中,会返回所有左边表中 的行,即使在右边的表中没有可对应的列值。 select last_name, department_id from employees LEFT OUTER JOIN Deptartments ON e.department_id = d.department_id; 右外连接 RIGHT OUTER JOIN RIGHT OUTER JOIN中会返回所有右边表中 的行,即使在左边的表中没有可对应的列值。 select last_name, d.dept_id from employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id); 全外连接 Full outer Join 这是Oracle9i新增的功能,返回连接表中的所有记录, 包括不存在对应记录的记录 SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id) 子查询 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); –子查询在主查询前执行一次 –主查询使用子查询的结果 使用子查询的注意事项 – 子查询要用括号括起来 – 将子查询放在比较运算符的右边(增强可读性) – 只有在执行Top-N分析时,子查询中才需要使用 Order by子句 – 在Oracle8i之前的版本中,子查询不能包含 Order by子句 – 对单行子查询使用单行运算符 – 对多行子查询使用多行运算符 子查询的种类 – 单行子查询 主查询 子查询 返回 CLERK 多行子查询 CLERK MANAGER 主查询 子查询 返回 多列子查询 CLERK 7900 MANAGER 7698 主查询 子查询 返回 单行子查询 – 返回一行记录 – 使用单行记录比较运算符 Operator = > >= < <= <> Meaning Equal to Greater than Greater than or equal to Less than Less than or equal to Not equal to 下面的语句错在哪里? SELECT empno, ename FROM emp WHERE sal = (SELECT MIN(sal) FROM emp GROUP BY deptno); ERROR at line 4: ORA-01427: single-row subquery returns more than one row •对多行子查询使用了单行比较操作符. 下面的语句将会返回行吗? SELECT ename, job FROM emp WHERE job = (SELECT job FROM emp WHERE ename = 'Haas'); no rows selected •子查询不返回任何值 多行子查询 – 返回多行 – 使用多行比较运算符 运算符 IN ANY ALL 含义 等于列表中的任何值 将值与子查询返回的任意一个值进行比较 比较子查询返回的每一个值 在多行子查询中使用ANY运算 符 'IT_PROG'; 在多行子查询中使用ALL运算符 >ALL指大于最大值 'IT_PROG'; 本章小结 本章讲述了什么是多表连接,以及 多表连接的几种类型,通过例子说明了 以前的多表连接语法和新的Sql99标准 中的连接语法的差异。在本章的最后也 讲述了子查询 的基本语法和使用,并且 重点强调了子查询中容易出的错误。
还剩20页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

289434497

贡献于2012-05-04

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf