1-1 Oracle连接
在一个数据库中的多个表之间一般都存在着某些联系,在一个查询语句中同时涉及到两个或两个以上的表时,这种查询称之为连接查询(也称为多表查询)。在多表之间查询必须处理表与表之间的连接关系
SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2;
在 WHERE 字句中写入连接条件。
在表中有相同列时,在列名之前加上表名前缀。
1-1-1 内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
等值连接, 不等连接, 自然连接。
仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。
等值连接:
在连接条件中使用等于号(=) 运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
连接 n 个表, 至少需要 n-1 个连接条件。 例如:连接三个表,至少需要两个连接条件。
SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id FROM employees, departments WHERE employees.department_id = departments.department_id

表别名的使用:
使用别名可以简化查询。
使用表名前缀可以提高执行效率。
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;
多表连接:
连接 n 个表, 至少需要 n-1 个连接条件。 例如:连接三个表,至少需要两个连接条件。
非等值连接:
在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括 > 、 >= 、 <= 、 < 、 !> 、 !< 和 <>
自然连接:
NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接
在表中查询满足等值条件的数据
如果只是列名相同而数据类型不同,则会产生错误
SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations ;
1-1-2 外连接

使用外连接可以查询不满足连接条件的数据。
外连接的符号是 (+) 或 out join …on 。
SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column(+) = table2.column;
SELECT table1.column, table2.column FROM table1 LEFT OUT JOIN table2 ON (table1.column = table2.column);
外连接与内连接区别
两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外联接。
两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为全外联接。
左外连接:
SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id) ; 或者: SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT JOIN departments d ON (e.department_id = d.department_id) ;

左外连接是以左表为基准,根据左右表对应的列,依次把左表的每一行去匹配右表的某一行,如果右表中不存在匹配的行,右表用null 组成一行和左表匹配
右外连接:
SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id) ;

右外连接是以右表为基准,根据左右表对应的列,依次把右表的每一行去匹配左表的某一行,如果左表中不存在匹配的行,左表用null 组成一行和左表匹配
全外连接:
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) ;

1-2 使用 USING 子句创建连接
在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。
使用 USING 可以在有多个列满足条件时进行选择。
不要给选中的列中加上表名前缀或别名。
NATURAL JOIN 和 USING 子句经常同时使用。
NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。
在表中查询满足等值条件的数据。
如果只是列名相同而数据类型不同,则会产生错误。
SELECT e.employee_id, e.last_name, d.location_id FROM employees e JOIN departments d USING (department_id) ;

1-3 使用 ON 子句创建连接
自然连接中是以具有相同名字的列为连接条件的。
可以使用 ON 子句指定额外的连接条件 。
ON 子句使语句具有更高的易读性。
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id);

1-4 使用ON 子句创建多表连接
SELECT employee_id, city, department_name FROM employees e JOIN departments d ON d.department_id = e.department_id JOIN locations l ON d.location_id = l.location_id;
