-----------书籍: oracle 查询优化改写
-----------第1个“C###oracle”为登录数据库的用户名,第2个“oracleChange”为登录数据库的密码“oracleChange”为欲登录的数据库名称。

/*
create tablespace oracleChange
datafile 'F:\devlopment\databases\oracle\oracleChange\oracleChange.def' size 100M --生成数据文件并定义文件大小
autoextend on next 100M maxsize unlimited logging --设置自动扩展
extent management local autoallocate
segment space management auto;

create user C###oracle identified by oracleChange default tablespace oracleChange quota 500m on users;
---- 这里第一个PERSONNEL_MANAGE为用户名,第二个MWQ为密码,第三个DBSQL为表空间名。然后执行。
grant all privileges to C###oracle;
--- 执行该语句给PERSONNEL_MANAGE用户授权,此时PERSONNEL_MANAGE用户就可以登录了。

---创建 emp员工表
create table emp (
empno number(4) ,
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date ,
sal number(7,2),
comm number(7,2) default 0 ,
deptno number(2) );

-- Add comments to the columns
comment on column emp.empno is '编码';
comment on column emp.ename is '名称';
comment on column emp.job is '工作';
comment on column emp.mgr is '主管';
comment on column emp.hiredate is '聘用日期';
comment on column emp.sal is '工资';
comment on column emp.comm is '提成';
comment on column emp.deptno is '部门编码';
----------------------------------------
----插入数据
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'smith', 'clerk', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'allen', 'salesman', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600, 300, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'ward', 'salesman', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250, 500, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7556, 'jones', 'manager', 7698, to_date('02-04-1981', 'dd-mm-yyyy'), 2975, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'maritn', 'salesman', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250, 1400, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'blake', 'manager', 7839, to_date('01-01-1981', 'dd-mm-yyyy'), 2850, null, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'clark', 'manager', 7839, to_date('09-06-1981', 'dd-mm-yyyy'), 2450, null, 10);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'scott', 'analyst', 7566, to_date('19-04-1987', 'dd-mm-yyyy'), 3000, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'king', 'president', null, to_date('17-11-9181', 'dd-mm-yyyy'), 5000, null, 10);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'turner', 'salesman', 7698, to_date('08-09-9181', 'dd-mm-yyyy'), 1500, null, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'adams', 'clerk', 7788, to_date('23-05-1987', 'dd-mm-yyyy'), 1100, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'james', 'clerk', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950, null, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'ford', 'analyst', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'milier', 'clerk', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300, null, 10);

*/

-----从表中检索部分行 (查询数据时 只需要添加过滤条件即可)
select * from emp where job ='salesman';

----查找空值

select * from emp where comm is null;---null 不支持加减乘除 大小比较 相等比较 否则只能为空
select * from emp where comm is not null;--- 不为空值查询

---将空值转换为实际值
select nvl(emp.comm,0),emp.* from emp where comm is null;---单列 查询
select coalesce(comm,comm) as c ,emp.* from emp where comm is null;

----查找满足多个条件的行
--- 查询 员工表 部门为10 的所有员工、所有得到提成的员工、以及部门为20的工资不超过2000美元的员工;
select *
from emp
where (deptno = 10
or comm is not null
or (sal <= 2000 and deptno = 20));

--- 从表中检索部分列 <在实际开发中;常常只需返回部分需要的列的数据>
select empno ,ename,hiredate,sal from emp where deptno =10;

--- 为列取 有意义的名称
select ename as 姓名 ,deptno as 部门编号 from emp order by 2 ;
----在where子句中引用取别名的列
select * from (select sal as 工资,comm as 提成 from emp ) x where 工资 <1000;

----拼接列
select ename || '的工作是' ||job as msg from emp where deptno =10;
---动态生成 删除表数据的语句
--- select 'truncate table '|| owner ||'.'|| table_name || ';'as 清空表 from all_tables;

----在select 语句中使用条件逻辑
select 档次,count(*) as 人数
from (select (case
when sal <=1000 then '0000-1000'
when sal <=2000 then '1000-2000'
when sal <=3000 then '2000-3000'
when sal <=4000 then '3000-4000'
when sal <=5000 then '4000-5000'
else '好高'
end ) as 档次,ename,sal from emp )
group by 档次
order by 1;

----限制 返回的行数 (rownum 依次返回的每一条数据做一个标识;)
select * from emp where rownum <=2;---取出前2行的数据
select * from (select rownum as sn ,emp.* from emp where rownum <=100) where sn=2;---取出第二行的数据

----从表中随机返回n条记录(先dbms_random 来对数据进行随机排序,然后取其中三行)
select empno,ename from (select empno ,ename from emp order by dbms_random.value())where rownum <=3;
select empno,ename from (select empno ,ename from emp order by dbms_random.value())where rownum <=3;
select empno,ename from (select empno ,ename from emp order by dbms_random.value())where rownum <=3;
select empno,ename from (select empno ,ename from emp order by dbms_random.value())where rownum <=3;
---------等价于下面语句 ---下面语句执行顺序: 1:select 2:rownum 3:order by ;即:先取出数据 然后生成序号 最后才是排序
select empno ,ename,dbms_random.value ran from emp where rownum <=3 order by ran;

-----模糊查询 like '% 表示任意数量的字符' '_表示任意一个字符' 'M 表示任意长度的字符'
---创建视图
create or replace view empView1 as
select 'abcedf' as vname from dual
union all
select '_bcefg' as vname from dual
union all
select '_bcedf' as vname from dual
union all
select '_\bcedf' as vname from dual
union all
select 'xyceg' as vname from dual ;
--- 要求1:查出vname 中包含字符串 ’ced‘的
select * from empView1 where vname like '%ced%';
--- 要求2:查出vname z中包含字符串“_bce” 的
select * from empView1 where vname like '\_bce%' escape '\'; ---注:escape 把'\'标识为转义字符 ;而'\'把'_'转义为'字符';而非其原意

-----以指定的次序返回查询结果
---实际提取数据或者生产报表时;一般是根据一定顺序查看
---如:查看单位所有员工信息
select empno,ename,hiredate from emp where deptno=10 order by hiredate asc;
select empno,ename,hiredate from emp where deptno=10 order by 3 asc; ---该写法 中的数字只能出现在order by 中
------
select empno ,ename,sal from emp where deptno=10 order by 3 asc;---
select empno,ename ,sal from emp where comm is not null order by 3 asc;
----注:如果order by 后使用的列名 就需要注意前后保持一致;否则开发中带来些 小麻烦

--- 按多个字段排序、 ordey by desc/asc/number
---按部门编号升序并按工资降序排序
select empno ,deptno ,ename,job from emp order by 2 asc,3 desc;
-----按子串排序
select last_name as 名称,
phone_number as 号码,
substr(phone_number, -4) as 尾号
from hr.employees
where rownum <= 5
order by 4;

----translate
---translate(expr,from_string,to_string) --from_string to_string 以字符为单位 对应字符一一替换
select translate('ab您好!bcadefg','abcdefg','1234567890') as new_str from dual;
---如果to_string 为空 则返回空值
select translate('ab您好!bcadefg','abcdefg','') as new_str from dual;
---如果to_string 对应的位置没有字符,删除from_string 中列出的字符
select translate('ab您好!bcadefg','abcdefg','1') as new_str from dual;

----按数字和字母混合字符串中的字母排序
create or replace view numberView
as
select empno || '' || ename as data from emp;

---- 查看视图
select * from numberView;
---要求:按其中字母排序
select nv.data ,translate(nv.data,'-1234567890','-') as ename from numberView nv order by 2;
select nv.data from numberView nv order by translate(nv.data,'-1234567890','-');

---处理排序空值
select ename,sal,comm,nvl(comm,-1) order_col from emp order by 4 asc;
select * from emp order by nvl(comm,-1) desc;
---使用关键字 nulls first; nulls last
select *  from emp order by comm nulls first;
select * from emp order by comm nulls last;

oracle 查询优化改写的更多相关文章

  1. 《Oracle查询优化改写技巧与案例》学习笔记-------使用数字篇

    一个系列的读书笔记,读的书是有教无类和落落两位老师编写的<Oracle查询优化改写技巧与案例>. 用这个系列的读书笔记来督促自己学习Oracle,同时,对于其中一些内容,希望大家看到以后, ...

  2. 【书评:Oracle查询优化改写】第14章 结尾章

    [书评:Oracle查询优化改写]第14章 结尾章 一.1  相关参考文章链接 前13章的链接参考相关连接: [书评:Oracle查询优化改写]第一章 http://blog.itpub.net/26 ...

  3. 【书评:Oracle查询优化改写】第五至十三章

    [书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...

  4. 【书评:Oracle查询优化改写】第四章

    [书评:Oracle查询优化改写]第四章 BLOG文档结构图 一.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① check的 ...

  5. 【书评:Oracle查询优化改写】第三章

    [书评:Oracle查询优化改写]第三章 BLOG文档结构图       导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 隐含参数 ...

  6. 【书评:Oracle查询优化改写】第二章

    [书评:Oracle查询优化改写]第二章 BLOG文档结构图 在上一篇中http://blog.itpub.net/26736162/viewspace-1652985/,我们主要分析了一些单表查询的 ...

  7. 《 Oracle查询优化改写 技巧与案例 》电子工业出版社

    第1章单表查询 11.1 查询表中所有的行与列 11.2 从表中检索部分行 21.3 查找空值 31.4 将空值转换为实际值 41.5 查找满足多个条件的行 51.6 从表中检索部分列 61.7 为列 ...

  8. Oracle查询优化改写--------------------报表和数据仓库运算

    一.行转列 二.列传行 '

  9. Oracle查询优化改写--------------------高级查询

    一.给结果集分页 二.重新生成房间号 三.跳过表中n行 四.排列组合去重

随机推荐

  1. ubuntu主机名修改

    1.查看主机名 在Ubuntu系统中,快速查看主机名有多种方法: 其一,打开一个GNOME终端窗口,在命令提示符中可以看到主机名,主机名通常位于"@"符号后: 其二,在终端窗口中输 ...

  2. bzoj1012: [JSOI2008]最大数maxnumber [单调队列]

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  3. Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑

    先来看一个例子: package com.test; public class calculate { /** * 光速30万公里/秒 */ public static final int LIGHT ...

  4. 走进json

    纯做笔记,请多指教... 1,json格式: 非数组: {"key" : "value"} 数组:[{"key" : "value ...

  5. (转)盒子概念和DiV布局

    CSS盒子和DIV布局 (2013-11-24 16:17:29) 转载▼ 一.认识div层 1.<DIV>标记是一个区块容器标记,在标记之间可以放置其他一些HTML元素,例如p,h1,t ...

  6. (转)Apache与Tomcat 区别联系

    Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. Apache是web服 ...

  7. HDU - 3697 Selecting courses

    题目链接:https://vjudge.net/problem/HDU-3697 题目大意:选课,给出每门课可以的选课时间.自开始选课开始每过五分钟可以选一门课,开始 时间必须小于等于四,问最多可以选 ...

  8. Jvm垃圾收集器和垃圾回收算法

    概述: 目前内存的动态分配和内存的回收技术已经相当成熟,一切看起来都已经进入了“自动化”时代,为什么还要去了解GC和内存分配呢?原因很简单:当需要排查各种内存泄漏.内存溢出问题时,当垃圾收集器成为系统 ...

  9. VMware workstation虚拟集群实践(1)—— 配置集群多节点互信

    一. 简述 节点互信,是集群管理的基本操作之一.节点互信是通过SSH协议的公钥密钥认证来代替密码认证来实现的.对于单点批量管理多个节点,多个节点之间相互通信来说,配置SSH单方向信任,或者互信十分必要 ...

  10. 如何将R包安装到自定义路径

    参考  设置环境变量R_LIBS将R包安装到自定义路径   实际上是可以解决问题的, #环境变量完成以后,启动(重启)R,运行 .libPaths() 加载R包时,发现路径仍然未变成自定义的. 那么参 ...