oracle学习之毁天灭地

xiaoxiao2021-02-28  26

Oracle学习记录

先把抱怨牢骚放在前头,满腹苦水,无以言表,谨以此概括->毁天灭地 所有数据库字段需要大写(是过是用sqlplus等命令行操作,sql中即使是小写的字段名,也不影响,在plsql中会看到所有表名以及字段都是大写的,但是如果是通过navicat连接上oracle新建表,并且在navicat中创建的表字段以及表名都是小写,那么在navicat中对数据库新建查询时,需要注意,数据库、表名需要加上双引号,否则是会提示无相应表或者视图;倘若是字段名都是大写的,那么操作时,字段名是不需要加上双引号的,这点事比较坑的) 敲重点,千万不能用命令行建数据库 千万不能用命令行建数据库!!! 千万不能用命令行建数据库!!


否则,你的青春就会被耽误



Oracle学习记录 基本概念:1. 数据库2. 数据库实例3. 表空间4. 游标5. 存储过程6. 函数7. 视图(个人理解为:天窗或者是中间表)8.序列9.最重要的一件事!!

基本概念:

1. 数据库

2. 数据库实例

一个进程,将数据库从磁盘加载到内存中,通过实例可以操控数据库表

3. 表空间

存放数据表的空间,可以指定该表空间存放的位置,比如e:/mytablesspace/ 是一个文件, 与其他数据库(SQL SERVER ,MYSQL)不同,Oracle数据库的下一层逻辑结构并非数据表,而是表空间,每个数据表都属于唯一的表空间 对操作频繁的数据放到高速磁盘上的表空间中,提高性能

不同文件放在不同的表空间,某个物理文件的损坏,不会影响其他的表空间 日志可以放到其他磁盘的表空间中,以免数据库数据丢失而不能恢复 查看表空间: select user_id,username,default_tablespace from dba_users

4. 游标

一个变量,一个指针,可以单向移动,指向数据表中的某一行,通过fetch into取出该行的字段数据 简单示例: ``` sql DECLARE CURSOR cur --声明游标变量为 cur IS SELECT MAIL, PHONE FROM "tb_user" ; --该游标是在选取tb-user标的MAIL,PHONE字段 curRow cur % rowtype ;--声明变量类型是游标那一行的类型(有点像是map的意思map<String,Object) 后面可以通过 curRow.MAIL来取得该行的MAIL字段的值

BEGIN OPEN cur;–打开游标 FOR curRow IN cur loop–循环游标 FETCH cur INTO curRow ; –将游标指向的那一行的数据喂到变量curRow中 exit WHEN cur % notfound ; –当游标找不到数据时,退出循环 dbms_output.put_line (curRow.MAIL || ‘-’ || curRow.PHONE) ;–输出打印curRow中的值,反正我是没打印出来,或许可以这样 将取到的值insert到一张表中去 CLOSE cur ;–关闭游标 END loop ; END ; “` 更多游标示例

5. 存储过程

暂时空着吧,没写过

6. 函数

自定义函数,可以有很简单的例子, 比如,获取当前日期: CREATE OR REPLACE FUNCTION fun_getCurDate RETURN VARCHAR2 IS BEGIN RETURN TO_CHAR (SYSDATE, 'yyyy-mm-dd') ; END ; SELECT fun_getCurDate () FROM dual ; BEGIN dbms_output.put_line (fun_getCurDate) ; END --带返回值的 --根据姓名获取工资 CREATE OR REPLACE FUNCTION fun_getSal (NAME VARCHAR2) RETURN NUMBER AS v_sal emp.sal % TYPE ; BEGIN SELECT sal INTO v_sal FROM emp WHERE UPPER (ename) = UPPER (NAME) ; RETURN v_sal ; END ; SELECT fun_getSal (NAME => 'libing') salary FROM dual

更多示例

7. 视图(个人理解为:天窗或者是中间表)

那就很简单方便了,视图是将需要的数据提取到某个“天窗”,透过这个天窗,只能看到天窗里有的数据,

视图(天窗这是我自己想出的名词)也就是一个查询的中间表(该结构存放在数据库中)而已,只是这是由数据库自动执行(不像写代码去查询数据库表,每次都是对数据库表操作) 对视图的操作相当于是直接对中间表操作,至于中间表生成的那个步骤已经是由数据库默认替你你执行好了,程序代码就只需要书写对视图中显示得到数据进行操作的sql或者hql

1)提供各种数据表现形式, 可以使用各种不同的方式将基表的数据展现在用户面前, 以便符合用户的使用习惯(主要手段: 使用别名);

2)隐藏数据的逻辑复杂性并简化查询语句, 多表查询语句一般是比较复杂的, 而且用户需要了解表之间的关系, 否则容易写错; 如果基于这样的查询语句创建一个视图, 用户就可以直接对这个视图进行”简单查询”而获得结果. 这样就隐藏了数据的复杂性并简化了查询语句.这也是oracle提供各种”数据字典视图”的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义);

3)执行某些必须使用视图的查询. 某些查询必须借助视图的帮助才能完成. 比如, 有些查询需要连接一个分组统计后的表和另一表, 这时就可以先基于分组统计的结果创建一个视图, 然后在查询中连接这个视图和另一个表就可以了;

4)提供某些安全性保证. 视图提供了一种可以控制的方式, 即可以让不同的用户看见不同的列, 而不允许访问那些敏感的列, 这样就可以保证敏感数据不被用户看见;

5)简化用户权限的管理. 可以将视图的权限授予用户, 而不必将基表中某些列的权限授予用户, 这样就简化了用户权限的定义。 6)不变应万变,比如数据库基本表的结构发生改变(表之间的关系,但是标书的内容未发生改变),那么就只需要将视图的生成sql做相应的修改,可以达到不修改或者少修改应用程序的代码的目的 具体例子,可参见我的另一篇博客这里写链接内容

约束 check约束和默认约束 约束字段允许的值或者长度,比如state字段,我只想其满足 是 ‘1’,‘2’,‘3’中的任一个,来表示状态 这是就可以给字段创建约束,约束生效范围是该表的该字段 例如: alter table "tb_order_state"--表 ta_order_state add constraint check_tb_order_state--约束名随意取check_tb_order_state check ("state" IN ('1','2','3','4','5'));--约束state字段只能是1-5之间的字符,如果插入数据不满足约束是不能insert成功的 --再附上几个简单示例 --1,价格大于0 ALTER TABLE "tb_re_shop_item" ADD CONSTRAINT check_tb_shop_item_price_check CHECK ("price" >= 0); --2,订单商品数量大于1 ALTER TABLE "tb_re_order_item" ADD CONSTRAINT check_tb_order_price CHECK ("count" >= 1); --3,密码长度大于6 ALTER TABLE "tb_user" ADD CONSTRAINT check_tb_user_password_len CHECK (LENGTH(PASSWORD) > 6); --4,用户账号不能为空 ALTER TABLE "tb_user" ADD CONSTRAINT check_tb_user_account CHECK (ACCOUNT != NULL);

默认约束,是插入的数据是null是,指定一个默认的值来填充,比如 要求用户名默认是‘萌新用户’

alter table "tb_user" MODIFY (NAME VARCHAR2(20) default '萌新用户') ; --其余示例: 1,商品数量默认为1 ALTER TABLE "tb_re_shop_item" MODIFY (AVILIABLE LONG DEFAULT 1); --2,isDeleted 默认为 '0' ALTER TABLE "tb_re_shop_item" MODIFY ( "is_deleted" VARCHAR2 (20) DEFAULT '0' ); --3,商品介绍 默认是 ‘欢迎选购!’ ALTER TABLE "tb_re_shop_item" MODIFY ( "introduction" VARCHAR2 (255) DEFAULT '欢迎选购!' ); --4,配送价格默认是 1 ALTER TABLE "tb_deliver_price_info" MODIFY ( "deliver_price" NUMBER DEFAULT 1 );

8.序列

数据库的一个对象,一般用来生成自增主键,一个序列可以被一张表使用,也可以被多张表使用(可能会出现id不连续),一般建议是一张表用一个序列,不共同使用用一个序列 序列示例:

create sequence ID_AUTO_INCRE_item minvalue 1--最小值, maxvalue 999999999999999999999999999 start with 1 --初始值 increment by 1--步长 nocache;

使用:

insert into myTable (id,name) values(ID_AUTO_INCRE_item.NEXTVAL,"名字"); --NEXTVAL方法是取下一个值

1) INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。 2) START WITH 定义序列的初始值(即产生的第一个值),默认为1。 3) MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有>最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。 4) MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。 5) CYCLE**和NOCYCLE** 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。 6) CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。 大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 cache x个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数也不能设置太大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入cache x个。这种情况也能会在数据库关闭时也会导致序号不连续。 7) NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用。 8) CURRVAL 中存放序列的当前值,NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效。

更多请参考

9.最重要的一件事!!

学了一周oracle,了解了一些重要的知识,掌握一些骚操作,然后就去卸载oracle了 卸载教程见此卸载很彻底,再也不用考虑重装系统来卸载这回事了!!

转载请注明原文地址: https://www.6miu.com/read-2629253.html

最新回复(0)