一. 联合语句:2个或者是2个以上的select语句是并列关系,并且对这些select语句进行结果集操作。
这些联合语句包括:
union查询
union all 查询
intersect查询
minus 查询
1. union查询2个结果集的并集,并且去掉结果集中的重复行(推荐)
格式 select 查询语句 union select 查询语句
2. union all查询2个结果集的并集,但是不会去掉重复,也就是说2个表的数据,全部都查询出来,会有很多重复的
格式 select 查询语句 union all select 查询语句
3. intersect查询,用于查询2个结果的交集。也就是2个表中都有的数据
格式 select 查询语句 intersect select 查询语句
4. minus 查询,2个给定集合之间的差集 (不常用)
二. 子查询
子查询是指嵌套在查询语句中的查询语句。子查询出现的位置一般为条件语句,如where,它本质上是where后的一个条件表达式。Oracle会先查询子查询然后才是父查询。
子查询首先生成了结果集,这个结果被父查询当做条件。
子查询语句总是用括号括起来(),子查询中还可以嵌套子查询。
应用:
在实际查询中,子查询一般出现在where字句中。下面是常规查询语法:
where 条件 【not】in (子查询)
where 条件 比较运算符 【any|all】 (子查询)
where 条件 【not】exists (子查询)
注意:
1.在in,any,all 结合比较运算符,可以引入表的列表操作。
2.通过exists 引入的是存在性的测试。
3.字查询由一个比较运算符(=,<>,>,>=,<,<=)引入,由这些运算符引入的子查询必须返回单个值,而不是列表!单个子查询会成功,但是整个查询会报错!
4.字查询返回多行的话,那么需要in,some,any,all等关键字
小结:重点是多表连接的查询,难点是各种子查询的应用,对于结果集的操作要注意union和union all的细微差别!!!
三.关于函数:
1.null函数的应用 :
NVL( string1, replace_with)
功能:如果string1为NULL(也就是空,什么都没有),则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。
注意事项:string1和replace_with必须为同一数据类型,除非显式的使用TO_CHAR函数进行类型转换。
2.to_char()函数
将数值或者是日期转换为字符串
eg:select 时间字段,to_char(时间字段,'YYYY-MM-DD') from 表
3.to_date()函数
字符转日期
eg: select to_date('2017-12-28','YYYY-MM-DD') as 日期 from dual;
四.索引
索引是oracle为提高查询效率而制定的机制。对于大量的数据的查询,索引可成倍的提高查询速度,缩短查询时间。
索引建立在数据表上面。某一列而言
1.何时创建索引:
索引一般创建在where字句中使用的列,或者是连接时以2边相等的形式的某个列上。
2.在数据库系统中建立索引主要有以下作用:
(1)快速取数据;
(2)保证数据记录的唯一性;
(3)实现表与表之间的参照完整性;
(4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。
优点
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
3.使用语句创建索引
:使用create index 语句创建索引。
oracle的索引分为5种:唯一索引,组合索引,反向键索引,位图索引,基于函数的索引
创建索引的标准语法:
CREATE INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空间名;
创建唯一索引:
CREATE unique INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空间名;
eg: create unique index card_no_index on refuel_oil_card_info(card_no);
创建组合索引:
CREATE INDEX 索引名 ON 表名 (列名1,列名2)
TABLESPACE 表空间名;
创建反向键索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse
TABLESPACE 表空间名;
4.创建索引的注意事项:
1.建立索引建立在经常查询的表上,列如:代理商表,业务表,订单表....等等,这些常查询的表。
2.在定义唯一约束的列上定义索引,效果更好
3.索引要占用数据库空间,在设计数据库时,就要把索引空间考虑在内
4.尽量把表和它的索引放在不同的磁盘上,这样查询的更快!
5.不要建立重复索引,目前最常见的重复索引是单独为某个列建立主键和聚集索引
重命名索引:
alter index 旧的索引名称 rename to 新的索引名称
删除索引:
drop
5.查看索引
对于系统中已经存在的索引我们可以通过以下的两个系统视图(user_indexes和user_ind_columns)来查看其具体内容,例如是属于那个表,哪个列和,具体有些什么参数等等。
user_indexes: 系统视图存放是索引的名称以及该索引是否是唯一索引等信息。
user_ind_column: 系统视图存放的是索引名称,对应的表和列等。
根据表名,查询一张表的索引:
SQL> select * from user_indexes where table_name=upper( 'TB_AGENT') ;
查看索引被索引的字段:
SQL> select * from user_ind_columns where index_name=upper('&index_name');
6.建立索引的目的:
建立索引的目的是:
1.提高对表的查询速度;
2.对表有关列的取值进行检查。
但是,对表进行insert,update,delete处理时,由于要表的存放位置记录到索引项中而会降低一些速度。
注意:一个基表不能建太多的索引;
空值不能被索引
只有唯一索引才真正提高速度,一般的索引只能提高30%左右。
重点是何时创建索引,以及如何合理的创建索引。
最后一个实际的例子:
对tb_agent表的agent_id列进行创建索引。
create index in_tbagent_id on tb_agent(agent_id) 创建索引
select * from user_indexes where table_name=upper('tb_agent'); 查询索引
drop index in_tbagent_id; 删除索引
select t.agent_id from tb_agent t; 建了索引之后,查看这个列,发现了不一样的地方,没创建索引之前是乱序,现在是升序
借鉴文献 https://www.cnblogs.com/djcsch2001/articles/1823459.html
五、视图:
视图是Oracle提供的一种查询机制。视图在数据库中可以理解为一张虚拟的表,
视图是select查询语句定义的,基于一个或多个表(或视图)的一个逻辑表。视图本身不包含任何数据
视图只是一个查询语句的结果。它的数据最终是从表中获取的,这些表可以称为基表。所以不需要在表空间中为视图分配存储空间
视图本身不包含任何的数据
1.视图的作用:
视图除了在select语句之外,在其他的语句insert/update/delete中是受限的
使数据简化
使数据更加独立
增加安全性,可以只显示给大家一部分信息。
2.视图的创建和使用 create view 视图名
create view是创建视图的命令,后面紧跟视图名称,as 后面连接的是视图的查询定义(或者说是关系运算符)
格式: create view 视图名
as
select 列1,列2 from 表名 where 条件
列子a:
create view tb_business_view as select * from tb_business; --创建视图
select * from tb_business_view; --查询视图
create view new_tb_business_view as select * from tb_business_view; --在视图上创建视图
总结:正确步骤a 编写select子查询语句
b 测试select子查询语句
c 检查查询结果的正确性
d 使用该select子查询语句创建视图
问:什么是强势创建视图?? force view
创建无源表视图会出错,force view关键字表示创建强制视图
格式 create force view 视图名 as select 列1,列2 from 表名 where 条件。
其中表名是不存在的表。Oracle会抛出错误,但是视图已经存在
3.设置视图为只读 with read only
因为视图是创建在数据源上面的,因此数据源表会进行增删改的操作,因此创建视图的时候避免用户修改数据,可以把视图设置为只读属性 with read only
格式 :create view 视图名
as
select 列1,列2 from 表名 where 条件 with read only
注意:下列情况,必须将视图设置为只读视图
a.出现集合运算或者分组函数,如sum,max,count函数
b.出现group by,order by ,start with等字句,特别是with read only字句不能与order by 字句同时存在。
c.出现rownum等伪列关键字
d.出现distinct关键字
4.设置为视图约束 with check option
格式 : create or replace view 视图名
as
select 列1,列2 from 表名 where 条件 with check option
with check option表示视图启动了和子查询条件一样的约束,如果对视图进行修改或插入数据和查询条件不一致,那么该操作会被终止。
or replace 是覆盖之前视图的内容,应用场所,发现新建的视图不合心意,忘记了添加约束,就可以添加约束,并且加上or replace。
总结:a:只读视图只能进行查询操作。无法进行更新和插入数据的操作。
b:对于创建了约束的视图,使用视图时,会检查涉及的数据是否能通过select子查询的where条件,否则sql语句不能成功执行。
c:更新视图数据实际是更新基础表中的数据。我们可以利用update语句来更新视图中的数据,但是视图本身不存储数据。更新视图中的数据,需要满足对应基表的相关约束。
eg:update v_view set tb_name="李银河" where tb_id='001'; 更新视图
Oracle底层做的事:1.对实际表中的id为001的员工的姓名进行修改
2.将修改的结果反映到视图中。
d:插入数据,删除数据都和更新类似。操作的都是视图,(但是呢,Oracle底层自动操作基础表。也就是说我们改动的实际上是基础表,将结果映射到视图上)
可以了解内嵌视图 http://blog.csdn.net/liuxinsysu/article/details/51165089
连接查询的定义:
1.指定每个表中,要用于连接的列,典型的连接条件是在一个表中指定外键,在另一个表中指定与其关联的键。
2.指定比较各列的值时,要使用逻辑运算符(=,<>等)
六、连接查询 :
类型:
1.内连接 inner join inner可以省略 ,并且使用时,在from 字句中需要定义一个on字句。内部连接包括 等价连接 和自然连接
inner的位置,在from 字句中
如果想使用复杂的多表连接,最简单的方法就是在select语句的 from字句中,使用 join(inner join,outer join, cross join 等关键词)
select 语句 from 表1 inner join 表2 on 连接条件 ------内连接(inner可以省略)
内连接用于2个或2个以上的进行连接,最后只能查询出匹配的记录,不匹配的记录将无法查询出来
select 语句 from 表1 left join 表2 on 连接条件 ------左连接(对左边的表不加限制全查出来,右边只显示匹配的)
select 语句 from 表1 right join 表2 on 连接条件 ------右连接(对右边的表不加限制全查出来,左边只显示匹配的)
select 语句 from 表1 full join 表2 on 连接条件 ------全连接(2个表无论匹配不匹配都会查出来)
右连接和左连接也可以用(+)表示,这是一种简略的写法
七、pl /sql:
1.定义:
pl/sql是Oracle在SQL标准语言上进行扩展后形成的程序设计语言,是一种oracle数据库特有的,支持应用开发的语言。
Oracle编程中也需要结合使用流程控制语句,用于控制pl/sql语句,语句块的执行过程。
2.基本结构:
程序的基本单元是块,主要的形式有函数,过程和匿名块。
一个pl/sql块由三个部分组成:声明部分 执行部分 异常处理部分,其中只有执行部分是必须的,其他两个部分是可选的。而且该结构的最后必须要有分号。
注意:声明部分用来定义变量、类型、游标、子程序、触发器、异常等,被声明的元素在本块范围内有效。
3.格式
declare
变量声明部分
--声明一些变量,常量,用户定义的数据类型以及游标等。
--这一部分可选,如不需要可以不写。
begin
可执行部分
--主程序体,在这里可以加入各种合法语句
exceptionn
异常处理部分
--异常处理程序,当程序中错误时执行执行这
end
--主程序体结束
...未完