oracle建表语句例子有哪些

oracle建表语句例子有哪些,第1张

oracle数据库的建表语句,具体语法如下:

语法说明:

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语法的是:()等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9505081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存