oracle学习之毁天灭地

Oracle学习记录

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


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



基本概念:

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做相应的修改,可以达到不修改或者少修改应用程序的代码的目的
具体例子,可参见我的另一篇博客这里写链接内容

  1. 约束
    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了
卸载教程见此卸载很彻底,再也不用考虑重装系统来卸载这回事了!!

猜你喜欢

转载自blog.csdn.net/qq_36922927/article/details/80362765