显示多个表中的数据
大型数据库的相关表通过使用外键和主键或通常称为公共列的链接进行链接.连接表的功能将使您能够为生成的结果表添加更多含义.对于要在查询中连接的"n"个数字表,最少(n-1)个连接条件是必需的.根据连接条件,Oracle组合匹配的行对并显示满足连接条件的行.
联接分类如下
自然加入(也称为等值连接)或简单连接) - 使用通常命名和定义的列创建连接.
非等同连接 - 当没有等效行时连接表要连接的表 - 例如,将表的一列中的值与另一个表中的值范围进行匹配.
自联接 - 联接表格本身.
外部联接 - 包括另一个表中没有匹配记录时输出中表格的记录.
笛卡尔连接(也称为笛卡尔积或交叉连接) - 使用第二个表中的每一行复制第一个表中的每一行.通过显示每个可能的记录来创建表之间的连接组合.
自然加入
NATURAL关键字可以简化equijoin的语法.自然加入只要两个(或更多)表具有相同名称的列,并且列是连接兼容的,即列具有共享的值域,就可以实现连接操作.连接操作连接具有相同列值的表中的行命名列.
考虑DEPARTMENTS和EMPLOYEES表之间的一对多关系.每个表都有一个名为DEPARTMENT_ID的列.此列是DEPARTMENTS表的主键和外键EMPLOYEES表的密钥.
SELECT E.first_name NAME,D.department_name DNAMEFROM employees E NATURAL JOIN departments D;FIRST_NAME DNAME---------- ------MILLER DEPT 1JOHN DEPT 1MARTIN DEPT 2EDWIN DEPT 2
下面的SELECT查询通过使用ON关键字显式指定连接条件来连接两个表.
SELECT E.first_name NAME,D.department_name DNAMEFROM employees E JOIN departments DON (E.department_id = D.department_id);
有关NATURAL JOIN的一些限制.您不能使用NATURAL JOIN指定LOB列.此外,连接中涉及的列不能通过表名或别名限定.
使用子句
使用自然连接,Oracle隐式标识列以形成连接的基础.许多情况需要明确声明连接条件.在这种情况下,我们使用USING子句来指定加入条件.因为USING子句基于列的相等性来连接表,所以它也被称为Equijoin.它们也称为内连接或简单连接.
语法:
SELECT
考虑以下SELECT查询,使用公共列DEPARTMENT_ID连接EMPLOYEES表和DEPARTMENTS表.
SELECT E.first_name NAME,D.department_name DNAME FROM employees E JOIN departments D USING(department_id);
自联接
当存储在单个表中的行之间存在感兴趣的关系时,SELF-JOIN操作会生成结果表.换句话说,当一个表连接到自身时,该连接称为自联接.
考虑EMPLOYEES表,其中包含员工及其报告管理员.要找到员工的经理姓名需要在EMP表本身上加入.这是自我加入的典型候选人.
SELECT e1.FirstName Manager,e2.FirstName Employee FROM employees e1 JOIN employees e2 ON(e1.employee_id = e2.manager_id ) ORDER BY e2.manager_id DESC;
Non Equijoins
非当相关列不能以等号连接时使用等式连接 - 意味着要连接的表中没有等效行.非等式连接使您可以将范围的最小值存储在记录的一列中和另一列中的最大值.因此,您可以使用不相等的连接来确定列中的最小和最大范围之间是否存在匹配范围.费用可以在结果中退回.与传统的相等连接方法一样,可以在WHERE子句中执行非相等连接.此外,JOIN关键字可以与ON子句一起使用,为连接指定
相关列.
SELECT E.first_name, J.job_hisal, J.job_losal, E.salary FROM employees E JOIN job_sal J ON (E.salary BETWEEN J.job_losal AND J.job_losal);
我们可以使用前面讨论的所有比较参数,如相等和不等运算符,BETWEEN,IS NULL,IS NOT NULL和RELATIONAL.
外部连接
外部联接用于识别一个表中的行与第二个表中的行不匹配的情况,即使这两个表是相关的.
有三种类型的外连接:LEFT,RIGHT和FULL OUTER JOIN.它们都以INNER JOIN开头,然后它们会添加一些已删除的行. LEFT OUTER JOIN将连接条件中从第一个(左)表中删除的所有行相加,并将第二个(右)表中的输出列设置为NULL. RIGHT OUTER JOIN会在连接条件中添加从第二个(右)表中删除的所有行,并将第一个(左)表中的输出列设置为NULL. FULL OUTER JOIN会添加从两个表中删除的所有行.
正确的外部连接
正确的外部联接会添加从第二行中删除的所有行(右)连接条件中的表,第一个(左)表的输出列设置为NULL.请注意以下查询列出了员工及其相应的部门.此外,没有员工被分配到部门30.
SELECT E.first_name, E.salary, D.department_id FROM employees E, departments DWHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;FIRST_NAME SALARY DEPARTMENT_ID---------- ---------- ----------JOHN 6000 10EDWIN 2000 20MILLER 2500 10MARTIN 4000 20 30
左外连接
LEFT OUTER JOIN会在连接条件中添加从第一个(左)表中删除的所有行,并将第二个(右)表中的输出列设置为NULL.通过交换(+)符号的位置,上面演示的查询可用于演示左外连接.
SELECT E.first_name, E.salary, D.department_idFROM employees E, departments DWHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);FIRST_NAME SALARY DEPARTMENT_ID---------- ---------- ----------JOHN 6000 10EDWIN 2000 20MILLER 2500 10MARTIN 4000 20 30
Full Outer Join
FULL OUTER JOIN会添加从两个表中删除的所有行.以下查询显示了员工及其部门的列表.请注意,员工'MAN'到目前为止尚未分配任何部门(它为NULL),而部门30未分配给任何员工.
SELECT nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_idFROM employee e FULL OUTER JOIN department dON e. depARTMENT_ID = d. depARTMENT_ID;FIRST_NAME DEPARTMENT_ID---------- --------------------MAN -JOHN 10EDWIN 20MILLER 10MARTIN 20- 30
笛卡尔积或交叉加入
对于两个实体A和B,A * B称为笛卡尔积.笛卡尔积包含来自每个表的行的所有可能组合.因此,当一个包含10行的表与一个包含20行的表连接时,笛卡尔积为200行(10 * 20 = 200).例如,将employee表连接到8行,将department表连接到3行将生成一个24行(8 * 3 = 24)的笛卡儿乘积表.
交叉连接是指两个表的笛卡尔乘积.它产生两个表的交叉积.上面的查询可以使用CROSS JOIN子句编写.
笛卡尔积产品结果表通常不是很有用.事实上,这样的结果表可能会非常误导.如果对EMPLOYEES和DEPARTMENTS表执行以下查询,结果表意味着每个员工都与每个部门都有关系,我们知道情况并非如此!
SELECT E.first_name,D.DNAME FROM employees E,departments D;
交叉连接可以写成,
SELECT E.first_name,D.DNAME FROM employees E CROSS JOIN departments D;