
请高手帮忙指点下oracle,我在做个学习总结
一 varchar,nvarchar,四个类型都属于变长字符类型, varchar和varchar2的区别在与后者把所有字符都占两字节,前者只对汉字和全角等字符占两字节。
nvarchar和nvarchar2的区别和上面一样, 与上面区别在于是根据Unicode 标准所进行的定义的类型,通常用于支持多国语言类似系统的定义。
1.charchar的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节;char是区分中英文的,中文在char中占两个字节,而英文占一个,所以char(20)你只能存20个字母或10个汉字。
char适用于长度比较固定的,一般不含中文的情况2.varchar\\\/varchar2varchar是长度不固定的,比如说,你定义了varchar(20),当你插入abc,则在数据库中只占3个字节。
varchar同样区分中英文,这点同char。
varchar2基本上等同于varchar,它是oracle自己定义的一个非工业标准varchar,不同在于,varchar2用null代替varchar的空字符串varchar\\\/varchar2适用于长度不固定的,一般不含中文的情况3.nvarchar\\\/nvarchar2nvarchar和nvarchar2是长度不固定的nvarchar不区分中英文,比如说:你定义了nvarchar(20),你可以存入20个英文字母\\\/汉字或中英文组合,这个20定义的是字符数而不是字节数nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占两个字节nvarchar\\\/nvarchar2适用于存放中文char [ ( n ) ]固定长度,非 Unicode 字符数据,长度为 n 个字节。
n 的取值范围为 1 至 8,000,存储大小是 n 个字节。
varchar [ ( n | max ) ]可变长度,非 Unicode 字符数据。
n 的取值范围为 1 至 8,000。
max 指示最大存储大小是 2^31-1 个字节。
存储大小是输入数据的实际长度加 2 个字节,用于反映存储的数据的长度。
所输入数据的长度可以为 0 个字符。
* 如果列数据项的大小一致,则使用 char。
* 如果列数据项的大小差异相当大,则使用 varchar。
* 如果列数据项大小相差很大,而且大小可能超过 8,000 字节,请使用 varchar(max)。
如果未在数据定义或变量声明语句中char 或 varchar 数据类型指定 n,则默认长度为 1。
如果在使用 CAST 和 CONVERT 函数时char 或 varchar 数据类型未指定 n,则默认长度为 30。
当执行 CREATE TABLE 或 ALTER TABLE 时,如果 SET ANSI_PADDING 为 OFF,则定义为 NULL 的 char 列将作为 varchar 处理。
另外帮助理解的,只供参考:转自也可参照学习1.NULL值(空值)。
a. char列的NULL值占用存储空间。
b. varcahr列的NULL值不占用存储空间。
c. 插入同样数量的NULL值,varchar列的插入效率明显高出char列。
2.插入数据无论插入数据涉及的列是否建立索引,char的效率都明显低于varchar。
3. 更新数据如果更新的列上未建立索引,则char的效率低于varchar,差异不大;建立索引的话,效率较高。
4. 修改结构a. 无论增加或是删除的列的类型是char还是varchar,操作都能较快的完成,而且效率上没有什么差异。
b. 对于增加列的宽度而言,char与varchar有非常明显的效率差异,修改varcahr列基本上不花费时间,而修改char列需要花费很长的时间。
5.数据检索无论是否通过索引,varchar类型的数据检索略优于char的扫描。
选择char还是选择varchar的建议1.适宜于char的情况:a. 列中的各行数据长度基本一致,长度变化不超过50字节;b. 数据变更频繁,数据检索的需求较少。
c. 列的长度不会变化,修改char类型列的宽度的代价比较大。
d. 列中不会出现大量的NULL值。
e. 列上不需要建立过多的索引,过多的索引对char列的数据变更影响较大。
2.适宜于varchar的情况;a. 列中的各行数据的长度差异比较大。
b. 列中数据的更新非常少,但查询非常频繁。
c. 列中经常没有数据,为NULL值或为空值nchar [ ( n ) ]n 个字符的固定长度的 Unicode 字符数据。
n 值必须在 1 到 4,000 之间(含)。
存储大小为两倍 n 字节。
nvarchar [ ( n | max ) ]可变长度 Unicode 字符数据。
n 值在 1 到 4,000 之间(含)。
max 指示最大存储大小为 2^31-1 字节。
存储大小是所输入字符个数的两倍 + 2 个字节。
所输入数据的长度可以为 0 个字符。
注释如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。
如果没有使用 CAST 函数指定 n,则默认长度为 30。
如果列数据项的大小可能相同,请使用 nchar。
如果列数据项的大小可能差异很大,请使用 nvarchar。
sysname 是系统提供的用户定义数据类型,除了不可为空值外,在功能上与 nvarchar(128) 相同。
sysname 用于引用数据库对象名。
为使用 nchar 或 nvarchar 的对象分配的是默认的数据库排序规则,但可使用 COLLATE 子句分配特定的排序规则。
SET ANSI_PADDING ON 永远适用于 nchar 和 nvarchar。
SET ANSI_PADDING OFF 不适用于 nchar 或 nvarchar 数据类型。
在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别1.CHAR(size)和VARCHAR(size)的区别CHAR为定长的字段,最大长度为2K字节;VARCHAR为可变长的字段,最大长度为4K字节;2.CHAR(size)和NCHAR(size)的区别CHAR如果存放字母数字占1个字节,存放GBK编码的汉字存放2个字节,存放UTF-8编码的汉字占用3个字节;NCHAR根据所选字符集来定义存放字符的占用字节数,一般都为2个字节存放一个字符(不管字符或者汉字)3.VARCHAR(size)和VARCHAR2(size)的区别在现在的版本中,两者是没有区别的;最大长度为4K字节;推荐使用VARCHAR2;4.VARCHAR2(size)和NVARCHAR2(size)的区别最大长度为4K字节,区别同CHAR与NCHAR的区别;(如果数据库字符集长度是2,则NVARCHAR2最大为2K)5.共同特性当执行insert的时候,插入的值为'',则转变成null,即insert ... values('') <=> insert ... values(null)搜索的条件须用where xx is null6.例子比如有一个性别字段,里面存放“男,女”的其中一个值,两种常用选择CHAR(2) 和 NCHAR(1)Oracle中的TIMESTAMP类型SQL> create table test_time (col_time timestamp);表已创建。
SQL> insert into test_time values (to_timestamp('0001-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff'));已创建 1 行。
SQL> insert into test_time values (to_timestamp('2000-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff'));已创建 1 行。
SQL> insert into test_time values (to_timestamp('9999-12-31 23:59:59.999999', 'syyyy-mm-dd hh24:mi:ss.ff'));已创建 1 行。
SQL> insert into test_time values (to_timestamp('-0001-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff'));已创建 1 行。
SQL> insert into test_time values (to_timestamp('-0100-3-4 13:2:3.234015', 'syyyy-mm-dd hh24:mi:ss.ff'));已创建 1 行。
SQL> insert into test_time values (systimestamp);已创建 1 行。
SQL> insert into test_time values (to_timestamp('2000-1-1 0:0:0.123456789', 'syyyy-mm-dd hh24:mi:ss.ff9'));已创建 1 行。
SQL> commit;提交完成。
SQL> select to_char(col_time, 'syyyy-mm-dd hh24:mi:ss.ff9') time, dump(col_time) dump_time2 from test_time;TIME DUMP_TIME------------------------------ ----------------------------------------------------0001-01-01 00:00:00.000000000 Typ=180 Len=7: 100,101,1,1,1,1,12000-01-01 00:00:00.000000000 Typ=180 Len=7: 120,100,1,1,1,1,19999-12-31 23:59:59.999999000 Typ=180 Len=11: 199,199,12,31,24,60,60,59,154,198,24-0001-01-01 00:00:00.000000000 Typ=180 Len=7: 100,99,1,1,1,1,1-0100-03-04 13:02:03.234015000 Typ=180 Len=11: 99,100,3,4,14,3,4,13,242,201,242004-12-15 16:14:52.738000000 Typ=180 Len=11: 120,104,12,15,17,15,53,43,252,252,1282000-01-01 00:00:00.123457000 Typ=180 Len=11: 120,100,1,1,1,1,1,7,91,205,232已选择7行。
与DATE类型对比可以发现,对于TIMESTAMP类型,如果不包含微秒信息或者微秒值为0,那么存储结果和DATE完全相同。
当微秒值为0时,Oracle为了节省空间,不会保存微秒信息。
如果毫秒值不为0,Oracle把微秒值当作一个9位数的数字来保存。
比如999999000,保存为59,154,198,24。
234015000保存为13,242,201,24。
SQL> select to_char(999999000, 'xxxxxxxxxx') from dual;TO_CHAR(999-----------3b9ac618SQL> select to_number('3b', 'xxx') one, to_number('9a', 'xxx') two,2 to_number('c6', 'xxx') three, to_number('18', 'xxx') four from dual;ONE TWO THREE FOUR---------- ---------- ---------- ----------59 154 198 24SQL> select to_char(234015000, 'xxxxxxxx') from dual;TO_CHAR(2---------df2c918SQL> select to_number('d', 'xxx') one, to_number('f2', 'xxx') two,2 to_number('c9', 'xxx') three, to_number('18', 'xxx') four from dual;ONE TWO THREE FOUR---------- ---------- ---------- ----------13 242 201 24另外,注意一点,不指定精度的情况下,TIMESTAMP默认取6位。
长度超过6位,会四舍五入到6位。
如果希望保存9位的TIMESTAMP,必须明确指定精度。
SQL> alter table test_time modify (col_time timestamp(9));表已更改。
SQL> insert into test_time values (to_timestamp('2000-1-1 0:0:0.123456789', 'syyyy-mm-dd hh24:mi:ss.ff9'));已创建 1 行。
SQL> select to_char(col_time, 'syyyy-mm-dd hh24:mi:ss.ff9') time, dump(col_time) dump_time2 from test_time;TIME DUMP_TIME------------------------------ ---------------------------------------------------0001-01-01 00:00:00.000000000 Typ=180 Len=7: 100,101,1,1,1,1,12000-01-01 00:00:00.000000000 Typ=180 Len=7: 120,100,1,1,1,1,19999-12-31 23:59:59.999999000 Typ=180 Len=11: 199,199,12,31,24,60,60,59,154,198,24-0001-01-01 00:00:00.000000000 Typ=180 Len=7: 100,99,1,1,1,1,1-0100-03-04 13:02:03.234015000 Typ=180 Len=11: 99,100,3,4,14,3,4,13,242,201,242004-12-15 16:14:52.738000000 Typ=180 Len=11: 120,104,12,15,17,15,53,43,252,252,1282000-01-01 00:00:00.123457000 Typ=180 Len=11: 120,100,1,1,1,1,1,7,91,205,2322000-01-01 00:00:00.123456789 Typ=180 Len=11: 120,100,1,1,1,1,1,7,91,205,21已选择8行。
ORACLE临时表总结
临时表概念 临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别。
它只能存储在临时表空间,而非用户的表空间。
ORACLE临时表是会话或事务级别的,只对当前会话或事务可见。
每个会话只能查看和修改自己的数据。
临时表语法 clip_image002 临时表分类 ORACLE临时表有两种类型:会话级的临时表和事务级的临时表。
1)ON COMMIT DELETE ROWS 它是临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有效,当事物提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构 以及元数据还存储在用户的数据字典中。
如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
2)ON COMMIT PRESERVE ROWS 它表示临时表的内容可以跨事物而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。
但是临时表的结构以及元数据还存储在用户的数据字典中。
如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
1:会话级的临时表的数据和你当前会话有关系,当前SESSION不退出的情况下,临时表中的数据就还存在,临时表的数据只有当你退出当前SESSION的时候才被截断(TRUNCATE TABLE),如下所示: 会话级别的临时表创建: 复制代码 CREATE GLOBAL TEMPORARY TABLE TMP_TEST ( ID NUMBER , NAME VARCHAR2(32) ) ON COMMIT PRESERVE ROWS; 或 CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT PRESERVE ROWS AS SELECT * FROM TEST; 操作示例: SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST ( ID NUMBER , NAME VARCHAR2(32) ) ON COMMIT PRESERVE ROWS; Table created SQL> INSERT INTO TMP_TEST SELECT 1, 'kerry' FROM DUAL; 1 row inserted SQL> COMMIT; Commit complete SQL> SELECT * FROM TMP_TEST; ID NAME ---------- ---------------- 1 kerry SQL> INSERT INTO TMP_TEST SELECT 2, 'rouce' FROM DUAL; 1 row inserted SQL> ROLLBACK; Rollback complete SQL> SELECT * FROM TMP_TEST; ID NAME ---------- ---------------------- 1 kerry SQL> 复制代码 2:事务级的临时表(默认),这种类型的临时表与事务有关,当进行事务提交或者事务回滚的时候,临时表的数据将自行截断,即当COMMIT或ROLLBACK时,数据就会被TRUNCATE掉,其它的特性和会话级的临时表一致。
事务级临时表的创建方法: 复制代码 CREATE GLOBAL TEMPORARY TABLE TMP_TEST ( ID NUMBER , NAME VARCHAR2(32) ) ON COMMIT DELETE ROWS; 或 CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST; SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST ( ID NUMBER , NAME VARCHAR2(32) ) ON COMMIT DELETE ROWS; Table created SQL> INSERT INTO TMP_TEST SELECT 1, 'kerry' FROM DUAL; 1 row inserted SQL> SELECT * FROM TMP_TEST; ID NAME ---------- ---------------------- 1 kerry SQL> COMMIT; Commit complete SQL> SELECT * FROM TMP_TEST; ID NAME ---------- ------------------------ SQL> 复制代码 3:关于临时表只对当前会话或事务可见。
每个会话只能查看和修改自己的数据。
用DM用户登录数据库,打开SESSION 1后,创建临时表TMP_TEST 复制代码 CREATE GLOBAL TEMPORARY TABLE TMP_TEST ( ID NUMBER , NAME VARCHAR2(32) ) ON COMMIT DELETE ROWS; 或 CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST; SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST ( ID NUMBER , NAME VARCHAR2(32) ) ON COMMIT DELETE ROWS; Table created SQL> INSERT INTO TMP_TEST SELECT 1, 'kerry' FROM DUAL; 1 row inserted SQL> SELECT * FROM TMP_TEST; ID NAME ---------- --------------------- 1 kerry SQL> COMMIT; Commit complete SQL> SELECT * FROM TMP_TEST; ID NAME ---------- ----------------------- SQL> 复制代码 用sys用户登录数据库,打开SESSION 2 SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TMP_TEST' --可以查到临时表数据 SELECT * FROM DM.TMP_TEST; --查不到数据,即使TMP_TEST临时表存在数据。
临时表与永久表区别 复制代码 SQL> SELECT TABLE_NAME, TABLESPACE_NAME,LOGGING, TEMPORARY, DURATION, MONITORING FROM DBA_TABLES WHERE TABLE_NAME IN ('TMP_TEST', 'TEST') ; TABLE_NAME TABLESPACE_NAME LOGGING TEMPORARY DURATION MONITORING ------------- -------------- ------- --------- ----------- --------- TEST TBS_EDS_DATA YES N YES TMP_TEST NO Y SYS$SESSION NO 复制代码 如上所示,临时表是存储在临时表空间里面的,但是上面脚本可以看出,临时表在数据字典中没有指定其表空间,临时表是NOLOGGING,DURATION为SYS$SESSION 临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少其实在应用中,往往会创建一个NOLOGGING的永久表(中间表)来保存中间数据,从而代替临时表,至于这这两者有啥优劣,真是很难说清道明(欢迎大家探讨)。
临时表用途 什么时候使用临时表
用临时表和用中间表有啥区别呢
我觉得是在需要的时候应用,下面是David Dai关于临时表的一个应用说明,我觉得非常形象的说明了临时表的应用场景:对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。
也就是说,必须在整个SESSION期间保存购物车中的信息。
同时,还存在有些消费者,往往最终结账时放弃购买商品。
如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。
因此,对于这种案例,就可以采用创建临时表(ON COMMIT PRESERVE ROWS)的方法来解决。
数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML操作的压力。
1:当处理某一批临时数据,需要多次DML操作时(插入、更新等),建议使用临时表。
2:当某些表在查询里面,需要多次用来做连接时。
(为了获取目标数据需要关联A、B、C, 同时为了获取另外一个目标数据,需要关联D、B、C....) 关于临时表和中间表(NOLOGGING,保存中间数据,使用完后删除)那个更适合用来存储中间数据,我个人更倾向于使用临时表,而不建议使用中间表。
注意事项 1 ) 不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。
这点网上很多资料都这么说,我没有追查到底是那个版本不支持lob对象,至少在ORACLE 10g这个版本中,临时表是支持lob对象的. SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST 2 ( 3 ID NUMBER , 4 NAME CLOB 5 ) ON COMMIT PRESERVE ROWS; Table created SQL> SQL> INSERT INTO TMP_TEST 2 SELECT 1, 'ADF' FROM DUAL; 1 row inserted SQL> SELECT * FROM V$VERSION; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL\\\/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production 2 ) 不支持主外键关系 3 )临时表不能永久的保存数据。
4 )临时表的数据不会备份,恢复,对其的修改也不会有任何日志信息 5 )临时表不会有DML 锁 DML locks are not acquired on the data of the temporary tables. The LOCK statement has no effect on a temporary table, because each session has its own private data. 6 )尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。
请见官方文档: DML statements on temporary tables do not generate redo logs for the data changes.However, undo logs for the data and redo logs for the undo logs are generated. Data from the temporary table is automatically dropped in the case of session termination,either when the user logs off or when the session terminates abnormally such as during a session or instance failure. 7 ) 临时表可以创建临时的索引、视图、触发器。
8 ) 如果要DROP会话级别临时表,并且其中包含数据时,必须先截断其中的数据。
否则会报错。
SQL> DROP TABLE TMP_TEST PURGE; DROP TABLE TMP_TEST PURGE ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引 SQL> TRUNCATE TABLE TMP_TEST; Table truncated SQL> DROP TABLE TMP_TEST PURGE; Table dropped
oracle查询题实验总结怎么写
强调分析、检查与管理的重要。
没有范文。
以下供参考,主要写一下主要的工作内容,如何努力工作,取得的成绩,最后提出一些合理化的建议或者新的努力方向。
。
。
。
。
。
。
工作总结就是让上级知道你有什么贡献,体现你的工作价值所在。
所以应该写好几点:1、你对岗位和工作上的认识2、具体你做了什么事3、你如何用心工作,哪些事情是你动脑子去解决的。
就算没什么,也要写一些有难度的问题,你如何通过努力解决了4、以后工作中你还需提高哪些能力或充实哪些知识5、上级喜欢主动工作的人。
你分内的事情都要有所准备,即事前准备工作以下供你参考:总结,就是把一个时间段的情况进行一次全面系统的总评价、总分析,分析成绩、不足、经验等。
总结是应用写作的一种,是对已经做过的工作进行理性的思考。
总结的基本要求1.总结必须有情况的概述和叙述,有的比较简单,有的比较详细。
2.成绩和缺点。
这是总结的主要内容。
总结的目的就是要肯定成绩,找出缺点。
成绩有哪些,有多大,表现在哪些方面,是怎样取得的;缺点有多少,表现在哪些方面,是怎样产生的,都应写清楚。
3.经验和教训。
为了便于今后工作,必须对以前的工作经验和教训进行分析、研究、概括,并形成理论知识。
总结的注意事项: 1.一定要实事求是,成绩基本不夸大,缺点基本不缩小。
这是分析、得出教训的基础。
2.条理要清楚。
语句通顺,容易理解。
3.要详略适宜。
有重要的,有次要的,写作时要突出重点。
总结中的问题要有主次、详略之分。
总结的基本格式: 1、标题 2、正文 开头:概述情况,总体评价;提纲挈领,总括全文。
主体:分析成绩缺憾,总结经验教训。
结尾:分析问题,明确方向。
3、落款 署名与日期。
有oracle的常用语句总结吗
不错的网站:



