本文由luojingjjx贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
Oracle 教程
引言
SUN 2008 初 10 亿美元收购 MySQL Oracle 2009 年 4 月 74 亿美元收购 SUN
Sun 与 Oracle 合并的未来
1,如果云计算对企业来说变得越来越重要,那么数据将是云计算的核心。 而讲到数据, 也就意味着 数据库。就如塔克商学院数字策略中心主任 M. Eric Johnson 所说的那样,Sun 已经清楚展现了一 个真实的云计算环境。就那些将云计算停留在理论阶段的对手来说,收购 Sun 对 Oracle 来说将获 得竞争优势。
2,Johnson 主任还指出,Sun 在很多需求旺盛的方面“保持领先地位”。Sun 的技术可以帮助数 据库提高性能, 尤其是对大型数据库。 Oracle 和 Sun 的结合之后, 对任何一个信息官来说都具有吸 引力。
3,Oracle 软件和 Java 的紧密结合,使得 Oracle 的软件能跨平台使用。就如 IDC 研究副总 裁 Jean Boz
man 指出那样,真正云计算的第一步是“将服务器和存储单元垂直化”,可以适用于不 同的 硬件平台。凭借 Java,Oracle 可以拓展跨平台的控制力,而这正是企业 IT 部门想要的。实 际上, Oracle 的 Oracle Fusion Middleware 正是基于 Java。
4,有意思的是,Oracle Fusion Middleware 扩大了对服务器的需求, 其中原因正是由于它是基 于 Java。 而现在, Oracle 通过购得 Sun 服务器资源, 可以进一步降低价格, 从而进一步提高 Oracle Fusion Middleware 的竞争力。
5,由于 Oracle 大部分收入来自数据库软件许可,因此有必要的话,可以用便宜的服务器硬件 作为促销的手段,这样对那些硬件服务器竞争对手来说是不小的打击。
6, Sun 已经售出 160 万到 200 万台服务器, 还有更多的运行 Sun Solaris 操作系统的其它公司 的服务器。这对 Oracle 捆绑销售自家产品也很有帮助。
7,Oracle 收购 Sun,当然也包括开源数据库 MySQL。对于那些预算不多但又需要 Oracle 产 品的用户, Oracle 可以用 MySQL 来满足这些用户的需求。 这可以使 Oracle 进入中小企业业 务, 有机会在这方面超过 SAP。此外,还提供了和微软 SQLServer 的竞争产品,而不需要降低 更 Oracle 自有的产品的定位。
-3-
Oracle 教程
Oracle 和 Sun 的合作可能会影响 Oracle 和一些合作伙伴的关系, 比如 Oracle 和惠普的关系 可 能就会出现问题。不过,不像 IBM,事实上,每个硬件公司都绕不开 Oracle,因为它是数据库 的主 力军。他们离不开 Oracle,因此,他们也只能选择忍气吞声。
而且,与 Sun 和 IBM 联合不同,Oracle 和 Sun 不存在硬件的冲突,那些 Sun 的服务器用户 不 必担心合并会导致放弃自己
在使用的服务器产品线。
-4-
Oracle 教程
第一章 数据库基础
1.1、数据库基本概念
数据库(Database, DB) 数据库管理系统(Database Management System, DBMS) 数据库管理员( Database Administrator, DBA) 数据库系 统( Database System, DBS )
1.2、关系型数据库
Q:目前都有哪些主流的关系型数据库 A:Oracle Access Oralce、 DB2、 S IBM M SQL /Server、 SyBase SyBase、 Informix、 IBM MySQL、
Q:XML,TXT 可以做为数据库吗?
1.3、E-R 模型(Entry-Relation)
E-R 模型三要素:实体、关系、属性 实体间联系(1:1)1:n)(n:m) ( Q:学生与课程什么关系?
第二章 Oracle 入门
2.1、Oracle 概述
甲骨文,四大创始人
-6-
Oracle 教程
Larry Ellison 一生最大的目标,财富榜超过 Bill Gate” “ Bruce Scott 已离开 Oralce,创建了一套新的数据库 PointBase
2.2、Oracle 特点
全球化、跨平台的数据库 支持多 用户、高性能的事务处理 强大的 安全性控制和完整性控制 支持分 布式数据库和分布处理
2.3、Oracle 版本
Oracle8i: I internet 表示 Oracle 公司要开始正式进入互联 网 Oracle9i:与 Oracle8i 相关,性能方面更佳, 管理更人 性化 Oracle10g: g(grid)网格技术 Oracle11g: g(grid)网格技术 Q: 何为网格技术? 2009 年 1 月 淘宝网决定采用 Oracle 网格计算(Grid Computing)架构来,采用 Oracle 数据库和 Oracle 真正 应用集来重新打造并强化其基础架构和数据仓库环境
2.4、安装 Oracle 数据库
注意: 1、 安装的时候,一定要关掉防火墙。否则可能造成安装不成功
-7-
Oracle 教程
2、 全局数据库名 SID,类似于 MYSQL 中常用的 localhost. 3、 字符集一定要选择正确。一旦选错,除非更改成该字符集的父类。否则只能重装 4、 安装完主要的用户为: a) 普通用户: Scott/tiger(练习常用) b) 普通管理员:System/system c) 超级管理员:Sys/sys 5、安装完后的服务配置 (运行中输入:services.msc)
开启该服务,会占用 tomcat 的 8080 端 口。 查看端口号:tasklist|findstr "8080" 如果装完 Oracle 后, 又改了机器名可能会导致 Listener 服务无法启动, 解决方式: 修改 C:\oracle\ora92\network\admin\ a 下的 HOST
2.5、卸载 Oracle 数据库
-8-
Oracle 教程
2.6、Oracle 目录(Admin,oracle92,oradata)
Q:这三个文件夹各存放什么文件?
2.7、Oracle 客户端工具
2.7.1、SQLPLUS
2.7.2、SQLPLUSW
2.7.3、Sql Plus WorkSheet 2.7.4、iSqlplus(HTTP)
localhost:7778/isqlplus
2.7.5、PL /SQL Developer
7.14 以上版本,带有自动提示功能
2.7.6、Object Browser
国外用的比较多(日本)
-9-
Oracle 教程
2.8、Scott 案例下表分
析
2.8.1、雇员表:EMP
2.8.2、部门表:Dept
2.8.3、工资等级表:Salgrade
-10-
Oracle 教程 2.8.4、奖金表:Bonus
第三章 查询基础
3.1、入门语句
普通用户连接: Conn scott/tiger 超级管理 员连接: Conn “sys/sys as sysdba” Disconnect; 断开连接 Save c:\1.txt 把 SQL 存到文件 Ed c:\1.txt 编辑 SQL 语句 @ c:\1.txt 运行 SQL 语句 Desc emp; 描述 Emp 结构 Select * from tab; 查看该用户下的所有对象 Show user; 显示当前用户 如果在 sys 用户下:查
询 Select * from emp; 会报错,原因:emp 是属于 scott,所以此时 必 须使用:select * p; / 运行上一条语句
3.2、SQL 简介
SQL 全名是结构化查询语言(Structured Query Language)是用于数据库中的标准数据查 , 询语言, IBM 公司最早使用在其开发的数据库系统中。 1986 年 10 月, 美国 ANSI 对 SQL 进 行规范后,以此作为关 系式数据库 管理系 统的标准语言 (ANSI X3. 1351986),1987 年 得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在 其实践过程中都 对 SQL 规范作了某些编改和扩充。 所以, 实际上不同数据库系统之间的 SQL 语言不能完 全相互通用 DML 语 句 ( 数 据 操作 语 言 ) Insert 、 Update 、 Delete 、 Merge DDL 语句(数据定义语言)Create、Alter、 Drop、 Truncate DCL 语句(数据控制语言)Grant、Revoke 事务控制语句 Commit 、Rollback、Savepoint
-11-
Oracle 教程
3.3、简单的 Select 语句 3.4、使用算术表达式 + - / * 3.5、连接运算符 3.6、使用字段别名 3.7、空值 is null distinct order by asc(desc) > < (!= or <>) between and || as
3.8、去除重复行 3.9、查询结果排序 3.10、比较运算符
3.11、in 操作 not in 3.12、模糊查询
%
like
表示零或多个字符 标识符来查
_ 表示一个字符 对于特殊符号可使用 ESCAPE
select * from emp where ename like '%*_%' escape '*' 上面的 escape 表示*后面的那个符号不当成特殊字符处理,就是查普通的_符号
3.13、逻辑运算符 3.14、练习
or and notorcl 中trunc函数的使用方法
选择在部门 30 中员工的所有信息
Select * from emp where deptno=30;
-12-
Oracle 教程 列出职位为(MANAGER)的员工的编号,姓名
Select empno,ename from emp where job = ?Manager?;
出奖金高于工资的员工
Select * from emp where comm>sal;
出每个员工奖金和工资的总和
Select sal+comm,ename from emp;
出部门 10 中的经理(MANAGER)和部门 20 中的普通员工(CLERK)
Select * from emp where (deptno=10 and job=?MANAGER?) or (deptno=20 and job=?CLERK?);
出部门 10 中既不是经理也不是普通员工,而且工资大于等于 2000 的员工
Select * from emp where deptno=10 and job not in(?MANAGER?,?
CLERK) ? and sal>=2000;
出有奖金的员工的不同工作
Select distinct job from emp where comm is not null and comm>0
出没有奖金或者奖金低于 500 的员工
Select * from emp where comm<500 or comm is null;
显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
select ename from emp order by hiredate ;
-13-
第四章 单行函数
4.1、字符函数
Oracle 教程
Upper
SELECT Upper ('abcde') FROM dual ; SELECT * FROM emp WHERE ename=UPPER('smith') ;
Lower
SELECT lower('ABCDE') FROM dual ;
Initcap
Select initcap(ename) from emp;
Concat
Select concat(?a?,?b?)
from
dual;
Select ?a? || ?b? from dual;
Substr
Select substr(?abcde?,length(?abcde?)-2) from dual; Select substr(?abcde?,-3,3) from dual;
Length
Select length(ename) from emp;
Replace
Select replace(ename,?a?,?A?) from emp;
-14-
Oracle 教程 Instr
Select instr('Hello World','or') from dual; 8 indexof
Lpad
lpad('Smith',10,'*')
左侧填充
lpad() *****Smith
Rpad
rpad('Smith',10,'*')
右侧填充
rpad()Smith*****
Trim
trim('
Mr Smith
')
过滤首尾空格
trim() Mr Smith
4.2、数值函数
Round
select round(412,-2) from dual; select round(412.313,2) from dual;
Mod
Trunc
select trunc(412.13,-2) from dual;
4.3、日期函数
Months_between()
select months_between(sysdate,hiredate) from emp;
Add_months()
select add_months(sysdate,1) from dual;
-15-
Oracle 教程 Next_day()
select next_day(sysdate,'星期一') from dual;
Last_day
select last_day(sysdate) from dual;
4.4、转换函数
To_char
select to_char(sysdate,'yyyy') from dual; select to_char(sysdate,'fmyyyy-mm-dd') from dual; select to_char(sal,'L999,999,999') from emp; select to_char(sysdate,’D’) from dual;//返回星期
To_number
select to_number('13')+to_number('14') from dual;
To_date
Select to_date(?20090210?,?yyyyMMdd?) from dual;
4.5、通用函数
NVL()函数
select nvl(comm,0) from emp;
NULLIF()函数
如果表达式 exp1 与 exp2 的值相等则返回 null,否 则 返回 exp1 的值
NVL2()函数
select empno, ename, sal, comm, nvl2(comm, sal+comm, sal) total from emp;
-16-
Oracle 教程 COALESCE()函数
依次考察各参数表达式,遇到非 null 值即停止并返 回该值。 select empno, ename, sal, comm, coalesce(sal+comm, sal, 0)总收入 from emp;
CASE 表达式
select empno, ename, sal, case deptno when 10 then '财务部' when 20 then '研发部' when 30 then '销售部' else '未知部门' end 部门 from emp;
DECODE()函数
和 case 表达式类似,decode()函数也用于实现多路分支结构 select empno, ename, sal, decode(deptno, 10, '财务部', 20, '研发部',
30, '销售部', '未知部门') 部门 from emp; decode 与
单行函数嵌套
case 哪个更好用呢?
select empno, lpad(initcap(trim(ename)),10,' ')
name, job, sal from emp;
4.6、练习
出每个月倒数第三天受雇的员工(如:2009-5-29)
select * from emp where last_day(hiredate)-2=hiredate;
-17-
Oracle 教程 出 25 年前雇的员工
select * from emp where hiredate<=add_months(sysdate,-25*12);
所有员工名字前加上 Dear ,并且名字首字母大写
select 'Dear ' || initcap(ename) from emp;
出姓名为 5 个字母的员工
select * from emp where length(ename)=5;
出姓名中不带 R 这个字母的员工
select * from emp where ename not like '%R%';
显示所有员工的姓名的第一个字
select substr(ename,0,1) from emp;
显示所有员工,按名字降序排列,若相同,则按工资升序排序 假
设一个月为 30 天,出所有员工的日薪,不计小数
到 2 月份受雇的员工
select * from emp where to_char(hiredate,'fmmm')='2';
列出员工加入公司的天数(四舍五入)
分别用 case 和 decode 函数列出员工所在的部门,deptno=10 显示'部门 10',
deptno=20 显 示 ' 部 门 20' deptno=30 显示'部门 30' deptno=40 显示'部门 40' 否则为'其他部门'
-
18-
Oracle 教程
第五章 分组函数
5.1、COUNT
如果数据库表的没有数据,count(*)返回的不是 null,而是 0
5.2、Avg,max,min,sum 5.3、分组函数与空值
分组函数省略列中的空值 select avg(comm) from emp; select sum(comm) from emp; 可使用 NVL()函数强制分组函数处理空值 select avg(nvl(comm, 0)) from emp;
5.4、GROUP BY 子句
出现在 SELECT 列表中的字段或者出现在 order by 后面的字段, 如果不是包含在分组函数 中,那么该字段必须同时在 GROUP BY 子句中出现。 包含在 GROUP BY 子句中的字段则不必须出现在 SELECT 列表 中。 可使用 where 字句限定查询条件 可使用 Order by 子句指定排序方式 如果没有 GROUP BY
子句,SELECT 列表中不允许出现字 段(单行函数)与分组函数混用的情况。 select empno, sal from emp; //合法 select avg(sal) from emp; //合法 select empno, initcap(ename), avg(sal) from emp; //非法 不允许在 WHERE selectdeptno, avg(sal) from emp where avg(sal) > 2000; group by deptno; 子句中使用分组函数。
5.5、HAVING 子句
select deptno, job, avg(sal) from emp
-19-
Oracle 教程
where hiredate >= to_date('1981-05-01','yyyy-mm-dd') group by deptno,job having avg(sal) > 1200 order by deptno,job;
5.6、分组函数嵌套
select max(avg(sal)) from emp group by deptno;
5.7、练习
分组统计各部门下工资>500 的员工的平均工资、
Select avg(sal) from emp where sal>500 group by deptno ;
统计
各部门下平均工资大于 500 的部门
select deptno,avg(sal) from emp group by deptno having avg(sal)>500 ;
算出部门 30 中得到最多奖金的员工奖金
Select max(comm) from emp where deptno = 30 ;
算出部门 30 中得到最多奖金的员工姓名
select ename from emp where comm = (select max(comm) from emp where deptno=30);
算出每个职位的员工数和最低工资
Select job,min(sal),count(*) from emp group by job;
-
20-
Oracle 教程 算出每个部门,, 每个职位的平均工资和平均奖金(平均值包括没有奖金), 如果平均奖金大于 300, “奖 显示 金不错”如果平均奖金 100 到 300,显示“奖金一般”如果平均奖金小于 100,显示“基本没有奖金” 按部 , , , 门编号降序,平均工资降序排列
Select avg(sal),avg(nvl(comm.,0)) case when avg(nvl(comm.,0))>300 then ? 奖 金 不错 ? when avg(nvl(comm.,0))<100 and avg(nvl(comm,0))>300 then ?奖金不错? end 奖金状况 from emp group by job order by job desc,avg(sal) desc;
列出员工表中每个部门的员工数,和部门 no
Select count(*),deptno from emp group by deptno;
得到工资大于自己部门平均工资的员工信息
select * from emp e1,(select deptno,avg(sal) as avgsal from emp group by deptno) e2 where e1.deptno=e2.deptno and e1.sal > e2.avgsal;
分组统计每个部门下,每种职位的平均奖金(也要算没奖金的人)和总工资(包括奖金)
select deptno,job,avg(nvl(comm,0)),sum(sal+nvl(comm,0)) from emp group by deptno,job;
第六章 多表查询
6.1、笛卡尔集(Cross Join)
Select * from emp,dept;
6.2、等值连接(Equijoin)()
select empno, ename, sal, emp.deptno, dname from emp, dept where emp.deptno = dept.deptno;
6.3、非等值连接(Non-Equijoin)
select ename,empno,grade from emp,salgrade where sal between losal and hisal;
-21-
Oracle 教程
6.4、自连接(Self join)
ame from emp e,emp m = m.empno; ame from emp e,emp m = e.empno;
6.5、左外联接(Left Outer Join )
select s.sid,s.sname,s1.sid,s1.sname from student s,student1 s1 where s.sid=s1.sid(+); select empno,ename,dname from emp left outer join dept on emp.deptno = dept.deptno;
6.6、右外联接(Right Outer Join)
select s.sid,s.sname,s1.sid,s1.sname from student s,student1 s1 where s.sid(+)=s1.sid; select empno,ename,dname from emp right outer join dept on emp.deptno = dept.deptno;
6.7、满外联接(Full Outer Join)
select empno,ename,dname from emp full outer join dept on emp.deptno = dept.deptno; 12 24 36 4 5 内连接 22 44
-22-
Oracle 教程
满连接 1 22 3 44 5 6 左连接
1 22 3 44 5 右连接 22 44 6
6.8、集合操作 ? UNION:并集,所有的内容都查询,重复的显示
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论