Oracle的简易理解
Oracle
- 表空间与用户
- DDL操作
- 事务
- 序列
- 字段约束——主键
- 字段约束——外键
- 单行函数——字符函数
- 单行函数——日期函数
- 单行函数——数值为空函数
- 单行函数——decode和case when函数
- 多行函数
- 多表联查
- 多表联查——内连接
- 多表联查——外连接
- 多表查询——自查询
- 子查询
- 模糊查询
- oracle与mysql的区别
- 视图
- 索引
- oracle的编程
- 存储过程
- 函数
- 触发器
表空间与用户
Oracle中的一些注意点:
- 字段使用两个单词使用下划线做连接:
user_id
- 表,视图,函数,触发器,存储过程
- oracle的表空间:一个数据库建立多个表空间,一个表空间下建立多个用户,一个用户下创建多个表
- 系统在创建之初会生成默认的system,sys账号,系统也会有默认的表空间
dbf
文件(但是登录时无法登录,需要给system账号解锁)
1.让所有登录的用户(主要是system用户)都可以以DBA的身份登录
sqlplus / as sysdba;
2.给system用户解锁
alter user system account unlock;
- 创建表空间: 一个表空间可以对应多个数据文件
datafile
create tablespace test123 (表空间的名称)
datafile 'E:\app\test123.dbf' (表空间对应的数据文件datafile)
size 100m (表空间的初始大小)
autoextends on (表空间自动增长)
next 10m;(每次自动增长的长度为10)
- 查看表空间
select tablespace_name from dba_tablespaces;
- 创建用户,新创建的用户没有权限,所以需要授权(
grant dba to 用户
),oracle中有三种角色:connect,resource,dba
create user c##用户名,c##用于数据加密
idendtified by 密码
default tablespace 表空间
- 给角色授权
grant gba to 用户名
- 总结上述,创建用户之后可以以此用户登录
1.创建表空间
create tablespace test456 datafile 'E:\app\test456.dbf' size 100m autoextend on next 10m;
2.给表空间创建用户
create user c##heihei identified by 23123 default tablespace test456;
3.给用户授权
grant dba to c##heihei1;
- oracle的数据结构
数据类型 | |
---|---|
number(总长度,小数) | 可以表示为整数和小数 |
varchar | 字符串 |
varchar2 | 字符串 |
data | 日期类型 |
clob | 文本类型 |
blob | 二进制数据 |
DDL操作
- 创建表结构
create table ttable(id number(10),name varchar2(20),height number(5,2),birth date);
- 插入数据
insert into ttable
values(101,'小明 ',123.4566,to_date('2001-11-01','yyyy-mm-dd'));
- 对字段的DDL操作
1.添加字段
alter table ttable add gender varchar2(10);
13. 修改字段,default表示的是默认值
alter table ttable modify gender varchar2(4) default '男';
3.修改字段名
alter table ttable rename column gender to sex;
4.删除字段名(删除的时候总是出现问题)
alter table ttable drop column sex;
事务
- 事务:从开始到结束
完成某一个功能
(转账)完整的过程,系统会自动开启事务,在最后自动commit()
提交事务,也可以手动开启(比如转账,从一个账户转走钱,另一个事务接收钱,这整个过程是事务) - 事务的核心:当提交事务时,有一个sql语句失败了,事务回滚
rollback()
,让整个事务状态回滚到开启事务之前 - 事务开启,事务提交,事务回滚
- 一条或多条sql语句完成某一个功能的叫事务,像函数和存储过程里的sql语句集就可以开启事务,提交事务
- 一条sql语句:
delete from user where id=3;
这是事务,系统自动开启事务,提交事务- 多条sql语句:转账,这也是事务,必须手动开启事务
序列
- 序列:在Oracle中要想实现自增长,必须手动处理,依靠序列实现自增长
- 创建序列:
create sequence 序列名
- 面试题:自增长的前提是这个字段必须是序列
- 插入数据实现自增长(
序列.nextval
)
--将id设置为序列
create sequence id;--插入数据实现自增长
insert into ttable(id,name) values(id.nextval,'小明')
- 序列的注意事项:
- 数据自增的前提是该地段是序列
- 多个表同时使用id做序列,他们是共享的
- 删除序列数据时,在自增时,自增以最后一次数字开始自增,比如删除2,3,4,下次id会从5号开始
- 当插入数据失败,序列也会增长的
- 当删除了数据,在自增的时候,自增以最后一次数字开始,比如删除了id为2,3,4,下次的id号从5开始
- 当多个表同时有id作为序列,那他们是共享的
- 要想序列重新从1开始,先删除序列,再重新将id创建为序列
--删除序列
drop sequence id;
--创建序列
create sequence id;
--插入数据实现序列自增长
insert into ttable(id,name) values(id.nextval,'小明');
--查询数据
select * from ttable;
字段约束——主键
- 字段约束——主键,外键,unique
- 索引:主键,唯一,index
- 在创建表的时候设置主键,特点是非空唯一,不然会有违反唯一约束这种问题,所以一般设置主键为序列,实现自增长
字段约束——外键
- 先创建主表再创建从表
- 设置主键:
constraint cou_pk primary key (cou_id)
-- 主表
create table course(cou_id number(10),cou_name varchar2(30),constraint cou_pk primary key (cou_id))
--创建序列
create sequence cou_id;
--插入数据
insert into course values(cou_id.nextval,'软件182班')
--查询数据
select * from course;
- 设置外键:
foreign key (cou_id) references course (cou_id)
-- 从表
create table student3(stu_id number(10),stu_name varchar2(30),stu_gender varchar2(10),cou_id number(10),constraint student3_pk primary key(stu_id),foreign key (cou_id) references course (cou_id));
-- 创建序列
create sequence stu_id;
--插入数据
insert into student3 values(20182016,'小明','男',1)
--查询数据
select * from student3;
- 级联删除数据
--级联删除数据
drop table student2 cascade constraints;
单行函数——字符函数
dual
是系统提供的伪表,rownum
是系统提供的伪列,在tables
中是不显示的,用来做占位的,补齐sql语句as
做别名,as
是可以省略的- 字段大写转换
upper(字段名)
:select upper(name) from student
- 字段小写转换lower(字段名):
select lower('xiaoming') as"姓名" from dual;
- 四舍五入
round(字段名)
单行函数——日期函数
to_char
用来解析日期为具体的年月日,to_char(字段名,'解析格式') as 别名
sysdate
是系统的日期
--拿到年
select datedemo 日期,to_char(datedemo,'yyyy') as 年 from test
--拿到星期几
select to_char(datedemo,'day') as 星期 from test;
单行函数——数值为空函数
- Oracle中与空做运算,结果为空
select ename,sal*12+comm 年薪 from emp;
nvl函数
为了解决如上运算字段为空的问题:nvl(字段,0)
,将空置为0
select ename,nvl(sal*12+comm,0) 年薪 from emp;,3
单行函数——decode和case when函数
decode(列,【search,result】,【search,esult】)
函数相当于switch..case
是具体值的比较
--查询ename列,当ename==小明时输出明明
select ename,decode(ename,'小明','明明','小白','白白') 昵称 from emp
case when 表达式 then 输出 else 表达式 end
相当于if..else
是确定范围时使用
--当工资在5000-6000时基本满足生活,在7000-8000时生活小康,当大于9000时实现财富自由
select e.ename,e.job,case when e.sal between 5000 and 6000 then '基本满足生活需求'when e.sal between 7000 and 8000 then '达到了小康水平'when e.sal<9000 then '实现了财富自由'else '我是穷逼'end 生活水平
from emp e;
多行函数
函数 | 描述 |
---|---|
count() | 求总数 |
min() | 最小值 |
max() | 最大值 |
avg() | 平均值 |
sum() | 求和 |
- 分组查询注意点:
1.使用分组函数只能将分组的条件和多行函数查询出来(group by后面是什么,select后面就是什么,还可以是多行函数)
--分组
select job,avg(sal),count(job) from emp group by job;
having
和where
一样都是条件查询
- having后面的都是函数,必须要跟group by一起使用
- where与having在单表查询中无法同时使用,但是当多表时可以同时使用
-- 查询人数大于2个人的部门
select d.dname,count(*)
from dept d,emp e
where d.deptno=e.deptno
group by dname
having count(*)>2;
order by
默认是升序asc
,降序是desc
多表联查
- 在开发的时候多表查询,当没有条件时,就会出现笛卡尔积的情况,
- 内连接也是多表查询 的一种情况
- 多表查询之自查询(也是内连接了,相当于主键与外键)
-- 如下可知,e1是员工表,e2是领导表,其实是一张表
select e1.ename,e1.empno,e2.mgr,e2.ename
from emp e1,emp e2
where e1.empno=e2.mgr;
- and与or的区别
sal=200 or sal=500
等价于sal in(200,500)
只满足一个条件就可以输出and
是两个条件同时满足
- 每日一练
-- 查询每个员工编号,姓名,部门名称,工资等级和他上级领导的姓名,工资等级
select e1.empno 员工ID,e1.ename 员工名,d.dname 部门名,decode(sal.grade, 1, '一级',2 ,'二级',3 ,'三级',4, '四级',5 ,'五级',6, '六级') 工资等级,e2.ename 领导名,sal2.grade 领导工资等级
from emp e1,dept d,emp e2,salgrade sal,salgrade sal2
where e1.deptno=d.deptno and e1.mgr=e2.empno and e1.sal
between sal.losal and sal.hisal and e2.sal >sal2.losal and e2.sal<sal2.hisal ;
多表联查——内连接
- 内连接:当主键等于外键,查询出来的结果就叫内连接
-- 多表联查
select d.dname,count(ename)
from dept d,emp e
where e.deptno=d.deptno
group by dname
多表联查——外连接
- 外连接:
oracle
哪个表有加号,哪个表就是匹配表,当加号在右表,左表是全部显示,就是左连接(那边是主表,就是什么连接) - 外连接的使用时机:
- 内连接的使用:查询部门对应的员工信息(当部门里没有员工时,不会做操作)
- 外连接的使用:查询所有部门对应的员工信息
--查询每个部门都有哪些员工,即使没有员工也要输出
--左连接,dept是主表(加号的对面是主表)
select * from dept d,emp e where d.deptno=e.deptno(+);
--右连接,dept是主表
select * from dept d,emp e where e.deptno(+)=d.deptno;--左连接,dept是主表(left左边的是主表,right右边是主表)
select * from dept left join emp on dept.deptno=emp.deptno;
--右连接,dept是主表
select * from emp right join dept on emp.deptno=dept.deptno;
--查询员工的上级领导(当没有领导时就不会输出),多表查询之自查
select * from emp e2,emp e1 where e1.mgr=e2.empno--查询所有员工的上级领导(当没有领导也会输出),多表查询之连接查询
select * from emp e2 right join emp e1 on e1.mgr=e2.empno
多表查询——自查询
- 自查询的多个表是同一个表
-- 查询员工的上级领导的工资
select e1.ename 领导名,e1.sal 领导工资
from emp e1,emp e2 where e1.empno=e2.mgr ;
子查询
- 把一个查询的结果作为另一个查询的条件
- 查询每个部门的最低工资,最低工资的雇员和部门名称
select * from
(select deptno,min(sal) msal from emp group by deptno) memp,emp,dept
--只能用sal作比较的原因是最低工资是确定的,而deptno对应了多个
where memp.msal=emp.sal and memp.deptno=dept.deptno
模糊查询
%
表示随意的几个字符都行,_
表示一个字符
select * from emp where ename like '小%';
oracle与mysql的区别
- 自增长:
oracle
设置字段主键自增长,必须设置为序列,mysq
设置字段自增长直接设置即可auto_increment(前提是该字段必须是主键,外键,唯一健) - 分页:
oracle
设置分页使用rownum
,mysql
设置分页使用limit(一页几条数据,当前是第几条)
select rownum,emp.* from emp order by empno asc;
--写法一:
-- 别名的表必须要设置伪列
select * from (select rownum rn,emp.* from emp where rownum<5) a where a.rn>3
-- 写法二:
select * from (select rownum rn,emp.* from emp) a where a.rn>3 and a.rn<5
- 外连接:
oracle
哪个表有加号,哪个表就是匹配表,当加号在右表,左表是全部显示,就是左连接(那边是主表,就是什么连接)
视图
- 视图:虚拟的表,用完就没用了,和表的操作是大同小异
- 视图语法
- 视图里是不允许字段重复的
- 一般不会对视图做修改和删除的
- 对视图做修改和删除时,也会对表中的数据有影响,所以一般将视图设置为只读
with read only
--创建视图
create or replace view 视图名 as(不是别名,是提取) sql语句 with read only
create or replace view empview as select * from emp with read only --查询视图
select * from 视图名
select * from empview;
索引
- 索引:索引可以加快查询的速度,创建的主键,唯一都是索引
- 索引的语法:
--创建索引
create index 序列名 on 表名(字段名)
create index index_emp on emp(job)
- 创建带主键的表(也是索引)
--加constraint,索引是test1_id_p
create table test1(tid number,constraint test1_id_pk primary key (tid));
--不加constraint,索引是系统默认创建的sys_c007360
create table test2(t2id number,primary key(t2id))
oracle的编程
- 格式
declare 说明,一般是对变量的说明
begin真正的sql语句dbms_output.put_line('输出的语句')
exceptionwith others then异常处理
end;
- 普通的,根据输入的员工的ID获得员工的名字
declaree_empno number(20);e_ename varchar2(30);
begine_empno:= &请输入员工号;select emp.ename into e_ename from emp where e_empno=emp.empno;dbms_output.put_line('查询的员工姓名是'||e_ename);
end;
- 记录型变量:
变量 表名%rowtype
,根据员工的ID获得员工的名字
declaree emp%rowtype;
begine.empno := &请输入员工号;select * into e from emp where e.empno=emp.empno;dbms_output.put_line('查询的员工姓名'||e.ename);
exceptionwhen others thendbms_output.put_line('您请求的编号不存在');
end;
- if语句
declare num number(20);
beginnum := &请输入数字;if num=1 then dbms_output.put_line('我是1');elsif num = 2 then dbms_output.put_line('我是数字2');else dbms_output.put_line('我是个奇葩');end if;
end;
- 循环while…loop
declare xxx
beginwhile 条件 loop操作语句end loop;
end;
declare num number:=1;
beginwhile num<10 loopdbms_output.put_line('我是数字'||num);num:=num+1;end loop;
end;
- for循环
declarenum number(10):=1;
beginfor num in 1 .. 10 loopdbms_output.put_line(num);end loop;
end;
- 游标:是为了将数据一条条取出来,
--格式
cursor 游标名称 is sql语句;
open开启游标
fetch 游标 into 表
--使用游标的方式取出员工的姓名
--游标
declarecursor cr is select * from emp;e1 emp%rowtype;
begin--开启游标open cr;--数据有多条,使用循环loop--当游标notfound时结束exit when cr%notfound;--将游标一条条对应empfetch cr into e1;dbms_output.put_line(e1.ename);end loop;
end;
存储过程
- 存储过程:在大型数据库中,用于完成某种功能的sql语句集(和Java中的方法很像,可以在任意的位置上调用)
--创建存储过程
create or replace procedure hellowordisbegindbms_output.put_line('第一个存储过程');
end helloword;
--调用存储过程(可以本窗口也可以在别的窗口调用)beginhelloword;
end;
- 实例:给指定员工涨工资100块(创建存储过程的时候,参数不要加 括号)
- 存储过程中的参数:
in
表示传递进去的参数out
表示存储过程的输出参数
--创建存储过程
--创建存储过程,给指定工资的员工涨工资100块,参数里面不要加括号
create or replace procedure emp_pro1(eno in number,zsal out number)
is e emp%rowtype;
begin --使用into是因为使用了记录型变量select * into e from emp where emp.empno=eno;e.sal := e.sal+100;update emp set emp.sal=e.sal where emp.empno=eno;zsal := e.sal;
end emp_pro1;--调用存储过程declarezsal number(20) ;num number(20) ;begin num := &输入员工号 ;emp_pro1(num,zsal);dbms_output.put_line('涨工资之后的工资'||zsal);end;
函数
- 函数和存储过程就一个区别是函数有
return返回值
,而存储过程没有,但是函数和存储过程都可以通过out
来指定输出参数 - 函数的格式
--函数的创建
create or replace 函数名(参数名 in 参数类型)
return 返回值类型
is参数名 参数类型;
beginsql语句;
end 函数名;
--函数的调用
declare参数名 参数类型;
begin参数名=函数名(参数名);
end;
--查询指定员工的年薪
--创建函数
create or replace function allsal(num in number)
return number
is yearsal number(10,2);e emp%rowtype;
beginselect emp.* into e from emp where emp.empno=num;yearsal:=e.sal*12+e.comm;return yearsal;end allsal;
--调用函数
declarenum number;sal number(10,2);
beginnum:=&输入员工号;sal:=allsal(num);dbms_output.put_line(sal);end;
--查询指定员工的年薪
--创建存储过程
create or replace procedure yearsal(num in number,allsal out number)
is
--定义参数和函数不同的,在此处无return的参数e emp%rowtype;
beginselect emp.* into e from emp where emp.empno=num;allsal:=e.sal*12+e.comm;
end yearsal;
--调用存储过程
declare num number;allsal number(10,2);
beginnum:=&请输入员工号;yearsal(num,allsal);dbms_output.put_line(allsal);
end;
触发器
- 格式
create or replace trigger 触发器名
before/after insert/操作 on 表名
declare
变量名 数据类型;
beginsql语句;
end 触发器名;--做操作的时候就可以触发触发器
- 插入员工后打印一句“插入成功”
--创建触发器
create or replace trigger insedataafter insert on emp
declarebegindbms_output.put_line('员工插入成功');
end insedata;
--插入数据
insert into emp(empno,ename) values(10,'小明明');
- 不能在休息时间插入数据
create or replace trigger cantbefore insert on emp
declare
weekday varchar2(30);
beginselect to_char(sysdate,'day')into weekday from dual;if weekday='周六'then raise_application_error(-12345,'不能在非法时间插入数据');elsif weekday='周日'then raise_application_error(-12345,'不能在非法时间插入数据');end if;
end;
Oracle的简易理解相关推荐
- 简易理解设计模式之:责任链模式——OA中请假流程示例
介绍: 责任链模式属于行为型设计模式.它的定义为:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止. 类图: ...
- 1.oracle的dump理解一 BH buffer header
1.oracle的dump理解一 BH buffer header 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/5122844 ...
- oracle数据库报错12154,Oracle客户端简易连接报错ORA-12154,TNS-03505
Oracle客户端简易连接报错ORA-12154,TNS-03505 环境: 服务端:RHEL6.5 + Oracle Server 11.2.0.4 客户端:Win2003 + Oracle Cli ...
- 简易理解设计模式之:桥接模式——穿衣服经典案例2
介绍: 桥接模式属于结构型模式.它的定义为:将抽象部分与实现部分分离,使它们都可以独立的变化. 类图: Abstraction(抽象化角色):抽象部分,保持对实现部分对象的引用,抽象部分中的方法需要调 ...
- 【OpenGl】万向节死锁的简易理解
[OpenGl]万向节死锁的简易理解 看了一些博文,说的不够容易理解. 我觉得反着理解比较容易.把一些博客里俯仰偏航的顺序倒着来看. 万向节死锁的图片里,旋转顺序绕自身Z(蓝色).自身Y(红色)旋转, ...
- oracle 存储过程(分析理解)
我的理解 比较简单(仅供参考) 存储过程就相当于java里面的方法 简单讲就是一串代码能够实现某个特定的功能,想要使用这个方法直接调用方法名就能够使用他的功能,这就是方法 oracle 存储过程也 ...
- oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园
ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表 use_nl(t1,t2):表示对表t1.t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁 ...
- Oracle里schema理解
在Oracle中,一个用户就是一个Schema,表都是建立在Schema中的,也可以理解为每个用户拥有不同的表.一个用户想访问另外一个用户,也就是另外一个schema的表的时候,可以用 usernam ...
- oracle中@,深入理解Oracle中的DBCA
但凡是学习 过Oracle的同学,DBCA都是一个必备工具,有了这个工具,创建数据库成为可能.而DBCA本身有图形和静默两种方式.静默方式看起来高大上,可以轻松搞定一个看似很复杂的创建数据库过程,而只 ...
最新文章
- Docker不再是唯一的选择
- the graphics window has detected an error and is not able to ini
- 从ngrx store里selector出来的Observable,执行subscribe的单步调试
- 算法复习第三章分治法
- 如何把Linux的虚拟内存调成0,手把手教您扩展虚拟内存
- 二叉树的中序遍历_94. 二叉树的中序遍历 - 中等
- git reset hard/soft/mixed区别
- BZOJ 1013 球形空间产生器
- 我什么时候应该使用访客设计模式? [关闭]
- 常用的五种大数据分析方法
- Golang unsafe包使用笔记
- Linux设置node的process.env.NODE_ENV
- 系统架构设计说明书(模板)和概要设计说明书(模板)和详细设计说明书(模板)
- JAVA各类基础高级面试题和中间件面试题资料
- 缓冲电路/延时上电电路
- PHP自学笔记 ---李炎恢老师PHP第一季 TestGuest0.8
- 中国移动OMS操作系统厂商播思获1740万美元风投
- 怎么还原计算机网络,怎么把网络协议还原为默认设置
- 产品720vr全景摄影展示吸引客户主动浏览
- 如何使用memset函数