oracle中如何用虚表 sql 虚表

数据库常用查询操作

--注释

创新互联建站专注于新华网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供新华营销型网站建设,新华网站制作、新华网页设计、新华网站官网定制、微信小程序开发服务,打造新华网络公司原创品牌,更为您提供新华网站排名全网营销落地服务。

--select *|字段名1,字段名2... from 表名;

--1)

--查询|检索|获取 所有员工的所有信息

--查询的数据: 员工的所有信息

--数据的来源:员工表  emp

--条件:

select * from emp;

--2)

--查询所有的员工名字

select ename from emp;

--3)

--查询所有的员工编号和员工名称,员工上级的编号

--查询的数据: empno,ename,mgr

--数据的来源:员工表  emp

select empno,ename,mgr from emp;

--4)

--查询所有部门部门编号

select deptno from dept;

--5)

--查询出所有员工所在的部门的部门编号

select distinct  deptno from emp;

--对查询数据进行去重(非字段去重) distinct

--6)

--查询出所有存在员工的部门的部门编号,以及员工名称

select deptno,ename from emp;

select distinct sal,deptno from emp;

--7)

--查询表达式,结果是表达式的值,显示的字段名就是表达式,计算值

select 1+1 from emp;

select 'a' from emp;

--8)

--给字段取别名  select 字段1 (as) 别名1,字段2 别名2 from 表名 别名;  表的别名不能加as

--查询所有员工的名称(别名为:名字),员工编号(编号)

--别名默认变大写,别名中的内容原封不动出现 ""-中的内容原封不动出现

select 123+456 "get sum" from emp;

select empno as 员工编号,ename "员工 姓名" from emp;

--9)

--字符串 ''  原封不动显示""

select distinct '哈哈' 笑 from emp e;

--10)

--字符串拼接 java中使用+  这里使用||

--查询 ab--cd  表达式

select distinct 'ab-'||'-cd' from emp;

--查询所有的员工名字,给他们来一个前缀SXT

select 'sxt-'||ename from emp;

--11)

--伪列 : 不存在的列就是伪列  比如:表达式,字符串

--12)

--虚表: 在oracle中不存在的表,也可以说是这个表中没有任何数据,没有任何字段 --oracle中的虚表:dual

--虚表的作用:可以不使用distinct就可以去重的效果,因为里面没有数据,不会出现多行

select * from dual;

select distinct 123*456 from emp;

select 123*456 from dual;

select sysdate from dual;

--比如查询当前时间

--13)

--给每一个员工在原来的基础上+100块钱奖金

--null 空

--null与数字运算,结果还为null

--null与字符串运算,结果原串

--nvl(参数1,参数2) 处理null使用  如果参数1为null,最终结果参数2,如果参数1不为null,最终的结果就是参数1

select comm 原奖金,comm||'100' 新奖金 from emp;

select comm 原奖金,nvl(comm,0)+100 新奖金  from emp

--一节结尾小练习

--查询所有员工的名字, 工种, 年薪(不带奖金)

select ename,job,sal*12 年薪 from emp;

--查询所有员工的名字,工种,年薪(带12月奖金的)

select ename,job,(sal+nvl(comm,0))*12 年薪 from emp;

--查询所有员工的名字, 工种, 年薪(带一次奖金的)

select ename,job,sal*12+nvl(comm,0) 年薪 from emp;

--select *|表达式|字符串|伪列|字段1 别名1,字段2 as 别名2... from 表名 别名|结果集 where 行过滤条件;

--执行流程: from--where--select确定结果集

-- 查询20部门的员工信息

--数据: *

--来源: emp

--条件: deptno=20

select * from emp where deptno=20;

-- =  =  = != 

-- 查询工资大于1000的员工的姓名 工作岗位  工资  所属部门编号

--数据: ename,job,sal,deptno

--来源: emp

--条件: sal1000

select ename,job,sal,deptno from emp where sal=1000;

-- 查询不在20部门工作的员工信息

select * from emp where deptno != 20;

select * from emp where deptno 20;

--where 中不能使用字段的别名

-- 查询员工的年薪大于20000的 员工名称、岗位 年薪

select ename 姓名,job 岗位,(sal+nvl(comm,0))*12 sum from emp where ((sal+nvl(comm,0))*12)20000;

select ename 姓名,job 岗位,(sal+nvl(comm,0))*12 sum from emp;

select 岗位, sum

from (select ename 姓名, job 岗位, (sal + nvl(comm, 0)) * 12 sum from emp)

where sum 20000;

-- 查询  any(任意一个)  some(任意一个)  all(所有)

select * from emp where deptno = any(10,20);

select * from emp where deptno = some(10,20);

--大于最小的

select * from emp where sal any(1500,2000); --薪资1500的就可以

--大于最大的

select * from emp where sal all(1500,2000); --薪资2000的就可以

-- 查询 工种不为’SALESMAN’的员工信息 (注意 内容区分大小写)

select * from emp where not job ='SALESMAN';

--or或 and并且|都  not取反

-- -检索 工资 1600, 3000员工名称 岗位 工资

select ename,job,sal from emp where sal=1600 or sal=3000;

select ename,job,sal from emp where not (sal=1600 or sal=3000);

-- 工资在2000到3000之间的员工信息

select * from emp where sal2000 and sal3000;

--between 小范围值  and 大范围的值  两者之间  = =

select * from emp where sal between 1600 and 3000;

---查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门编号,工资

select ename ,deptno ,sal from emp where job='CLERK' and deptno=20;

-- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job='CLERK' or deptno=20;

--查询 岗位 不是 CLERK 员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job!='CLERK';

select ename ,deptno ,sal,job from emp where not job='CLERK';

select ename ,deptno ,sal,job from emp where job'CLERK';

-- 查询 岗位 不为 CLERK 并且部门编号不为 20的员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job!='CLERK' and deptno!=20;

select ename ,deptno ,sal,job from emp where not (job='CLERK' or deptno=20);

--存在佣奖金的员工名称

select ename,comm from emp where not comm is null;

select ename,comm from emp where comm is not null;

--不存在奖金的员工名称

select ename,comm from emp where comm is null;

--集合

--Union,并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序;

--Union All,全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序 ;

--Intersect,交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

--Minus,差集( 减去重复 ) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序

--查询工资大于1500 或 含有佣金的人员姓名

select ename,sal,comm from emp where sal1500 or comm is not null;

select ename,sal,comm from emp where sal1500;

select ename,sal,comm from emp where comm is not null;

--并集

select ename,sal,comm from emp where sal1500

Union

select ename,sal,comm from emp where comm is not null;

select ename,sal,comm from emp where sal1500

Union all

select ename,sal,comm from emp where comm is not null;

--查询显示不存在雇员的所有部门号。

--求出所有的部门号

select deptno from dept;

--有员工的部门号

select distinct deptno from emp;

select deptno from dept

Minus

select distinct deptno from emp;

-- 查询显示存在雇员的所有部门号。

select deptno from dept

Intersect

select distinct deptno from emp;

--模糊匹配  like %任意任意字符  _一个任意字符  一起使用

--查询员工姓名中包含字符A的员工信息

select * from emp where ename like '%A%';

--完全匹配

select * from emp where ename like 'SMITH';

--查询员工姓名以'A'结尾的员工信息

select * from emp where ename like 'A%';

--查询员工姓名中第二个字母为A的员工信息

select * from emp where ename like '_A%';

insert into emp(empno,ename,sal) values(1000,'t_%test',8989);

insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000);

--escape('单个字符')指定转义符

--查询员工姓名中包含字符%的员工信息

select * from emp where ename like '%B%%' escape('B');

--当执行插入数据,删除数据,修改的时候,默认开启事务

--可提交  commit 

--可回滚  rollback

--多个人中任意一个值就可以

select * from emp where sal=1600 or sal=3000 or sal=1500;

select * from emp where sal in(1500,1600,3000);

--select 字段.. from 结果集 where 行过滤条件 order by 排序字段 desc降序|asc升序(默认)..;

--执行流程: from-- where--select--排序

select empno,ename,sal from emp order by sal desc,empno asc;

--按照奖金升序排序,如果存在null值,所有的奖金null值的数据最先显示

select empno,ename,sal,comm from emp where deptno in (10,30) order by comm asc nulls first;

dual这表有什么用?在oracle中的

dual是个虚表,其中只有一列,当你查询时间或者日期等的时候就需要使用这个表,例如 select sysdate from dual;

因为在oracle当中查询语句必须要有关键字 select ....from tablename; 只有这样语句才完整,要是没有表名就无法查询,而时间,日期等不存在于任何表,这个时候就引入了 dual 虚表的概念。

oracle的一个问题

虚表(dual)是oracle提供的最小的工作表,它仅包含一行一列。对于虚表(dual)来说,其中的列往往是不相关的或无关紧要的。

如果不理解上面的话,就把dual当做是一张类似常量池

的表。你可以从中取出任何常量。例如,select

sysdate

from

dual

就是取出当前系统时间

select

1

from

dual

取出1

等等

oracle对表的基本操作

子查询目标

子查询是一种把查询的结果作为参数返回给另一个查询的一种查询

子查询可以让你将多个查询绑定在一起

嵌套子查询

多层子查询

相关子查询

可接受外部的引用

exists/any/all

any:与子查询中的每一行与主查询进行比较 并对子查询中的每一行返回一个true值

some 结果与any一样

all 子查询结果都满足条件 才会返回true

DML

数据库插入

insert value

insert select

update update table set col=value

delete

DDL

创建和操作表

create

存储参数 storage(initial size next size minextents value pctincrease value)初始分配空间 追加的长度 最小追加长度 每次追加的百分比或进行下一次追加

用已存在的表创建新表

create table new_t(num name amount) as(select * from old_t where amount )

alter

加入一列到已经存在的表中

修改已经存在的表中的某一列

ALTER TABLE BILLS MODIFY NAME CHAR( );将表中某字段改为长度 个字符

ALTER TABLE NEW_BILLS ADD MENTS CHAR( );向表中加一列

alter不能用于对一个数据库增加或删除字段 但可以将某列由not null改为null

drop

drop table table_name;

创建视图和索引

视图 常被称为虚表 create view 视图是一个数据库对象 他允许用户从一个表或一组表中建立一个 虚表 它本身没有数据 仅仅是一条查询语句 它可以方便的在各个表中进行联合查询 这对用户来说是很方便的 其次 可以增加安全性 屏蔽一些不想让无权限的用户看一些表中的数据即隐藏了基本表 这同时也可以隐藏着其中的复杂性 有时更改起来也很方便而不必涉及到应用程序 如一个表中有 列数据 我只想让其他用户看到 列 这时候视图就会显得十分方便 如表school 有ID name lesson三项 我只需要显示其中 项 实例如下

子查询目标 子查询是一种把查询的结果作为参数返回给另一个查询的一种查询子查询可以让你将多个查询绑定在一起嵌套子查询多层子查询相关子查询可接受外部的引用exists/any/allany:与子查询中的每一行与主查询进行比较 并对子查询中的每一行返回一个true值some 结果与any一样all 子查询结果都满足条件 才会返回true

DML 数据库插入 insert valueinsert selectupdate update table set col=valuedelete

DDL 创建和操作表create存储参数 storage(initial size next size minextents value pctincrease value)初始分配空间 追加的长度 最小追加长度 每次追加的百分比或进行下一次追加用已存在的表创建新表 create table new_t(num name amount) as(select * from old_t where amount )alter 加入一列到已经存在的表中 修改已经存在的表中的某一列ALTER TABLE BILLS MODIFY NAME CHAR( );将表中某字段改为长度 个字符ALTER TABLE NEW_BILLS ADD MENTS CHAR( );向表中加一列alter不能用于对一个 数据库 增加或删除字段 但可以将某列由not null改为nulldropdrop table table_name;

创建视图和索引视图 常被称为虚表 create view 视图是一个数据库对象 他允许用户从一个表或一组表中建立一个 虚表 它本身没有数据 仅仅是一条查询语句 它可以方便的在各个表中进行联合查询 这对用户来说是很方便的 其次 可以增加安全性 屏蔽一些不想让无权限的用户看一些表中的数据即隐藏了基本表 这同时也可以隐藏着其中的复杂性 有时更改起来也很方便而不必涉及到应用程序 如一个表中有 列数据 我只想让其他用户看到 列 这时候视图就会显得十分方便 如表school 有ID name lesson三项 我只需要显示其中 项 实例如下

所以在适当的时候 十分有必要在众多表中建立视图

索引 索引是与磁盘上数据的存储方式不同的另外一组数据的方法 索引的特例是表中记录一句其在磁盘上的存储位置显示 索引可以在表内创建一个列或列的组合 通过对正确的 特定的两个表的归并字段进行索引可以获得明显的好处 create index

ps 视图和索引是两个完全不同的对象 但有一点是相同的 它们都与一个表或数据库相关联 尽管每一个对象只能与一个特定的表相关联 但它们还是通过对数据的预排序和预定义显著地提高了表的工作性能

使用视图 create view view_name(col col ……) as select table_name(col col ……) from table_name;

select规则 不能使用union 不能使用order by 但使用group by有其相同功能

DML的规则 对于多表视图不能使用delete

除非非空列都出现在视图中 否则不能使用insert

对于一个归并(merger)的表插入或更新 所有被更新的记录必须属于同一个物理表

如果创建视图时使用dintinct子句 就不能插入或更新这个视图

不能更新视图中      的虚拟列(它是用计算字段得到的)

删除视图:drop view view_name;

使用索引

索引可以让存储于磁盘上的数据进行重新排序

使用索引的原因 在使用unique关键字时前执行的保证数据的完整性

可以容易的用索引字段或其他字段进行排序

提高查询执行速度

索引的概念

两种方法从数据库中获得数据 顺序访问方式 需要sql检查每一个记录以找到与之匹配的 此法效率很低 但它是使记录准确定位的唯一方法   使用索引的的直接访问方式 sql采用树形结构来存储和返回所以数据 用以指示的数据存储在树的最末端(也就是叶子) 它们被称为结点(也可以叫叶 子) 每个结点中有一个指向其他结点的指针 结点左边的值只是它的双亲结点 结点右边的值则是孩子结点或叶子 sql将从根结点开始找到所需的数据

ps 当查询没有使用索引的表时 查询通常是全表搜索后才会得到结果 全表搜索会让数据库服务程序遍历过表中的所有记录然后返回给定条件的记录 索引可以让数据库服务程序快速的定位到表中的确定行

create index index_name on table_name(column_name [column_name ] );

SQL Server 和ORACLE允许你创建成簇的索引 Informix和ORACLE允许你指明列名是按升序排列还是按降序排列

使用索引不会对表中的物理存储造成影响

order by和索引的区别

使用order by子句时 每次运行它都需要重新进行排序 而使用索引时 数据库会建立一个物理索引对象(树结构) 每次运行查询时都访问同一个索引

当表被删除时 所有与之相关的索引也将被删除

使用索引的技巧

对于小表来说 使用索引对于性能不会有任何提高

当你的索引列中有极多的不同数据和空值时 索引会使性能有极大的提高

当查询要返回的数据很少时(少于全部数据的 %) 索引可以优化你的查询 如果要返回的数据很多时 索引会加大系统开销

索引可以提高数据的返回速度 但它使得数据的更新操作变慢 (对记录和索引进行更新时请不要忘记先删除索引 当执行完更新操作后 恢复索引即可 对于一次特定的操作 系统可以保存删除的索引 个小时 在这个时间内数据更新完成后你可以恢复它 )

索引会占用数据库空间

可以提高归并速度

大多数数据库系统不允许对视图使用索引

不要对经常需要更新或修改的字段创建索引 否则会降低性能

不要将索引与表存储在同一个驱动器上 分开存储会去掉访问冲突从而使结果返回的更快

复合索引

对多个字段进行索引(一个索引包含多个列)

CREATE INDEX ID_CMPD_INDEX ON BILLS( ACCOUNT_ID AMOUNT );尽量将经常在查询中使用的字段放在最前边

复合索引的性能与单个字段的索引相比是无法判定的

创建索引时使用unique关键字

复合索引通常使用unique关键字来防止有相同数据的多个记录多次出现 (oracle 不支持 从 i开始支持)

索引与归并

当查询中使用了复杂的归并时 你的select语句会好用很长时间

在归并时对字段创建索引可以显著得提高查询反应速度 但创建太多的索引 会使性能下降而不是提高

作为一个规 则你应该对表中的唯一属性的字段或你用以归并操作的字段来创建索引

群集(簇)的使用

当 使用群集索引时 数据在表中的物理排序方式会被修改 使用群集索引通常比传统的不使用群集索引速度要快 ORACLE 中群集的概念与此不同 当使用ORACLE 关系数据库系统时 群集就是一个像数据或表一样的对象 群集一般是存储了表的共有字段以提高对表的访问速度

oracle 的例子

CREATE CLUSTER [schema ]cluster (column datatype [ column datatype] )

[PCTUSED integer] [PCTFREE integer] [SIZE integer [K|M] ]

[INITRANS integer] [MAXTRANS integer] [TABLESPACE tablespace]

[STORAGE storage_clause] [!!under!!INDEX | [HASH IS column] HASHKEYS integer]

你随后创建的其于该表的群集的索引会被加入到群集中 然后把表也加入群集中 你应该只将经常需要归并的表加入到群集 不要向群集中加入只需要用简单的SELECT 语句进行个别访问的表

事务处理控制

事务控制

事务控制(事务处理)指关系数据库系统执行数据库事务的能力 (逻辑分组 它有自己的开始和结束)

事务 逻辑上必须完成的一命令序列的单位

单元工作期 事务的开始和结束时期

开始事务处理

SET TRANSACTION {READ ONLY | USE ROLLBACK SEGMENT segment}

可以在下列语句中使用READ ONLY选项 SELECT LOCK TABLE SET ROLE ALTER SESSION ALTER SYSTEM

有些数据库支持SET AUTOMIT [ON | OFF]

结束事务处理

MIT [WORK][ MENT text | FORCE text [ integer] ] ;

MIT (TRANSACTION | TRAN | WORK) (TRANSACTION_NAME)

取消事务处理

这必须是在MIT 之前 ROLLBACK 语句必须在一个事务之中运行 它可以一直撤消到事务的开始

在事务中使用保存点

SAVEPOINT savepoint_name;

ROLLBACK TO SAVEPOINT savepoint_name;

数据库安全

技巧要带着下边的问题去规划你数据库系统的安全性

谁应该得到数据库管理员权限?

有多少个用户需要访问数据库系统?

每个用户应该得到什么样的权限与角色?

当一个用户不再访问数据库时应该如何去删除它?

oracle使用三个结构来实现安全性 用户 角色 权限

用户

CREATE USER user

IDENTIFIED {BY password | EXTERNALLY}

[DEFAULT TABLESPACE tablespace]

[TEMPORARY TABLESPACE tablespace]

[QUOTA {integer [K|M] | UNLIMITED} ON tablespace]

[PROFILE profile]

如 果选择了EXTERNALLY 选项 ORACLE 将会依赖于你登录进入计算机系统的用户名和密码 也就是说当你登录进行计算机时你就已经登录进行了ORACLE 我们推荐你使用IDENTIFIED BY 子句强制用户在登录进行系统时输入密码IDENTIFIED BY PASSWORD

角色

GRANT role TO user [WITH ADMIN OPTION];

REVOKE role from user;

lishixinzhi/Article/program/Oracle/201311/16734


本文标题:oracle中如何用虚表 sql 虚表
标题URL:http://pwwzsj.com/article/hhcgce.html