关于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标准

时间: 2024-10-06 15:58:01

关于Oracle SQL/82标准和SQL/92标准的相关文章

[Oracle系列整理01]PL/SQL 基本查询与排序

本课重点:    1.写SELECT语句进行数据库查询    2.进行数学运算    3.处理空值    4.使用别名ALIASES    5.连接列    6.在SQL PLUS中编辑缓冲,修改SQL SCRIPTS    7.ORDER BY进行排序输出.    8.使用WHERE 字段. 一.写SQL 命令:      不区分大小写.      SQL 语句用数字分行,在SQL PLUS中被称为缓冲区.      最后以:或 / 结束语句.      也可以用RUN来执行语句 二.例1:

怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优

 怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优 1>.这里简单举个样例来说明DBMS_SQLTUNE 的使用 首先现运行下某个想要调优的sql,然后获取sqlid SQL> select * from v$sqltext where sql_text like 'select * from dual%'; ADDRESS          HASH_VALUE SQL_ID        COMMA

如何使用oracle 的DBMS_SQLTUNE package 来运行 Sql Tuning Advisor 进行sql 自动调优

 如何使用oracle 的DBMS_SQLTUNE package 来运行 Sql Tuning Advisor 进行sql 自动调优 1>.这里简单举个例子来说明DBMS_SQLTUNE 的使用 首先现执行下某个想要调优的sql,然后获取sqlid SQL> select * from v$sqltext where sql_text like 'select * from dual%'; ADDRESS          HASH_VALUE SQL_ID        COMMAND

oracle 学习笔记之PL/SQL程序设计

1.PL/SQL的定义: PL/SQL(Procedure Language/SQL) PLSQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(如分支.循环等),使SQL语言具有过程处理能力. 把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,使得PLSQL面向过程但比过程语言简单.高效.灵活和实用. Plsql(oracle),Transact-sql(SQL server) 2.入门程序-->打印hello world; set serverout

Oracle 性能相关常用脚本(SQL)

在缺乏的可视化工具来监控数据库性能的情形下,常用的脚本就派上用场了,下面提供几个关于Oracle性能相关的脚本供大家参考.以下脚本均在Oracle 10g测试通过,Oracle 11g可能要做相应调整. 1.寻找最多BUFFER_GETS开销的SQL 语句 [sql] view plain copy print? --filename: top_sql_by_buffer_gets.sql --Identify heavy SQL (Get the SQL with heavy BUFFER_G

Oracle数据库之开发PL/SQL子程序和包

Oracle数据库之开发PL/SQL子程序和包 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据库中,以便共享. 过程和函数均存储在数据库中,并通过参数与其调用者交换信息.过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据. 1. 存储过程概念 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中.经过第一次编译后

不安装oracle客户端也可以使用pl/sql developer

通常情况下,用PL/SQL Developer连接Oracle是需要安装Oracle客户端软件的,这也就意味着你的硬盘将被占用大约1G-2G的空间,对于Windows操作系统来说,你还会多出一些开机自启动的服务.当然对于大部分人来说,并不会在自己的机器上应用所创建的数据库,而只是希望通过他的一些配置来连接访问服务器上的数据库. 其实Oracle为我们提供了轻便的工具Oracle Instantclient package,也有人称他为“Oracle即时客户端”.使用此工具,我们就可以在不安装Or

oracle数据库性能影响之Sql parse

1,Sql parse的种类 Sql parse又通常分为硬解析和软解析,当sql第一次执行的时候,会发生硬解析,之后的执行如果在shared pool中能找到就是软解析.因此,为提高数据性能,尽可能的让每次执行的SQL在shared pool找到. 2,SQL在哪些情况下会发送硬解析? 1)统计信息改变  2)Sql中的表上有做ddl操作,包括grant和revoke. 3)执行计划被踢出shared pool 4)开启了trace 5)绑定变量长度变化 6)启用outlin

Oracle学习(十一):PL/SQL

1.知识点:可以对照下面的录屏进行阅读 PL/SQL程序结构 declare 说明部分 (变量说明,光标申明,例外说明 ] begin 语句序列 (DML语句]- exception 例外处理语句 End; / ------------------------------------------------------------------ --第一个PL/SQL程序:HelloWorld set serveroutput on --如果要在屏幕上输出信息,需要将serveroutput开关打