热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle快速入门同义词序列视图索引

目录一、数据库对象二、同义词synonym三、序列四、视图五、索引六、综合代码1.同义词部分:2.序列:3.视图和索引一、数据库对象1.数据库对象2.同

目录

        一、数据库对象

        二、同义词synonym

        三、序列

        四、视图

        五、索引

        六、综合代码

                1.同义词部分:

                2.序列:

                3.视图和索引




一、数据库对象

        1.数据库对象
        2.同义词
        3.序列
        4.视图
        5.索引

   数据库对象:
          又称模式对象,是逻辑结构的集合。
          最基本的数据库对象就是表。

            数据逻辑结构:指的是存在一种或多种特定关系的数据元素集合。
    通俗点:就是把数据元素形象地进行了有规则排列,但不用考虑在计算机上如何实现。
    再通俗点:就是数据有规则的排列。表不就是有规则的排列吗?

          数据库对象包括:
  同义词、序列、视图、索引、表、函数、包、过程、触发器等。

指针


二、同义词synonym


概念:      

          同义词——现有对象的一个别名。
    (同义司对网管而言是个非常霸气的东西)
    Oracle只有一个数据库,用户的访问是通过表空间分隔开的,一般来说两个用户之间不能相互访问,但现在A用户要B用户分享某个表中的数据,那B的表空间就要给A分配个权限。

            如果只共享表空间中的某个表中的一部分数据,怎么共享?
    ----将某个表共享,但这也向其他用户曝露了表,存在安全问题。因此,我们给要共享的表设置个同义词(别名),将同义词共享给其他用户。

举例:
            同义词就好比我们要给这个对象取别名,也就是我们所称的“外号”,比如张新宇你们叫他“锤子”,“锤子”就是他的外号;如果某天来个IS来找“锤子”,他找得到么?找不到,“锤子”是不是很安全?IS找门卫问这里有个叫“锤子”的没有?门卫当他傻啊,如果说要找张新宇,找不找得到?找得到。


    同义词分类:
            1.私有同义词;--  只有自己使用; 只能在其模式内访问,且不能与当前模式的对象同名。
            2.公有同义词;--  搞个别名给大家使用;公有同义词可被所有的数据库用户访问。

    同义词作用:
            1. 提高安全性
            2. 主要用于资源共享。
                    模式==对象。
        1.私有同义词
          语法:

    Create [or replace]  Synonym  syn_emp  For  scott.emp;--Synonym   同义词--syn_emp   指scott.emp表的同义词(别名)--scott.emp 是模式名(对象名),其中emp是表名。

                如果当前是用scott账户在操作,则可以省略scott.
        2.公有同义词
          语法:

    create public  synonym  syn_emp  for  scott.emp;--syn_emp  同义词名(别名)

注意:
  在创建私有同义词时,发现scott也没有权限创建,要让scott有创建的权限,就需要用管理员权限给scott授权。


          为某个账户授权同义词:

    grant create synonym to scott;

  注意:权限授出后,一定要收回(取消授权),否则会乱套。
          取消授权:

    revoke create synonym from scott;

        以上是授权私有同义词,那么公有的同义词呢?
  公有的同义词不能授权,也就是普通账户不能创建公有同义词,除非是管理员账户。

        3.同义词的操作

                调用:

   select * from syn_emp;--syn_emp 为同义词名(别名)

                删除:

    Drop Synonym  syn_emp;        --删除私有同义词Drop Public Synonym  syn_emp;    --删除公有同义词

                创建或替换(修改):

    create or replace sysnonym syn_emp for scott.emp;

三、序列


概念:

        oracle中没有标识列,就是序列,标识列可以做好多东西,有替代品---序列,比标识列麻烦的多。  序列+触发器
    1. 什么是序列?
            序列是用于生成唯一的、连续的序号 的对象。
            序列有升序和降序。一般都是升序。
        1,2,3,4,5,6,7,8

    2. 序列有什么用?
            能为我们生成一组连续的,永远不重复的一组数字。
            主要用于提供主键值,做分页。

    3. 序列就是我们所学的sql server中的标识列:
            标识种子——从什么数字开始,常用1
            标识增量——每次增加的数


        1.创建序列语法<色&#39;昆死>

    create sequence 序列名称[start with 1]               -- &#xff08;种子&#xff09;从n开始计数[increment by 1]             -- &#xff08;增量&#xff09;每次递增n&#xff0c;负数为递减  <英&#39;克瑞门特>[maxvalue n | nomaxvalue]    --  最大值[minvalue n | nominvalue]    --  最小值&#xff0c;&#xff08;没太多含义&#xff09;[cycle | nocycle]             --  循环/不循环<塞叩>[cache n | nocache];         --  分配并存入到内存中

        案例&#xff1a;    

create sequence seq_110
start with 1
increment by 1
maxvalue 99999
minvalue 1;

        2.使用序列
            通过序列的伪列来访问序列的值。
            nextval——返回序列的下一个值&#xff08;一直往下&#xff0c;永远不回头&#xff0c;取下一个&#xff0c;指针在下一个值上面&#xff09;
            currval——返回序列的当前值&#xff08;取当前的&#xff0c;指针永远在当前值上面&#xff09;

id    1,2,3,6,4,5,
        案例&#xff1a;

    --查下一个&#xff08;显示的值不会回头&#xff0c;没有回头的&#xff0c;有回头程序就有问题了&#xff09;select seq_110.nextval from dual;&#xff08;显示的值1,2,3,4,5,……&#xff0c;永远不会回头&#xff0c;显示相同的数字&#xff09;--查当前select seq_110.currval from dual;

注意&#xff1a;
        1.序列不要轻易的删掉
                  在SQL Server中&#xff0c;有标识列1&#xff0c;2&#xff0c;3&#xff0c;4的数据&#xff0c;如果删除标识列4的&#xff0c;再增加一条记录&#xff0c;标识列是5。
  在Oracle中&#xff0c;如为某表定义了序列&#xff0c;删除中间的某条记录&#xff0c;情况和SQL Server中一样&#xff0c;但是如果把该表的序列删掉&#xff0c;再创建序列&#xff0c;那么情况就不一样了。



例&#xff1a;
        学生信息表
          1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 , 6, 7&#xff0c;8&#xff0c;9&#xff0c; 10, 11, 13 ,1 ,2 ,3

          序列,currval   nextval  13

           学号为7的学生成绩表  7&#xff0c;90  80

          1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9

  所以创建序列这里就不能用&#xff1a;create or replace sequence seq_110;


        2.create sequence seq_110; 不写了&#xff0c;可不可以&#xff1f;结果会是什么&#xff1f;
  就是标识列&#xff0c;默认的属性&#xff0c;种子1&#xff0c;递增1&#xff0c;最大值&#xff1f;我也不太清楚&#xff0c;无聊你们自己去试。
            思考&#xff1a;
                既然序列是一组唯一、有序的数字&#xff0c;那在触发器insert时&#xff0c;把序列当做id插入&#xff0c;是否就可以达到了标识列的效果呢&#xff1f;

insert into tb_name(tid,tname,tprice)values(1,&#39;张三&#39;,100);
insert into tb_name(tid,tname,tprice)values(2,&#39;李四&#39;,100);
insert into tb_name(tid,tname,tprice)values(3,&#39;李四&#39;,100);
insert into tb_name(tid,tname,tprice)values(4,&#39;李四&#39;,100);create sequence seq_110;  //创建一个序列insert into tb_name(tid,tname,tprice)values(seq_110.nextval,&#39;张三&#39;,100);  --序列当前值的下一个值insert into tb_name(tid,tname,tprice)values(seq_110.nextval,&#39;李国&#39;,100); select seq_110.currval from dual;  --序列当前值

要搞清楚这个思路&#xff1a;
            在往表里插入一条或多条数据时&#xff0c;会自动执行insert的触发器&#xff0c;
            那么我在编写insert触发器时&#xff0c;手动的将序列放入到触发器&#xff0c;
            每次执行插入一条数据时&#xff0c;添加了一个序列进去。

            不过有些麻烦&#xff0c;要在oracle中做成标识列&#xff0c;要触发器。

        &#xff08;每次插入时搞个触发器&#xff0c;然后在他插入之前&#xff0c;去修改一下他插入的那张临时表inserted&#xff0c;把表里的值就调用这个序列的nextval&#xff0c;这样看上去就看是个标识列。&#xff09;

            比oracle要麻烦&#xff0c;要强大&#xff0c;有前触发&#xff0c;有后触发。



    思考&#xff1a;如果有100个表&#xff0c;要写多少个序列&#xff1f;1个还是100个&#xff1f;都行&#xff0c;没有标准的。
    如果写一个&#xff0c;100个表共用一个序列&#xff0c;那会造成每个表中的标识列不连贯,比如&#xff1a;
            A表&#xff1a;
                    序列1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;9&#xff0c;10&#xff0c;11&#xff0c;……
                            1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8
            B表&#xff1a;
                    序列5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;12&#xff0c;13&#xff0c;14&#xff0c;……
                           1,2,3,4,

    注意&#xff1a;尽量做到一个表一个触发器一个序列。

            A表  seq_110
                        序列1,2,3,5。。。。。。

            B表  seq_120  
                        序列1,2,3,4,5


        4.更改和删除序列
            更改序列&#xff1a;

    alter sequence seq_110 maxvalue 5000 cycle;

注意&#xff1a;不能更改序列的start with参数 尽量不要修改&#xff0c;一旦修改会出问题&#xff0c;如果实在要改&#xff0c;先删了再创建序列。


            删除序列&#xff1a;

   drop sequence seq_110;

四、视图

         通过定制的方式显示来自一个或多个表的数据。
            说白了&#xff1a;视图就是一个虚拟表&#xff0c;就是一段查询的SQL语句。
            好处&#xff1a;安全性&#xff0c;降低了程序的复杂程度

--例如&#xff1a;emp查询每个员工的名字、薪水、奖金、收入、部门名称dept
--建议&#xff1a;先写查询语句&#xff0c;再去搞视图
--第1步写查询语句&#xff1a;
select a.ename 姓名,a.sal 薪水,a.comm 奖金,(a.sal&#43;nvl(a.comm,0)) 收入,b.dname 部门 from emp a
inner join dept b
on a.deptno&#61;b.deptno;

        是不是每个人都要写这么长段代码&#xff1f;不用&#xff0c;我们根据这需求创建个视图&#xff0c;以后别人要看&#xff0c;就直接调用这个视图名就行了。

--创建这个需求的视图
create or replace view v_emps
as
select a.ename 姓名,a.sal 薪水,a.comm 奖金,(a.sal&#43;nvl(a.comm,0)) 收入,b.dname 部门 from emp a
inner join dept b
on a.deptno&#61;b.deptno;

注意&#xff1a;如果这时运行报错&#xff1a;没有权限&#xff0c;则要通过sys或system账户给scott赋view的权限。
    grant create view to scott;


--调用视图&#xff1a;
select * from v_emps;

思考&#xff1a;
--1. 视图是否可以调用视图&#xff1f;&#xff08;肯定&#xff09;
        --案例&#xff1a;我现在只要姓名&#xff0c;薪水&#xff0c;奖金3个列

create or replace view v_empb
as
select 姓名,薪水,奖金 from v_emps;

--2. 视图是否可以无限次嵌套&#xff1f;&#xff08;应该不行&#xff0c;SQL Server最多是32层&#xff0c;Oracle中应该也差不多&#xff09;

--3. 视图的数据是否可以直接修改&#xff1f;&#xff08;视图的数据保存在表里&#xff0c;视图只是一张虚拟的表&#xff09;
    理论上来说是可以修改的&#xff0c;这个修改是在修改基表上的数据&#xff1b;
    但有一种合成、聚合的数据&#xff0c;比如“收入”是由薪水&#43;奖金&#xff0c;是不能被修改的。

-------联接视图&#xff08;要操作&#xff09;
关于&#43;的&#xff0c;&#43;号在右--->左联 left outer join
        &#43;号在左--->右联 right outer join 
        左右都有&#43;号--->全联  full outer join


-------视图上的DML语句


-------视图中的函数



五、索引

            是数据库内部编排数据的一种方法。
            优点&#xff1a;提高查询速度

--创建索引
Create Index index_name on Tablename(colname,colname...)
tablespace 表空间名;--不能使用or replace--重建索引&#xff08;修改&#xff09;
Alter Index index_name Rebuild;--删除索引
Drop Index index_name;--唯一索引
Create Unique Index index_name On Tablename(colname);--组合索引
create index index_name on tablename(colname1,colname2,……);--反向键索引--位图索引--索引组织表

好处&#xff1a;把数据存储在与其关联的索引中

最大优点&#xff1a;访问数据都是基于组件



六、综合代码


        1.同义词部分&#xff1a;

--SYS管理员
select * from emp;select * from scott.emp;select * from scott.tb_0214;create public synonym qrj for scott.tb_0214;select * from qrj;--通过私有同义词创建别名为tb_0214
create or replace synonym fsj for scott.tb_0214;select * from fsj;grant create synonym to scott;grant create public synonym to scott;select * from sb;revoke create public synonym from scott;grant create view to scott;
revoke create view from scott;-----------oracle数据库对象----------
#左侧导航窗口的所有文件夹名称都可以称之为数据库对象
#最基础的数据库对象&#61;&#61;&#61;&#61;&#61;数据表table
#常用的数据库对象&#xff1a;function函数 procedure存储过程 package程序包
#trigger触发器 table表格 index索引 view视图
#sequence序列 users用户 synonym同义词#所有数据库对象的操作必须动用SYS去管理#今日学习数据库对象&#xff1a;synonym同义词|sequence序列|视图|索引--synonym同义词
--一般为数据表起别名&#xff0c;方便查询使用
--也方便别人能够在有效的权限中进行访问。--角色&#xff1a;scott
select * from emp;--其实emp就是通过同义词创建的
select * from scott.emp;--创建表的同时复制emp表中的三个字段的所有结果集
create table tb_0214
as
select empno,ename,sal from emp;select * from tb_0214;--为tb_0214创建一个公开的同义词
--公开同义词的特点&#xff1a;全用户共享
--create public synonym syn_emp for scott.emp;
create public synonym qrj for scott.tb_0214;select * from qrj;select * from fsj;--给定当前scott用户授予创建同义词的权限-----SYS去授予
grant create synonym to scott;create public synonym sb2 for scott.tb_0214;select * from sb;--注意事项&#xff1a;不管是公有同义词还是私有同义词都需要单独授予权限
--通过SYS角色授予
--私有同义词
grant create synonym to 用户角色名;
--公有同义词
grant create public synonym to 用户角色名;--撤销权限
revoke create public synonym from 用户角色
revoke create synonym from 用户角色

        2.序列&#xff1a;

序列&#xff1a;sequence
生成一连串的有顺序的序号&#xff0c;类似rownum伪列
作用&#xff1a;当创建表时&#xff0c;该表的主键字段如果需要序号去标记&#xff08;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5...&#xff09;
可以使用序列这个数据库对象进行标识。
#注意事项&#xff1a;最好一个序列只为一个表服务
/*
语法&#xff1a;create sequence 序列名start with 值 --该序列从什么值开始标识increment by 值 --该序列每次增长指定的值maxvalue 最大值minvalue 最小值
*/
create sequence stu_id
-----------------------
create sequence stu_id2
start with 100
increment by 1
maxvalue 1000
minvalue 1create table tb_02144
(sid number primary key,sname varchar2(20))
--序列中的两个伪列属性 currval 当前 nextval 下一个
select stu_id.nextval from dual;select stu_id.currval from dual;select * from tb_02144;
insert into tb_02144 values(stu_id2.nextval,&#39;张三&#39;)

        3.视图和索引

视图----view
作用&#xff1a;一张虚表&#xff0c;可以将一个复杂的结果集存储到一个视图容器内&#xff0c;
以后方便调用。
/*
create view 视图名称
asselect*/
--查询emp表和dept表一次查询
create view v_demo_01
as
select emp.*,dept.dname,dept.loc from dept inner join emp
on dept.deptno &#61; emp.deptno where dept.deptno &#61; 10;select * from v_demo_01drop view v_demo_01--grant create view to scott; 视图创建必须授予权限 SYS--索引index-------数据库中特定的一种数据排布方式。类似课本的目录
--索引创建的目的:加快查询的效率
--但是索引在一张表不能创建多个。反而会影响效率。create index i_mc
on emp(ename)select * from emp where ename like &#39;S%&#39;drop index i_mc--改变url 驱动包 classfrom


推荐阅读
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
author-avatar
手机用户2502909227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有