语法说明:
tablename:在数据库中需要创建的表的表名称,在同一个数据库中的表名称是不能重复的;
column_name:创建的表的列名称,列名称在一个表中也是不能重复的;
datatype:创建的表的列中存放数据的数据类型;
null,not null:允许该列为空或者不为空,默认情况下是不为空;
constraint:为表中的列设置约束,如主键约束,外键约束,唯一约束等。
扩展资料
逻辑结构
它由至少一个表空间和数据库模式对象组成。这里,模式是对象的集合,而模式对象是直接引用数据库数据的逻辑结构。模式对象包括这样一些结构:表、视图、序列、存储过程、同义词、索引、簇和数据库链等。逻辑存储结构包括表空间、段和范围,用于描述怎样使用数据库的物理空间。
总之,逻辑结构由逻辑存储结构(表空间,段,范围,块)和逻辑数据结构(表、视图、序列、存储过程、同义词、索引、簇和数据库链等)组成,而其中的模式对象(逻辑数据结构)和关系形成了数据库的关系设计。
段(Segment):是表空间中一个指定类型的逻辑存储结构,它由一个或多个范围组成,段将占用并增长存储空间。
其中包括:
数据段:用来存放表数据;
索引段:用来存放表索引;
临时段:用来存放中间结果;
回滚段:用于出现异常时,恢复事务。
范围(Extent):是数据库存储空间分配的逻辑单位,一个范围由许多连续的数据块组成,范围是由段依次分配的,分配的第一个范围称为初始范围,以后分配的范围称为增量范围。
数据块(Block):
是数据库进行IO *** 作的最小单位,它与 *** 作系统的块不是一个概念。oracle数据库不是以 *** 作系统的块为单位来请求数据,而是以多个Oracle数据库块为单位。
参考资料来源:百度百科-Oracle数据库
你说的是关联更新,不多说,上示例:
update 表A a set auserName=(select buserName from 表B b where buserID=auserID where rownum=1) where existe (select 1 from 表B c where cuserID=auserID )
语句就是如此,作用是根据表B的用户名跟新表A的用户名,管理按条件是 两个表的用户ID相同,根据你的需求换下表名和字段名就可以了。
在 v_time 已经定义的前提下:
A 是正确的
B 是SQLSERVER的写法,ORACLE不支持没用FROM的SELECT。
C 使用了SET应该是SQLSERVER的写法,但是后面又有冒号,是ORACLE的写法,所以ORACLE 也不支持
D 给变量赋值的话 需要用冒号(:)
对于Oracle中没有 if exists() 的语法,目前有许多种解决方法,这里先分析常用的三种,推荐使用最后一种
第一种是最常用的,判断count()的值是否为零,如下
declare
v_cnt number;
begin
select count() into v_cnt from T_VIP where col=1;
if v_cnt = 0 then
dbms_outputput_line('无记录');
end if;
end;
首先这种写法让人感觉很奇怪,明明只需要知道表里有没有记录,却去统计了全表的记录数。
这种方式对于小表而言可以接受,一旦表记录很多的时候,性能问题就非常严重
因此有人就作了些修改,改成 select count() into v_cnt from T_VIP where col=1 and rownum=1
看起来似乎解决了性能问题,但是分析执行计划可以知道,实际上是一样的,不推荐使用。
第二种是所谓进攻式编程,不作预先判断,而是直接默认通过判断,然后使用 exception 来捕获异常
比如我这里不判断表中是否有满足条件的记录,默认它有,如果没有就在异常中进行处理
declare
v_1 number;
begin
select vip_level into v_1 from T_VIP where 1=0;
exception
when no_data_found then
dbms_outputput_line('无记录');
end;
这种方式从性能上讲比第一种要好得多
不过首先它没办法适应所有的情况,如第一段代码它就没办法改造
其次这种代码看起来让人觉得好像是发生了异常,而不是正常运行,从而造成混乱,不推荐使用。
第三种是利用 Oracle 原有的 Exists 语法,如下
declare
v_cnt number;
begin
select count()
into v_cnt
from dual
where exists (select from t_vip where col=1);
if v_cnt = 0 then
dbms_outputput_line('无记录');
end if;
end;
通过在语句的外面套上一层dual,来使用oracle原有的exists语法
虽然和第一种看起来类似,但分析执行计划可以知道,性能比以上两种都要好得多,与MSSQL的 if exists 最接近,推荐使用。
可以把判断封装成一个函数以方便使用,代码如下
CREATE OR REPLACE FUNCTION EXISTS2 (IN_SQL IN VARCHAR2)
RETURN NUMBER
IS
/
使用示例
begin
if EXISTS2('select from dual where 1=1')=1 then
dbms_outputput_line('有记录');
else
dbms_outputput_line('无记录');
end if;
end;
/
V_SQL VARCHAR2(4000);
V_CNT NUMBER(1);
BEGIN
V_SQL := 'SELECT COUNT() FROM DUAL WHERE EXISTS (' || IN_SQL || ')';
EXECUTE IMMEDIATE V_SQL INTO V_CNT;
RETURN(V_CNT);
END;
-
对于常用的insert判断还有更简单的写法,比如以下代码
if not exists(select from table1 where id=1)
insert into table1 values(1,'a');
可以改写成
insert
when (not exists(select from table1 where id=1)) then
into table1
select 1 as id, 'a' as data from dual;
-
再比如以下的代码
if not exists(select from table1 where id=2)
insert into table1 values(2,'b')
else
update table1 set data='b' where id=2;
可以改写成
merge into table1 his
using
(
select 2 as id, 'b' as data from dual
) src
on (hisid=srcid)
when matched then
update set hisdata=srcdata where id=srcid
when not matched then
insert values(srcid,srcdata);
-
这里附带说下,有人喜欢把count()写成count(列名),不推荐后一种,因为列名是需要额外的 *** 作,去查询系统表来定位列信息
另外count(1)和count()没有差别,推荐使用count()直观明了
一 ROWID的概念
存储了row在数据文件中的具 置 位编码的数据 A Z a z + 和 /
row在数据块中的存储方式
SELECT ROWID last_name FROM hr employees WHERE department_id = ;
比如 OOOOOOFFFBBBBBBRRR
OOOOOO data object number 对应dba_objects data_object_id
FFF file# 对应v$datafile file#
BBBBBB block#
RRR row#
Dbms_rowid包
SELECT dbms_rowid rowid_block_number( AAAGFqAABAAAIWEAAA ) from dual;
具体到特定的物理文件
二 索引的概念
类似书的目录结构
Oracle 的 索引 对象 与表关联的可选对象 提高SQL查询语句的速度
索引直接指向包含所查询值的行的位置 减少磁盘I/O
与所索引的表是相互独立的物理结构
Oracle 自动使用并维护索引 插入 删除 更新表后 自动更新索引
语法 CREATE INDEX index ON table (column[ column] );
B tree结构(非bitmap)
[一]了解索引的工作原理
表 emp
目标 查询Frank的工资salary
建立索引 create index emp_name_idx on emp(name);
[试验]测试索引的作用
运行/rdbms/admin/utlxplan 脚本
建立测试表
create table t as select from dba_objects;
insert into t select from t;
create table indextable
as select rownum id owner object_name subobject_name
object_id data_object_id object_type created
from t;
set autotrace trace explain
set timing on
分析表 可以得到cost
查询 object_name= DBA_INDEXES
在object_name列上建立索引
再查询
[思考]索引的代价
插入 更新
三 唯一索引
何时创建 当某列任意两行的值都不相同
当建立Primary Key(主键)或者Unique constraint(唯一约束)时 唯一索引将被自动建立
语法 CREATE UNIQUE INDEX index ON table (column);
演示
四 组合索引
何时创建 当两个或多个列经常一起出现在where条件中时 则在这些列上同时创建组合索引
组合索引中列的顺序是任意的 也无需相邻 但是建议将最频繁访问的列放在列表的最前面
演示(组合列 单独列)
五 位图索引
何时创建
列中有非常多的重复的值时候 例如某列保存了 性别 信息
Where 条件中包含了很多OR *** 作符
较少的update *** 作 因为要相应的跟新所有的bitmap
结构 位图索引使用位图作为键值 对于表中的每一数据行位图包含了TRUE( ) FALSE( ) 或NULL值
优点 位图以一种压缩格式存放 因此占用的磁盘空间比标准索引要小得多
语法 CREATE BITMAP INDEX index ON table (column[ column] );
掩饰
create table bitmaptable as select from indextable where owner in( SYS PUBLIC );
分析 查找 建立索引 查找
六 基于函数的索引
何时创建 在WHERE条件语句中包含函数或者表达式时
函数包括 算数表达式 PL/SQL函数 程序包函数 SQL函数 用户自定义函数
语法 CREATE INDEX index ON table (FUNCTION(column));
演示
必须要分析表 并且query_rewrite_enabled=TRUE
或者使用提示/+ INDEX(ic_index)/
七 反向键索引
目的 比如索引值是一个自动增长的列
多个用户对集中在少数块上的索引行进行修改 容易引起资源的争用 比如对数据块的等待 此时建立反向索引
性能问题
语法
重建为标准索引 反之不行
八 键压缩索引
比如表landscp的数据如下
site feature job
Britten Park Rose Bed Prune
Britten Park Rose Bed Mulch
Britten Park Rose Bed Spray
Britten Park Shrub Bed Mulch
Britten Park Shrub Bed Weed
Britten Park Shrub Bed Hoe
……
查询时 以上 列均在where条件中同时出现 所以建立基于以上 列的组合索引 但是发现重复值很多 所以考虑压缩特性
Create index zip_idx
on landscp(site feature job)
press ;
将索引项分成前缀(prefix)和后缀(postfix)两部分 前两项被放置到前缀部分
Prefix : Britten Park Rose Bed
Prefix : Britten Park Shrub Bed
实际所以的结构为
Prune
Mulch
Spray
Mulch
Weed
Hoe
特点 组合索引的前缀部分具有非选择性时 考虑使用压缩 减少I/O 增加性能
九 索引组织表(IOT)
将表中的数据按照索引的结构存储在索引中 提高查询速度
牺牲插入更新的性能 换取查询性能 通常用于数据仓库 提供大量的查询 极少的插入修改工作
必须指定主键 插入数据时 会根据主键列进行B树索引排序 写入磁盘
十 分区索引
簇:
A cluster is a group of tables that share the same data blocks because they share mon columns and are often used together
lishixinzhi/Article/program/Oracle/201311/17769
t3annexName之前少了分隔符,。
良好的编码风格可以帮助你避免此类问题,也利于快速debug。
12345678910111213SELECT count(1) FROM ( SELECT tnewId ,ttitle ,tbody ,t2type ,tpublisher t3annexName FROM LYTEST2 t LEFT JOIN LYTEST22 t2 ON ttype=t2typeId LEFT JOIN LYTEST2ANNEX t3 ON tannex=t3annexId order by tnewId )
以上就是关于oracle建表语句例子有哪些全部的内容,包括:oracle建表语句例子有哪些、oracle数据库。 一张表的一个列update到另外一张表的一个列,语法怎么写,麻烦写清楚点,带上解释谢谢、以下数据库是Oracle语法的是:()等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)