insert into newtable(col1) select col1 from
old_table
b.新表不存在前提下,可以用
oracle
可以用Create tabe new
_table_name as select * from old_table
ms sql 可以用 Select *
into new_table from old_table
三 操作符
1.連接操作符
Oracle是
‘||’; Ms sql是‘+’
2. Oracle的比较操作符中不等于除了'<>'之外,还有一个
'!='
3. 算术操作符,都是+-*/;逻辑操作符都是and,not,or(相同點)
4. oracle集合操作符除了union,union all之外还加入intersect,minus
Intersect是仅返回两个查询都有行,minus返回第一个查询有第
二个查询没有的行
四 函數
1.轉換函數
Oracle 中有to_char(),to_date(),to_number()
Ms sql 中有cast,convert
2.系统日期:
Oracle: sysdate
Ms sql:
getdate()
如
Select sysdate from dual
一定要from子句
Select
getdate() 不一定要from子句
3.Decode函数相当if else,或者ms 中的case语句
语法是decode(value,if1,then1,if2,then2....)
如decode(col1,'1','true','0','fase')
4.常规函数
Nvl 语法是NVL(EXP1,EXP2) 表示如果ex1为空则返回ex2
Nvl2 语法是nvl(exp1,exp2,exp3)表示如果ex1为空,则返回ex3,否则返回ex2
Nullif 语法是nullif(ex1,ex2) 如果这两个表达式相等则返回空
coalesce语法是coalesce(ex1,ex2,....exn)返回第一个非空表达式
5.分組函數
Oracle 中的分組函數Rollup,cube
Rollup返回的结果集包含分组行和小计行,cube产生交叉报表
如:
Select a,b,sum(c) from tabname
group by rollup(a,b)
Select a,b,sum(c) from tabname
group by cube(a,b)
Ms sql中的分組函數 compute
和 compute by
Compute子句为行聚集函数生成汇总值,该汇总值做为一个附加的行显示
在结果集中。没有GROUP BY 子句的情况下,也可以使用关键字COMPUTE.
此关键字使用MAX,MIN,SUM,COUNT,AVG等函数生成汇总值,而compute by
则在控制中断时给出该汇总值,compute by
必须包括在order by 子句中。
還有很多函數,諸如日期函數,字符串函數等等,就不一一作比較了。
Oracle中還有很多比較好的分析函數,也不列舉了。
五.Oracle中的数据库对象
同义词
作用:简化SQL语句;隐藏对象的名称和所有者,提供对象的公共访问等。
语法:CREATE PUBLIC SYNONYM
seqname FOR OBJECT
序列
用来生成唯一、边续的整数,它通常用来自动生成主键或唯一值的键。
創建序列: create sequence seqname
[increment by 1] start with 1 maxvalue 10
minvalue 1 cycle cache
访问序列:
Select
seqname.nextval from dual 将返回序列的初始值
Select
seqname.currval from dual 返回序列的当前值
簇(cluster):
簇是共享相同数据块的一组表,因为这些表具有相同的列,并且经常一起使用。
当两个或多个表的存储在物理上十分接近时,可以通过簇来提高使用这些表的
SQL联接语句的性能。簇是存储表的方法
应该先创建簇,然后再创建簇中的表,
六.Oracle中的对象类型
1. 抽象数据类型
此类型是包含一个或多个子类型的数据类型,并且这些数据类型并不局限
于标准的oracle数据类型
如:create
or replace
type t_mm as object(col
number(3),
col2 varchar2(20))/
此时可以在创建表时使用该类型,如下
Create table test (aa varchar2(5),bb t_mm, cc number(10))
插入记录:
Insert
into test values('cccc', t_mm(1,'col'))
类型声明:
用户定义的数据类型也可以声明为 final,not
final,instantiable,
not instantiabe
Not final表示允许类型派生子类型。默认是final
create or replace
type t_mm as object(col
number(3),
col2 varchar2(20)) Not final
not instantiabe表示类型没有构造函数。
2. 可变数组
可变数组有助于在单个行中存储和重复记录的属性。
数据与表中的其它数据是存储在一起的,有限数目的行,不能被索引
创建可变数组的 语法是:
create type array1 as varray(5)
of varchar2(5)
向可变数组中插入记录
Insert into
test1 values ('2ee', array1('1','2','3','4','5')
)
Select *
from test1 结果集如下
2ee
'1','2','3','4','5'
Select col2
from test1 结果集如下
'1','2','3','4','5'
Select *
from table(select t.col2 from test1 where
col1='2ee'); 结果集
3. 嵌套表
它是包含在表中的表,对每行数据项数目没有限制,一个表在
另一表中是作为一列,主表中的每一行的嵌套表可以包含若干行。
创建嵌套表
先创建一个类型
Create type ord_ty as object(itemcode varchar2(5),qty _ord
number(5),
Qty_held number(5));
创建另一个抽象数据类型,即嵌套表数据类型
Create type ord_nt as table of ord_ty
创建嵌套表
Create table order_mas (orderno varchar2(5),odate date,
vencode varchar2(5), dets ord_nt) nested table dets store as
ord_nt_tab;
向嵌套表中插入数据:
Insert into order_mas values(‘001’,to_date('18-07-08','DD-MM-YY'),
'V009',ord_nt( ord_ty('i001',10,5),ord_ty('i002',34,2));
更新嵌套表的值:
Update table(select e.dets from order_mas e
where e.orderno='001') p
Set value(p)
=ord_ty('i090',8,9) where p.itemcode='i001';
删除嵌套表的值:
Delete from table(select e.dets from order_mas e
where e.orderno='001') p
where p.itemcode='i001';
4. 对象表
在对象表中每一行都是一个行对象,对象表与关系表不同:
对象表中的每一行都有一个OID值,即对象标识符值。该值是在创建行时
分配的。可以使用create table
命令来创建对象表。
在创建对象类型时,Oracle 中是不允许为属性定义约束条件,但是
可以在创建对象表时为对象类型的属性指定约束条件。
Create table vend_master of vend_ty(vencode constraint vc_pk
primary key);
创建对象表与关系表语法不同
表的使用方法不同 插入数据可以使用抽象数据类型的构造函数,如果对象
表所基于抽象数据类型又基于另一抽象数据类型,则必须多个构造函数的嵌
套调用。
Insert into vend_master values (vend_ty());
5. 对象视图
借助对象视图可以将面向对象的结构(如抽象数据类型)应用于现有已经
投入使用的表,而不需重建整个应用程序