关于Oracle SQL/82标准和SQL/92标准

在ORACLE9i之前,oracle语法基础是SQL/86标准,9i及之后的版本中支持SQL/92标准。
基表信息:products、purchases和product_types

SQL> select * from products;



PRODUCT_ID PRODUCT_TYPE_ID NAME                           DESCRIPTION                                     PRICE

---------- --------------- ------------------------------ -------------------------------------------------- ----------

         1               1 Modern Science                 A description of modern science                     19.95

         2               1 Chemistry                      Introduction to Chemistry                              30

         3               2 Supernova                      A star explodes                                     25.99

         4               2 Tank War                       Action movie about a future war                     13.95

         5               2 Z Files                        Series on mysterious activities                     49.99

         6               2 2412: The Return               Aliens return                                       14.95

         7               3 Space Force 9                  Adventures of heroes                                13.49

         8               3 From Another Planet            Alien from another planet lands on Earth            12.99

         9               4 Classical Music                The best classical music                            10.99

        10               4 Pop 3                          The best popular music                              15.99

        11               4 Creative Yell                  Debut album                                         14.99

        12                 My Front Line                  Their greatest hits                                 13.49



已选择12行。



SQL> select * from product_types;



PRODUCT_TYPE_ID NAME

--------------- ----------

              1 Book

              5 Magazine

              4 CD

              3 DVD

              2 Video

            100 test



已选择6行。



SQL> SELECT * FROM PURCHASES;



PRODUCT_ID CUSTOMER_ID   QUANTITY

---------- ----------- ----------

         1           2          2

         3           3          1

         2           3          1

         1           3          1

         2           2          1



SQL>

1、使用Oracle连接语法(SQL/86版)

SQL> select p.name,pt.name type from products p,product_types pt where p.product_type_id=pt.product_type_id order by p.name;



NAME                           TYPE

------------------------------ ----------

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行。

2、使用SQL/92引入INNER JOIN和ON重写上面的查询

SQL> select p.name,pt.name type from products p inner join  product_types pt on p.product_type_id=pt.product_type_id order by p.name;



NAME                           TYPE

------------------------------ ----------

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行。

3、SQL/92使用using代替on进行简化连接:

 

SQL> select p.name,pt.name type from products p inner join  product_types pt using (product_type_id);



NAME                           TYPE

------------------------------ ----------

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行。



SQL>
------------USING子句不能使用表别名,否则报错:

SQL> select p.name,pt.name type,product_type_id from products p inner join  product_types pt using (p.product_type_id);

select p.name,pt.name type,product_type_id from products p inner join  product_types pt using (p.product_type_id)

                                                                                                *1 行出现错误:

ORA-01748: 此处只允许简单的列名

4、同上,如果希望在查看product_type_id的值,则在SELECT子句中只能指定该列名,不能再在该列名前加表的别名

SQL> select p.name,pt.name type,product_type_id from products p inner join  product_types pt using (product_type_id);



NAME                           TYPE       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行。



SQL> select p.name,pt.name type,pt.product_type_id from products p inner join  product_types pt using (product_type_id);

select p.name,pt.name type,pt.product_type_id from products p inner join  product_types pt using (product_type_id)

                           *1 行出现错误:

ORA-25154: USING 子句的列部分不能有限定词





SQL>

5、使用SQL/92执行多表内连接

SQL/86:

SQL> select c.first_name,c.last_name,p.name as product,pt.name as type from customers c,purchases pr,products p,product_types pt

  2  where c.customer_id=pr.customer_id and p.product_id=pr.product_id and p.product_type_id=pt.product_type_id order by p.name;



FIRST_NAME LAST_NAME  PRODUCT                        TYPE

---------- ---------- ------------------------------ ----------

Cynthis    Green      Chemistry                      Book

Steve      White      Chemistry                      Book

Cynthis    Green      Modern Science                 Book

Steve      White      Modern Science                 Book

Steve      White      Supernova                      Video



SQL/92:

SQL> select c.first_name,c.last_name,p.name as product,pt.name as type from customers c inner join purchases pr using(customer_id)

  2  inner join products p using (product_id) inner join product_types pt using (product_type_id) order by p.name;



FIRST_NAME LAST_NAME  PRODUCT                        TYPE

---------- ---------- ------------------------------ ----------

Cynthis    Green      Chemistry                      Book

Steve      White      Chemistry                      Book

Cynthis    Green      Modern Science                 Book

Steve      White      Modern Science                 Book

Steve      White      Supernova                      Video



SQL>

6、使用SQL/92执行多列内连接
SELECT……
FROM TABLE1 INNER JOIN TABLE2
ON TABLE1.COLUMN1 = TABLE2.COLUMN1
AND TABLE1.COLUMN2=TABLE2.COLUMN2;

------------使用using进一步简化
SELECT ……
FROM TABLE1 INNER JOIN TABLE2
USING (COLUMN1,COLUMN2);

7、Oracle特有语法(+)执行外连接,而SQL/92标准使用left/right/full outer join执行外连接
不能使用(+)执行全外连接

SQL> select p.name,pt.name from products p, product_types pt

  2  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 Another Planet            DVD

Modern Science                 Book

My Front Line

Pop 3                          CD

Space Force 9                  DVD

Supernova                      Video

Tank War                       Video

Z Files                        Video



已选择12行。

7.1--使用SQL/92标准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

Z Files                        Video



已选择12行。

7.2--全外连接(两个表中有空值的行全列出)

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

Z Files                        Video

                               Magazine

                               test



已选择14行。

8、使用SQL/92执行自连接

SQL> select * from employees;



EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME  TITLE                    SALARY

----------- ---------- ---------- ---------- -------------------- ----------

          1            James      Smith      CEO                      800000

          2          1 Ron        Johnson    Sales Manager            600000

          3          2 Fred       Hobbs      Salesperson              150000

          4          2 Susan      Jones      Salesperson              500000



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> select w.last_name || ' works for ' || m.last_name from employees w inner join employees 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

9、使用SQL/92执行自连接
select * from product_types,products; --SQL/82标准
select * from product_types cross join products;--SQL/92标准

你可能感兴趣的:(Oracle SQL)