22.Oracle数据库SQL开发之 SQL92语法执行连接

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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值