当前位置: 首页 > news >正文

Oracle之数据库对象加连表查询

 

目录

--数据库对象

--同义词--同义词是数据库对象的一个别名,可以给表,试图,序列,过程,函数等起上一个别名--作用:隐藏原有名字,提高安全性--分类:--私有同义词:只能当前用户使用--公共同义词:可以被所有用户访问--创建同义词语法是:--creat [or replace] [public] synonym [schema.] synonym_name for [schema.] jobject_name--语法说明:--示例一:create or replace synonym stu for scott.t_student;--可能会有权限不足,记得授权--使用同义词select*from stu;--删除同义词drop synonym stu;--CREATE [OR REPLACE]:表示在创建同义词时,如果该同义词已经存在,那么就用新创建的同义词代替旧同义词。--PULBIC:创建公有同义词时使用的关键字,一般情况下不需要创建公有同义词。

--序列

 --使用序列

-- 修改序列

--查询序列

--删除序列

-- 创建序列

-- 使用序列

insert into pet_type values(pet_type_seq.nextval,'dog',1);select * from pet_type;--连接查询

--左连接(left join),左主右从

--右连接(right join),右主左从

--视图

-- 视图与表的区别

--创建视图

--删除视图

--示例

-- 查询视图select * from v_emp;

-- 修改视图update v_emp set sal=sal+10 where empno=7566;

-- 查询原表select * from emp where empno=7566;

-- 删除视图drop view v_emp;

--# 索引

--索引应用

## 索引注意事项

## 索引创建创建索引的语法格式:

-- UNIQUE:可选关键字,指定该索是否为唯一索引。*--- BITMAP:可选关键字,指定该索引是否为位图索引。*--- FUNCTION-BASED:可选关键字,指定该索引是否为函数-Based索引。*--- DOMAIN:可选关键字,指定该索引是否为域索引。* ---index_name:索引的名称。* ---table_name:被索引的表的名称。* ---column_name:要作为索引键的列名。*-- ASC:表示升序。 -- DESC:表示降序。* --TABLESPACE tablespace_name 可选项:指定索引所存储数据的表空间名。如果未指定,则使用默认表空间。当数据库中存在多个表空间时,该选项特别有用。

-- 创建索引


--数据库对象

--同义词
--同义词是数据库对象的一个别名,可以给表,试图,序列,过程,函数等起上一个别名
--作用:隐藏原有名字,提高安全性
--分类:
--私有同义词:只能当前用户使用
--公共同义词:可以被所有用户访问
--创建同义词语法是:
--creat [or replace] [public] synonym [schema.] synonym_name for [schema.] jobject_name
--语法说明:
--示例一:
create or replace synonym stu for scott.t_student;
--可能会有权限不足,记得授权
--使用同义词
select*from stu;
--删除同义词
drop synonym stu;
--CREATE [OR REPLACE]:表示在创建同义词时,如果该同义词已经存在,那么就用新创建的同义词代替旧同义词。
--PULBIC:创建公有同义词时使用的关键字,一般情况下不需要创建公有同义词。


--序列


--序列:是用于生成唯一的,连续的序号对象(自增列)
--语法:create sequence
--   [start with 1]               -- (种子)从n开始计数
    --    [increment by 1]             -- (增量)每次递增n,负数为递减
      --  [maxvalue n | nomaxvalue]    --  最大值
        --[minvalue n | nominvalue]    --  最小值,(没太多含义)
       -- [cycle | nocycle]             --  循环/不循环
        --[cache n | nocache];         --  分配并存入到内存中
create sequence seq_stu_sid
 start with 1
 increment by 1
 maxvalue 1
 cyche 10;


 --使用序列


 --序列名.nextval:产生下一个序列值
 --序列名.currval:产生当前序列值
 select seq_stu_sid.nextval,seq_stu_sid.currval from dual;
 --在添加数据时使用序列,当做自增列
 select*from t_student;
 insert into t_studnet(sid,sname,sage)
 values(seq_stu_sid.nextval,'肖海丹',19);
--INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。
--START WITH 定义序列的初始值(即产生的第一个值),默认为1。

-- MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

--MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。

--CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。

--CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

--大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 cache x个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数也不能设置太大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入cache x个。这种情况也能会在数据库关闭时也会导致序号不连续。

--调用NEXTVAL将生成序列中的下一个序列号,调用时要指出序列名,即用以下方式调用: 序

--列名.NEXTVAL

--CURRVAL用于产生序列的当前值,无论调用多少次都不会产生序列的下一个值。如果序列还没有通过调用NEXTVAL产生过序列的下一个值,先引用CURRVAL没有意义。调用CURRVAL的方法同上,要指出序列名,即用以下方式调用:序列名.CURRVAL 

-- 修改序列

--语法
--alter sequence 序列名称
--  选项

--修改序列的注意事项:

--1. 必须是序列的拥有者或对序列有 ALTER any sequence权限
--2. 只有将来的序列值会被改变
--3. 改变序列的初始值只能通过删除序列之后重建序列的方法实现

--查询序列

 --通过数据字典USER_OBJECTS可以查看用户拥有的序列。
-- 通过数据字典USER_SEQUENCES可以查看序列的设置。

--删除序列

--drop sequence 序列名
-- 序列


-- 创建序列


create sequence test_sq
start with 10
increment by 10
maxvalue 100
minvalue 10
cycle
cache 5;


-- 使用序列


select test_sq.nextval from dual; --得到序列下一个值,必先用一次
select test_sq.currval from dual; --得到序列当前值

create sequence pet_type_seq;
select pet_type_seq.nextval from dual; 

insert into pet_type values
(pet_type_seq.nextval,'dog',1);
select * from pet_type;

--连接查询


-- 创建成绩表
create table t_score(
    sid number(11),
    cid number(11),
    score number(11,2),
    constraint fk_sc_sid foreign key (sid) references t_student(sid),
    constraint fk_sc_cid foreign key (cid) references t_course(cid)
);
comment on table t_score is '成绩信息表';
comment on column t_score.sid is '学生编号,外键';
comment on column t_score.cid is '课程编号,外键';
comment on column t_score.score is '成绩';
-- 添加教师数据
select * from t_teacher;
insert into t_teacher values(1,'刘老师');
insert into t_teacher values(2,'张老师');
insert into t_teacher values(3,'苍老师');
insert into t_teacher values(4,'空老师');

-- 添加课程数据
select * from t_course;
insert into t_course values(1,'计算机',1);
insert into t_course values(2,'新媒体',2);
insert into t_course values(3,'启蒙教育',3);

-- 添加成绩数据
select * from t_student;
insert into t_score values(1,1,80);
insert into t_score values(1,2,70);
insert into t_score values(1,3,85);
insert into t_score values(2,1,90);
insert into t_score values(2,2,96);
insert into t_score values(2,3,92);
insert into t_score values(3,1,60);
commit;
select * from t_studnet;
select*from t_teacher;
select*from t_course;
select*from t_score;
--交叉连接:笛卡尔乘积
select * from t_teacher t,t_course c;
--内连接:只有连接条件完全成立,才会显示查询结果:
--关键字:inner join
select *from t_tearcher t inner join t_course c on t.tid=c.tid;
--扩展语法
select*from t_teacher t,t_course c where t.tid=c.tid;
--外连接(左连接和右连接)
--特点:连接条件成立,则显示结果:连接条件不成立,主表记录永久保存,与表null值失联


--左连接(left join),左主右从

select *from t_teacher t left join t_course c on t.tid=c.tid;
--扩展语法
select*from t_teacher t,t_course c where t.tid=c.tid(+);

--右连接(right join),右主左从


select*from t_course c right join t_teacher t on t.tid=c.tid;
--扩展语法:仅限于Oracle
select*from t_course c,t_teacher t where c.tid(+)=t.tid;
--多表联查:永远视为两张表的连接查询
select*from t_student s,t_score c,t_teacher t sc where s.sid=sc.sid and sc.cid=c.cid and c.tid=t.tid


--视图

--视图(view)类似一个虚表,建立与基表之上。不会占用物理的空间(还有一种占用物理空间的视图叫做物化视图MATERIALIZED VIEW,物化视图又称快照),视图的定义语句会存储在数据字典中,会根据基表的更新而更新数据,而一个视图当然也可以从另一个视图中产生,相当于把一个SQL语句打包起来然后起一个别名,在你查询这个视图内容的时候,视图对应的SQL会再执行一次,然后把结果反馈给你,也就是将你写的SQL的结果封装成一张虚拟表,基于它创建时指定的SQL语句返回的结果集。

​--需要注意的是,对于视图的操作其实是对视图对应SQL内字段所属基表的操作,虽然可能会受到一些限制。单表视图是可以增删改的。

--视图的优缺点

--视图的优点

--1. 便捷整合:不用害怕丢失SQL语句。对于需要多次执行的SQL,在权限允许的情况下也可以建一个视图。有些SQL分组统计以后需要连接另一张表,那么就可以建一个视图用视图去连接。

--2. 保密:有些表内的隐私字段或敏感字段,如果不希望使用者看见,就可以把使用者需要使用的字段创建一个视图。这样使用者就不知道基表,以及基表的表结构

--3. 简化权限:不用对于不同用户去授予表字段权限,而是直接建视图,将视图的权限给对应用户就可以。

--视图的缺点

--1-. 耗费时间:因为需要把视图的查询转换为基本表的查询。

--2. 修改不便:需要把对于视图的操作转换为对基表的操作,简单的视图会比较方便但是复杂视图会繁琐和限制比较多。
  -- * 单表视图:增删改查
  -- * 多表视图:只能修改和查询

-- 视图与表的区别


--1. 视图不占用物理空间,而表是占用物理空间的。

--2. 表是内容,而视图是一个窗口。

--3. 视图的建立和删除只影响自身而不影响表。

---视图语法 

--创建视图

CREATE [OR REPLACE] [FORCE] VIEW 视图名
AS
subquery
[WITH CHECK OPTION ]
[WITH READ ONLY]

--* OR REPLACE 若所创建的试图已经存在,ORACLE 自动重建该视图
--* FORCE 不管基表是否存在 ORACLE 都会自动创建该视图
--* subquery 一条完整的 SELECT 语句,可以在该语句中定义别名;

--* WITH    CHECK    OPTION 插入或修改的数据行必须满足视图定义的约束;

--* WITH READ ONLY 该视图上不能进行任何 DML 操作

--删除视图

DROP VIEW view_name


--示例


-- 创建视图,注意需要create view权限
create or replace view v_emp 
as
select * from emp where sal>3000;

-- 查询视图
select * from v_emp;

-- 修改视图
update v_emp set sal=sal+10 where empno=7566;

-- 查询原表
select * from emp where empno=7566;

-- 删除视图
drop view v_emp;


-- 以sys用户登录,给scott赋权 `grant create view to scott`

--# 索引

--索引是一种与表相关的可选数据对象。通过在表中的一个或多个列上创建索引,就能够为数据的检索提供快捷的存取路径,减少查询时所需的磁盘I/O操作,加快数据的检索速度。
  --     索引是将创建列的键值和对应记录的物理记录号(ROWID)排序后存储起来,需要占用额外的存储空间来存放。由于索引占用的空间远小于表所占用的实际空间,在系统通过索引进行数据检索时,可先将索引调入内存,通过索引对记录进行定位,大大减少了磁盘/O操作次数,提高检索效率。一般而言,表中的记录数越多,索引带来的效率提高就越明显,所以在数据库系统中,索引是必不可少的数据对象之一。

--索引应用

在Oracle数据库中,索引是一种数据结构,用于加快查询操作的速度。索引是建立在表或视图上的对象,可以对一个或多个表列进行排序,并提供快速访问该表的能力。

因此索引主要用于优化查询操作性能。当一个表包含大量的数据时,查询整个表可能会非常缓慢,因此可以创建一个或多个索引来提高查询性能。

通过使用索引,可以让查询得到快速执行,因为它们允许系统跳过扫描整个表而只搜索分析的那部分数据。如果查询可以利用索引,则通常会比不使用索引时更快地响应查询。

具体来说,索引能够做到以下几点:

1. 提高检索效率:索引可以减少需要扫描的数据量,缩小了扫描范围,加快了查询速度。
2. 加快数据排序:索引将关键字存储在文件系统中,可以对其进行排序,并且在 SQL 执行时,这些排序好的值可被迅速输出。
3. 提高数据完整性:由于索引都是基于表约束创建的,因此它们可以帮助保证数据的一致性和完整性。
4. 优化查询计划:通过正确的索引设计,可以使查询优化器更容易选择最佳的执行计划,从而提高执行效率。

## 索引注意事项

虽然索引对数据库的性能有很大的帮助,但过多、不恰当的索引也可能会产生反作用,导致性能下降。因此,在建立索引时需要根据具体情况仔细权衡,比如需要权衡查询效率和存储成本,避免过度索引导致性能下降,确保其适当。此外,索引也会影响数据的插入、更新和删除操作的性能,因此需要根据具体情况进行优化。


## 索引创建
创建索引的语法格式:

```
CREATE [UNIQUE] [BITMAP | FUNCTION-BASED | DOMAIN] 
INDEX index_name 
ON table_name (column_name[ASC | DESC] [, column_name[ASC | DESC]]...)
               [TABLESPACE tablespace_name];
```

-- UNIQUE:可选关键字,指定该索是否为唯一索引。
*--- BITMAP:可选关键字,指定该索引是否为位图索引。
*--- FUNCTION-BASED:可选关键字,指定该索引是否为函数-Based索引。
*--- DOMAIN:可选关键字,指定该索引是否为域索引。
* ---index_name:索引的名称。
* ---table_name:被索引的表的名称。
* ---column_name:要作为索引键的列名。
*-- ASC:表示升序。
 -- DESC:表示降序。
* --TABLESPACE tablespace_name 可选项:指定索引所存储数据的表空间名。如果未指定,则使用默认表空间。当数据库中存在多个表空间时,该选项特别有用。


-- 创建索引


create index idx_emp_ename on emp(ename);
-- 基于索引查询
select * from emp where ename='SMITH';
-- 删除索引
drop index idx_emp_ename;
 

相关文章:

  • 前端 实现文字打字效果(仿AI)
  • 三维点拟合直线ransac c++
  • C/C++中获取或处理时间节点方法
  • UWP特性分析
  • 软件招标评审模板
  • OpenCV day6
  • 责任链模式:从 Sentinel 流控到审批流程的链式处理
  • 什么是Netty
  • 常见免杀框架的使用(3款)---【AniYaGUI1.2.0、AV_Evasion_Tool掩日、FoxBypass_V1.0】
  • IHC肿瘤标志物 | 常见前列腺癌诊断
  • RAG-分块策略
  • 项目实战--新闻分类
  • 如何从EndNote中将某一篇手稿里面涉及到的引用文献导出,导出格式为bib?
  • 北京SMT贴片厂精密制造关键工艺
  • ESP-IDF教程2 GPIO - 输入、输出和中断
  • 【C++】 —— 笔试刷题day_19
  • STM32 HAL 通用定时器延时函数
  • 观察者 ➜ 事件总线:一路走来的碎碎念
  • 贪心、动态规划、其它算法基本原理和步骤
  • 00.IDEA 插件推荐清单(2025)
  • 美国那点事|特朗普的“刀”砍向国务院,美国霸权迎来历史拐点?
  • 讲武谈兵|英国公布六代机最新渲染图,但研发面临多重难题
  • 白宫新闻秘书:美政府将在法庭上回应哈佛大学诉讼
  • 开发国内首个泌尿专科智能体,医生们将临床经验转变为知识图谱
  • 直播中抢镜“甲亢哥”的翁东华卸任了!此前任文和友小龙虾公司董事
  • 中国全国政协-越南祖国阵线中央暨边境省份组织第三次友好交流活动在南宁开幕