22.Oracle数据库SQL开发之 SQL92语法执行连接
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/49134207
ORACLE语法的基础是ANSISQL/86标准。在开发Oracle 9i时,实现了ANSI SQL/92标准的连接语法。
1. 使用SQL/92标准语法执行两个表的内连接
使用SQL/86标准的语法来执行一个内连接如下:
SQL>select p.name,pt.name from products p,product_types pt wherep.product_type_id=pt.product_type_id order by p.name;
NAME NAME
------------------------------ ----------
2412: The Return Video
Chemistry Book
Classical Music CD
Creative Yell CD
From Another Planet DVD
Modern Science Book
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
Z Files Video
11 rows selected.
SQL/92引入了INNER JOIN和ON子句来执行内连接,如下
SQL>select p.name,pt.name from products p INNER JOIN product_types pt on p.product_type_id=pt.product_type_id order byp.name;
NAME NAME
------------------------------ ----------
2412: The Return Video
Chemistry Book
Classical Music CD
Creative Yell CD
From Another Planet DVD
Modern Science Book
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
Z Files Video
11 rows selected.
2. 使用USING 简化连接
SQL/92标准可以使用USING子句对连接条件进一步简化,查询满足一下限制才能进行简化
l 查询必须是等连接的
l 等连接中的列必须同名
SQL>select p.name,pt.name from products p inner join product_types pt using(product_type_id);
NAME NAME
------------------------------ ----------
Modern Science Book
Chemistry Book
Z Files Video
Tank War Video
Supernova Video
2412: The Return Video
Space Force 9 DVD
From Another Planet DVD
Classical Music CD
Pop 3 CD
Creative Yell CD
11 rows selected.
在SELECT句中指定该列名,不能使用表名或别名。例如:
SQL>select p.name,pt.name,product_type_id from products p inner join product_typespt using (product_type_id);
NAME NAME PRODUCT_TYPE_ID
------------------------------ -------------------------
Modern Science Book 1
Chemistry Book 1
Z Files Video 2
Tank War Video 2
Supernova Video 2
2412: The Return Video 2
Space Force 9 DVD 3
From Another Planet DVD 3
Classical Music CD 4
Pop 3 CD 4
Creative Yell CD 4
11 rows selected.
如果视图在列前面使用表别名,例如p.product_type_id,就会看到一个错误。
SQL> select p.name,pt.name,p.product_type_id fromproducts p inner join product_types pt using (product_type_id);
select p.name,pt.name,p.product_type_id fromproducts p inner join product_types pt using (product_type_id)
*
ERROR at line 1:
ORA-25154: column part of USING clausecannot have qualifier
在USING子句中也只能单独使用列名。
3. 使用SQL/92执行多于两个表的内连接
SQL>select c.first_name,c.last_name,p.name as product,pt.name as type fromcustomers c,purchases pr,products p,product_types pt
where c.customer_id=pr.customer_id andp.product_id = pr.product_id and p.product_type_id=pt.product_type_id order byp.name;
FIRST_NAME LAST_NAME PRODUCT TYPE
---------- ---------------------------------------- ----------
John Brown Chemistry Book
Cynthia Green Chemistry Book
Steve White Chemistry Book
Gail Black Chemistry Book
John Brown Modern Science Book
Cynthia Green Modern Science Book
Steve White Modern Science Book
Gail Black Modern Science Book
Steve White Supernova Video
9 rows selected.
使用SQL/92对查询进行重写
SQL>select c.first_name,c.last_name,p.name as product,pt.name as type fromcustomers c inner join purchases pr using (customer_id) inner join products pusing (product_id)
inner join product_types pt using(product_type_id) order by p.name;
FIRST_NAME LAST_NAME PRODUCT TYPE
---------- ---------------------------------------- ----------
John Brown Chemistry Book
Cynthia Green Chemistry Book
Steve White Chemistry Book
Gail Black Chemistry Book
John Brown Modern Science Book
Cynthia Green Modern Science Book
Steve White Modern Science Book
Gail Black Modern Science Book
Steve White Supernova Video
9 rows selected.
4. 使用SQL/92执行多列的内连接
如果连接使用了两个表中的多个列,使用再ON子句中使用AND操作符逐一列出这些列。假如有两个表,表名分别为table1和table2,希望使用这两个表中的column1和column2列进行连接。
查询如下:
Select … from table1 inner join table 2 on table1.column1 =table2.column1 and table1.column2 = table2.column2;
可以使用USING子句进一步简化。条件是执行等连接,而且列名相同。
Select … from table1 inner join table2 using ( column1,column2);
5. 使用SQL/92执行外连接
外连接操作符是ORACLE特有的语法,SQL/92使用一个不同的语法来执行外连接,如法如下:
From table {left | right | full } outerjoin table2
分别是左外连接,右外连接,全外连接。全外连接使用table1和table2中所有的行,包括连接列为空值的行。不能使用(+)操作符直接执行全外连接。
5.1 使用SQL/92执行左外连接
先看使用(+)符号来执行左外连接,如下:
SQL> select p.name,pt.name fromproducts p ,product_types pt where p.product_type_id = pt.product_type_id(+)order by p.name;
NAME NAME
----------------------------------------
2412: The Return Video
Chemistry Book
Classical Music CD
Creative Yell CD
From AnotherPlanet DVD
Modern Science Book
My Front Line
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
NAME NAME
----------------------------------------
Z Files Video
12 rowsselected.
使用LEFT OUTER JOIN关键字来进行重写
SQL>select p.name ,pt.name from products p left outer join product_types pt using(product_type_id) order by p.name;
NAME NAME
------------------------------ ----------
2412: The Return Video
Chemistry Book
Classical Music CD
Creative Yell CD
From Another Planet DVD
Modern Science Book
My Front Line
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
NAME NAME
------------------------------ ----------
Z Files Video
12 rows selected.
5.2 使用SQL/92执行右外连接
先用(+)操作符执行右外连接如下:
SQL>select p.name,pt.name from products p,product_types pt wherep.product_type_id(+) =pt.product_type_id order by p.name;
NAME NAME
------------------------------ ----------
2412: The Return Video
Chemistry Book
Classical Music CD
Creative Yell CD
From Another Planet DVD
Modern Science Book
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
Z Files Video
NAME NAME
------------------------------ ----------
Magazine
12 rows selected.
然后使用RIGHT OUTER JOIN关键字进行重写
SQL>select p.name,pt.name from products p right outer join product_types pt using(product_type_id) order by p.name;
NAME NAME
------------------------------ ----------
2412: The Return Video
Chemistry Book
Classical Music CD
Creative Yell CD
From Another Planet DVD
Modern Science Book
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
Z Files Video
NAME NAME
------------------------------ ----------
Magazine
12 rows selected.
5.3 使用SQL/92执行全外连接
全外连接使用连接表中所有的行,包括连接中使用的列为空值的那些行。
例如:
SQL>select p.name,pt.name from products p full outer join product_types pt using(product_type_id) order by p.name;
NAME NAME
------------------------------ ----------
2412: The Return Video
Chemistry Book
Classical Music CD
Creative Yell CD
From Another Planet DVD
Modern Science Book
My Front Line
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
NAME NAME
------------------------------ ----------
Z Files Video
Magazine
13 rows selected.
6. 使用SQL/92执行自连接
使用SQL/86表中对EMPLOYEES表执行一个自连接:
SQL> select w.last_name||' works for'||m.last_name from employees w, employees m where w.manager_id=m.employee_id;
W.LAST_NAME||'WORKSFOR'||M.LAST
-------------------------------
Johnson works for Smith
Jones works for Johnson
Hobbs works for Johnson
使用SQL/92表中语法的INNER JOIN和ON关键字进行重写如下:
SQL>select w.last_name || ' works for ' || m.last_name from employees w inner joinemployees m on w.manager_id= m.employee_id;
W.LAST_NAME||'WORKSFOR'||M.LAST
-------------------------------
Johnson works for Smith
Jones works for Johnson
Hobbs works for Johnson
7. 使用SQL/92执行交叉连接
如果省略了两个表之间的连接条件是如何导致笛卡尔积的。通过使用SQL/92的连接语法,可以避免产生笛卡尔积,因为在对表进行连接时,通常必须提供一个ON或USING子句。
如果的确想使用笛卡尔积,SQL/92标准要求必须在查询中使用CROSSJOIN关键字显式地进行声明。
例如:
SQL>select * from product_types cross join products;