Oracle
1.学习目标
2.OracleXE安装
2.1下载(获取)安装包
2.2. 安装服务端
2.2.1. 双击启动安装
2.2.2. 等待检查
2.2.3. 安装向导
2.2.4. 同意协议
2.2.5. 安装目录
2.2.6. 填写密码
2.2.7. 安装
2.2.8. 安装完成
2.3. 测试
安装完成后在程序中会出现一个图标
2.3.1. 点击进入SQL命令行
2.3.2. 输入测试命令 conn sys as sysdba
OK 到此, oracle数据库安装完成
3. 安装客户端
3.1. 双击启动安装
3.2. 准备安装
3.3. 同意协议
3.4. 选择路径
3.5. 安装类型
3.6. 确定安装
3.7. 安装完成
3.8. 测试
4. 数据库–入门
随着互联网时代的到来,需要持久化数据呈现井喷式发
展,常规的 io 操作虽然可以满足持久化的需求,但是,
对于持久化的目的,对数据的操纵,显然力不从心,且
操作的复杂度很大,不利于大规模的发展,审时度势,
数据库应运而生。
数据库(Database)是按照数据结构来组织、存储和管理数
据的 仓库 ;随着信息技术和市场的发展,数据管理不再
仅仅是存储和管理数据,而转变成用户所需要的各种数
据管理的方式。数据库有很多种类型,从最简单的存储
有各种数据的 表格 到能够进行海量数据存储的 大型数据
库系统 都在各个方面得到了广泛的应用。
数据库现在已经成为数据管理的重要技术,也是计算机
的重要分支。由于数据库具有数据结构化,最低冗余
度、较高的程序与数据独立性,易于扩展、易于编制应
用程序等优点,较大的信息系统都是建立在数据库设计
之上的。数据库的运用从一般管理扩大到计算机辅助技
术、人工智能以及科技计算等领域。
随着数据库技术的发展,计算机技术也随着得到了很大
的发展,数据库为我们提供了可以快速存储以及检索的
便利,它也为近几年软件可以如此普及贡献不小的力
量。
常用的数据库有:
4.1. DBMS
数据库管理系统(Database Management System)是一种
操纵和管理数据库的大型软件,用于建立、使用和维护
数据库,简称 DBMS。它对数据库进行统一的管理和控
制,以保证数据库的安全性和完整性。用户通过 DBMS
访问数据库中的数据,数据库管理员也通过 dbms 进行
数据库的维护工作。它可使多个应用程序和用户用不同
的方法在同时或不同时刻去建立,修改和询问数据库。
大部分 DBMS 提供数据定义语言 DDL (Data Definition
Language)和数据操作语言 DML ,供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操
作。
根据存储模型可将数据库划分为关系型数据库和非关系
型数据库。关系型数据库,是建立在关系模型基础上的
数据库,借助于集合代数等数学概念和方法来处理数据
库中的数据。简单来说,关系模型指的就是二维表格模
型,而一个关系型数据库就是由二维表及其之间的联系
所组成的一个数据组织。标准数据查询语言 SQL 就是一
种基于关系数据库的语言,这种语言执行对关系数据库
中数据的检索和操作。
当前主流的关系型数据库有 Oracle、DB2、Microso
4.2. SQL 语言介绍
SQL(Structured Query Language)为数据库的语言,在
1974 年由Boyce【博伊斯】和Chamberlin【钱伯林】提
出的一种介于关系代数与关系演算之间的结构化查询语
言,是一个通用的、功能极强的关系型数据库语言。它
包含三部分:
命令分类操作:
5. 数据库–表
5.1. 表(Table)
5.2. 理解
5.2.1. 表是从属于用户的
查询表(用户名.表名),当前用户查询自己的表时,用
户名.可以省略,其他用户查询 别的用户表 ,不能省
略,同时必须存在权限。
5.2.2. 表是逻辑表(概念表),不是物理表
块(8k) —>区(连续块)–>段(连续区) -->表(多个段) ,数
据段不全是表,表一定是数据段。还有其他段:如索引段
5.3. 表结构
表由表名、字段(名称+类型+约束)、记录 组成。与 java
相对应:
6. Scott 用户表
6.1. 查看用户表
- dept:部门表
- emp:雇员表
- salgrade:工资等级表
- bonus:奖金表
oracle 命令不区分大小写(SELECT 与 select), 存储数据|
内容 区分大小写
6.2. 查看表结构
6.3. 用户表说明
6.3.1. dept 部门表
6.3.2. emp 雇员信息表
6.3.3. salgrade 工资等级表
**6.4. 三范式
在设计数据库时,存在行业的标准,这个标准也称为条
件,即范式 Normal Form。一般遵循三个条件即可,也
就是”三范式”(3NF)。
- 1NF:是指数据库表的每一列都是不可分割的基本数据 项,同一列中不能有多个值,即实体中的某个属性不
能有多个值或者不能有重复的属性。如果出现重复的 属性,就可能需要定义一个新的实体,新的实体由重
复的属性构成,新实体与原实体之间为一对多关系。 在第一范式(1NF)中表的每一行只包含一个实例的 信息。
- 2NF:是在第一范式(1NF)的基础上建立起来的,即 满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必 须可以被唯一地区分。为实现区分通常需要为表加上 一个列,以存储各个实例的唯一标识。如
emp 表中加 上了员工编号(empno)列,因为每个员工的员工编 号是唯一的,因此每个员工可以被唯一区分。这个唯
一属性列被称为主关键字或主键、主码。同时要求实 体的属性完全依赖于主关键字。所谓完全依赖是指不
能存在仅依赖主关键字一部分的属性,如果存在,那 么这个属性和主关键字的这一部分应该分离出来形成
一个新的实体,新实体与原实体之间是一对多的关 系。为实现区分通常需要为表加上一个列,以存储各
个实例的唯一标识。即第二范式就是非主属性非部分 依赖于主键。
-
3NF:必须先满足第二范式(2NF)。3NF 要求一个数 据库表中不包含已在其它表中已包含的非主关键字信
息。例如,存在一个部门信息表,其中每个部门有部 门编号(deptno)、部门名称、地址等信息。那么员
工信息表(emp)中列出部门编号后就不能再将部门名 称、部门地址等与部门有关的信息再加入员工信息表
中。如果不存在部门信息表,则根据第三范式 (3NF)也应该构建它,否则就会有大量的数据冗 余。即第三范式就是属性不依赖于其它非主属性。简而言之,最终的目的避免数据重复冗余,1NF–>列不
可再分最小原子 (避免重复);2NF–>主键依赖(确定唯
一);3NF–>消除传递依赖(建立主外键关联 拆分表);
重新思考Scott 的表设计:
**思考
1、注册模块 --> 设计表
2、网站、软件京东 当当网 团购网微信功能设计表
7. SELECT
解析步骤: from -> where -> select -> order by
7.1. 查询列(字段)
-
select distinct *|字段|表达式 as 别名 from 表 表别名
-
SELECT * FROM 表名; ->查询某个
表中所有的记录的所有字段信息 -
SELECT 列名 FROM 表名; ->查询某个表 中所有的记录的指定字段信息 SELECT
-
列名1,列名2 FROM 表名; -> 查询某个 表中所有的记录的字段1 字段2
-
SELECT distinct 列名 FROM 表名; ->去除重复 记录
-
SELECT 表达式 FROM 表名; ->查询表达式
-
SELECT xxx as 别名 FROM 表名 表别名 ->使用别名
7.1.1. 部分列
查询部分字段,指定的字段名:
7.1.2. 所有列
查询所有的字段 通配符 * ( 书写方便、可以检索未知列;
但是降低检索的性能) ,数据的顺序跟定义表结构的顺序
一致
7.1.3. 去除重复
使用distinct去重,确保查询结果的唯一性
select distinct deptno from emp; --去重
7.1.4. 别名
使用别名便于操作识别 、隐藏底层信息。存在字段别名
和表别名
- as: 字段别名可以使用as;表别名不能使用as
- “”:原样输出,可以存在 空格与区分大小写
7.1.5. 字符串
使用’’表示字符串(注意区分””) ,拼接使用 ||
select 'my' from emp;sql
select ename||'a'||'-->' info from emp;
7.1.6. 伪列
不存在的列,构建虚拟的列
select empno, 1*2 as count,'cmj' as
name,deptno from emp;
7.1.7. 虚表
用于计算表达式,显示单条记录的值
select 1+1 from dual;
7.1.8. null
null 遇到数字参与运算的结果为 null,遇到字符串为空串
select 1+null from dual;
select '1'||null from dual;
select 1||'2'||to_char(null) from dual;
select ename,sal*12+comm from emp;
--nvl内置函数,判断是否为null,如果为空,取默认值0,否
则取字段实际值 select ename,sal*12+nvl(comm,0)
from emp;
7.2. 查询行(记录)
where 过滤行记录条件 ,条件有
a)、= 、 >、 <、 >=、 <=、 !=、 <>、 between and
b)、and 、or、 not、 union、 union all、
intersect 、minus
c)、null :is null、 is not null、 not is
null
d)、like :模糊查询 % _ escape('单个字符')
f)、in 、 exists(难点) 及子查询
7.2.1. 比较条件
= 、>、 <、 >=、 <=、 !=、 <>
select * from emp where deptno !=20;
select * from emp where deptno <>20;
select * from emp where sal between 800 and
950; --between and是成对出现的
--查询 员工的年薪大于20000的 员工名称、岗位 年薪
--1)、nvl
select ename,job,12*(nvl(comm,0)+sal) income
from emp;
--2)、年薪大于20000
--错误不能使用别名: select ename,job,12*
(nvl(comm,0)+sal) income from emp where
income>2000;
--a)、嵌套一个: 查询在前 过滤在后
select ename,job,income from
(select ename,job,12*(nvl(comm,0)+sal) income
from emp) where income>2000;
--b)、不使用别名 (推荐) :过滤在前,查询在后7.2.2. 且 或 非
and、 or、 not
select ename,job,12*(nvl(comm,0)+sal) income
from emp where 12*(nvl(comm,0)+sal) >2000 ;
--了解 any some all
-- >=any(值列表) 大于最小值<=any(值列表)小于最大
值
select * from emp where sal >=any(900,2000);
select * from emp where sal <=any(900,2000);
-- some与any 一样的效果
-- all 大于最大值 小于最小值
select * from emp where sal >=all(900,2000);
select * from emp where sal <=all(900,2000);
--查询 工种为’SALESMAN’的员工信息 (注意 内容区分大
小写)
--检索 工资 大于 2000员工名称 岗位 工资
--检索 工资 小于 3000员工名称 岗位 工资
--检索 工资 2000, 3000员工名称 岗位 工资
--查询部门编号为20的员工名称
7.2.2. 且 或 非
and、 or、 not
select * from emp where sal>=900 and sal<=950;
--查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门
编号,工资
--查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门
编号,工资
--查询 岗位 不是 CLERK 员工名称 部门编号,工资
7.2.3. null
null不能使用条件判断,只能使用is
--存在佣金的员工名称
select * from emp where comm is null;
--不存在佣金的员工名称
select * from emp where comm is not null;
select * from emp where not comm is null;
7.2.4. 集合操作
Union、Union All、Intersect、Minus
- Union,并集(去重) 对两个结果集进行并集操作,不 包括重复行同时进行默认规则的排序;
- Union All,全集(不去重) 对两个结果集进行并集操 作,包括重复行,不进行排序 ;
- Intersect,交集(找出重复) 对两个结果集进行交集操 作,不包括重复行,同时进行默认规则的排序;
- Minus,差集(减去重复) 对两个结果集进行差操作,不 包括重复行,同时进行默认规则的排序
--查询工资大于1500 或 含有佣金的人员姓名
--union 去除重复行
select ename from emp where sal>1500
union7.2.5. like :模糊查询
模糊查询,使用通配符:
%:零个及以上(任意个数的)的字符
_:一个字符
遇到内容中包含 % _ 使用escape('单个字符')指定转义
符
select ename from emp where comm is not null;
-- union all 不去除重复行
select ename from emp where sal>1500
union all
select ename from emp where comm is not null;
--查询显示不存在雇员的所有部门号。
select deptno from dept
minus
select distinct deptno from emp
--查询工资大于1500 且 含有佣金的人员姓名
select ename,sal,comm from emp where sal>1500
intersect
select ename,sal,comm from emp where comm is
not null;
7.2.5. like :模糊查询
模糊查询,使用通配符:
-
%:零个及以上(任意个数的)的字符
-
_:一个字符
-
遇到内容中包含 % _ 使用escape(‘单个字符’)指定转义 符
--查询员工姓名中包含字符A的员工信息
select * from emp where ename like '%A%';
--查询员工姓名中包含第二个A的员工名称信息
select * from emp where ename like '_A%';
--数据中 员工姓名中 存在 _ % ,如何查找:
--1)、编写测试数据
insert into emp(empno,ename,sal)
values(1000,'t_%test',8989); insert into
emp(empno,ename,sal)
values(1200,'t_tes%t',8000);
--2)、查找
--查询员工姓名中包含字符%的员工名称 岗位 工资 部门编号
select ename,job,sal,deptno from emp where
ename like '%a%%' escape('a');
--查询员工姓名中包含第二个_的员工名称 岗位 工资 部门编
号
7.2.6. in 与 exists
in相当于使用or的多个等值,定值集合 ,如果存在 子查
询,确保 类型相同、字段数为1,如果记录多,效率不
高,用于 一些 少量定值判断上
select * from emp where sal in(900,800);
--子查询(查询中再有查询) in 只能存在一个字段
select * from emp where sal in (select sal
from emp e where deptno=10);
--10或30部门的雇员信息exists条件为true,存在记录则返回结果,后续不再继续
比较查询,与查询的字段无关,与记录有关
select * from emp where deptno in(10,30);
--部门名称为 SALES 或 ACCOUNTING 的雇员信息
select deptno from dept where dname
in('SALES','ACCOUNTING'); SELECT *
FROM emp
WHERE deptno IN
(SELECT deptno FROM dept WHERE dname IN
('SALES', 'ACCOUNTING'));
/*
便于理解 使用java思维
while(外层结果集){
while(内层结果集){
if(emp.deptno==10){
syso("....");
}
if(emp.deptno==30){
syso("....");
}
}
}
==>in :如果记录多,效率不高,用于 一些 少量定值判断上
*/
exists条件为true,存在记录则返回结果,后续不再继续
比较查询,与查询的字段无关,与记录有关
--exists :条件为true,存在记录,则返回结果,后续不再
继续 ,与字段无关,与记录有关--exists 难点: 外层结果集 内层结果集 关系列(没有
关系列 true)
/*
while(外层结果集){
while(内层结果集){
if(emp.deptno==dept.deptno||true){
syso("....");
break; //跳出本层
}
}
}
*/
--无关系列
/**
while(emp 的14条记录){
while(dept的2条记录){
if(true){
syso();
break;
}
}
}
*/
select *
from emp
where exists
(select deptno,dname from dept where dname in
('SALES', 'ACCOUNTING'));
--加入关系列/**
while(emp 的14条记录){
while(dept的2条记录){
if(e.deptno=d.deptno){
syso();
break;
}
}
}
*/
select *
from emp e
where exists (select deptno, dname
from dept d
where dname in ('SALES',
'ACCOUNTING')
and e.deptno = d.deptno);
/**
while(emp 的14条记录){
while(dept的2条记录){
if(e.deptno!=d.deptno){
syso();
break;
}
}
}
*/
select *
from emp ewhere exists (select deptno, dname
from dept d
where dname in ('SALES',
'ACCOUNTING')
and e.deptno != d.deptno);
--分析以下结果
select *
from emp e
where not exists
(select deptno, dname
from dept d
where dname in ('SALES',
'ACCOUNTING')
and e.deptno = d.deptno);
select ename, sal
from emp
where sal in (select sal from emp e2 where
e2.sal >= 2000);
select ename, sal
from emp
where exists (select ename, sal from
emp e2 where e2.sal >= 2000); --
exists
select empno, ename, sal
from emp e1
where exists (select empno, ename, sal, comm
from emp e27.2.7. 获取所有行的记录
7.2.8. 排序
使用 ORDER BY 排序,排序不是真实改变存储结构的顺
序,而是获取的集合的顺序。
顺序 :asc(默认) desc
多字段: 在前面字段相等时,使用后面的字段排序
空排序: 降序为 desc,注意 null 为最后
where comm is not null
and e1.empno = e2.empno);
select empno, ename, sal
from emp e1
where exists (select empno, ename, sal, comm
from emp e2
where comm is not null
and e1.deptno = e2.deptno);
7.2.7. 获取所有行的记录
select * from emp;
select * from emp where 1=1 ;
select * from emp where ename like '%';
7.2.8. 排序
使用 ORDER BY 排序,排序不是真实改变存储结构的顺
序,而是获取的集合的顺序。
顺序 :asc(默认) desc
多字段: 在前面字段相等时,使用后面的字段排序
空排序: 降序为 desc,注意 null 为最后
--按工资降序7.3. 作业
1. 使用基本查询语句.
select * from emp order by sal desc;
--null问题
select * from emp order by nvl(comm,0),comm
desc;
select * from emp order by comm nulls first;
--查询雇员姓名,年薪 按佣金排序 默认为升序(asc),降序
为desc,注意null为最后
select ename,(sal+nvl(comm,0))*12,comm total
from emp order by comm desc;
--查询雇员姓名,年薪 按佣金排序 默认为升序(asc),降序
为desc,注意null为最后
select ename,(sal+nvl(comm,0))*12,comm total
from emp order by comm desc;
--对部门编号为 20 或30的雇员,工资+佣金 进行升序排
序,如果相同,则按姓名降序。
--1、查询20、30 雇员
select * from emp where deptno in(20,30);
--2、工资+佣金排序
select ename,sal,comm,sal+nvl(comm,0) c from
emp where deptno in(20,30) order by c;
--3、多个字段排序使用, 排序的字段可以使构建出来的虚拟
的字段
select ename,sal,comm from emp where deptno
in(20,30) order by sal+nvl(comm,0),ename desc;