Oracle

  • 表空间与用户
  • DDL操作
  • 事务
  • 序列
  • 字段约束——主键
  • 字段约束——外键
  • 单行函数——字符函数
  • 单行函数——日期函数
  • 单行函数——数值为空函数
  • 单行函数——decode和case when函数
  • 多行函数
  • 多表联查
  • 多表联查——内连接
  • 多表联查——外连接
  • 多表查询——自查询
  • 子查询
  • 模糊查询
  • oracle与mysql的区别
  • 视图
  • 索引
  • oracle的编程
  • 存储过程
  • 函数
  • 触发器

表空间与用户

Oracle中的一些注意点:

  1. 字段使用两个单词使用下划线做连接:user_id
  2. 表,视图,函数,触发器,存储过程
  1. oracle的表空间:一个数据库建立多个表空间,一个表空间下建立多个用户,一个用户下创建多个表
  2. 系统在创建之初会生成默认的system,sys账号,系统也会有默认的表空间dbf文件(但是登录时无法登录,需要给system账号解锁)
1.让所有登录的用户(主要是system用户)都可以以DBA的身份登录
sqlplus / as sysdba;
2.给system用户解锁
alter user system account unlock;
  1. 创建表空间: 一个表空间可以对应多个数据文件datafile
create tablespace test123 (表空间的名称)
datafile 'E:\app\test123.dbf' (表空间对应的数据文件datafile)
size 100m (表空间的初始大小)
autoextends on (表空间自动增长)
next 10m;(每次自动增长的长度为10)
  1. 查看表空间
select tablespace_name from dba_tablespaces;
  1. 创建用户,新创建的用户没有权限,所以需要授权(grant dba to 用户),oracle中有三种角色:connect,resource,dba
create user c##用户名,c##用于数据加密
idendtified by 密码
default tablespace 表空间
  1. 给角色授权grant gba to 用户名
  2. 总结上述,创建用户之后可以以此用户登录
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;
  1. oracle的数据结构
数据类型
number(总长度,小数) 可以表示为整数和小数
varchar 字符串
varchar2 字符串
data 日期类型
clob 文本类型
blob 二进制数据

DDL操作

  1. 创建表结构
create table ttable(id number(10),name varchar2(20),height number(5,2),birth date);
  1. 插入数据
insert into ttable
values(101,'小明 ',123.4566,to_date('2001-11-01','yyyy-mm-dd'));
  1. 对字段的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;

事务

  1. 事务:从开始到结束完成某一个功能 (转账)完整的过程,系统会自动开启事务,在最后自动commit()提交事务,也可以手动开启(比如转账,从一个账户转走钱,另一个事务接收钱,这整个过程是事务)
  2. 事务的核心:当提交事务时,有一个sql语句失败了,事务回滚rollback(),让整个事务状态回滚到开启事务之前
  3. 事务开启,事务提交,事务回滚
  4. 一条或多条sql语句完成某一个功能的叫事务,像函数和存储过程里的sql语句集就可以开启事务,提交事务
  1. 一条sql语句:delete from user where id=3;这是事务,系统自动开启事务,提交事务
  2. 多条sql语句:转账,这也是事务,必须手动开启事务

序列

  1. 序列:在Oracle中要想实现自增长,必须手动处理,依靠序列实现自增长
  2. 创建序列:create sequence 序列名
  3. 面试题:自增长的前提是这个字段必须是序列
  4. 插入数据实现自增长(序列.nextval
--将id设置为序列
create sequence id;--插入数据实现自增长
insert into ttable(id,name) values(id.nextval,'小明')
  1. 序列的注意事项:
  1. 数据自增的前提是该地段是序列
  2. 多个表同时使用id做序列,他们是共享的
  3. 删除序列数据时,在自增时,自增以最后一次数字开始自增,比如删除2,3,4,下次id会从5号开始
  4. 当插入数据失败,序列也会增长的
  1. 当删除了数据,在自增的时候,自增以最后一次数字开始,比如删除了id为2,3,4,下次的id号从5开始
  2. 当多个表同时有id作为序列,那他们是共享的
  3. 要想序列重新从1开始,先删除序列,再重新将id创建为序列
--删除序列
drop sequence id;
--创建序列
create sequence id;
--插入数据实现序列自增长
insert into ttable(id,name) values(id.nextval,'小明');
--查询数据
select * from ttable;

字段约束——主键

  1. 字段约束——主键,外键,unique
  2. 索引:主键,唯一,index
  3. 在创建表的时候设置主键,特点是非空唯一,不然会有违反唯一约束这种问题,所以一般设置主键为序列,实现自增长

字段约束——外键

  1. 先创建主表再创建从表
  2. 设置主键: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;
  1. 设置外键: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;
  1. 级联删除数据
--级联删除数据
drop table student2 cascade constraints;

单行函数——字符函数

  1. dual是系统提供的伪表,rownum是系统提供的伪列,在tables中是不显示的,用来做占位的,补齐sql语句
  2. as 做别名,as是可以省略的
  3. 字段大写转换upper(字段名)select upper(name) from student
  4. 字段小写转换lower(字段名):select lower('xiaoming') as"姓名" from dual;
  5. 四舍五入round(字段名)

单行函数——日期函数

  1. to_char用来解析日期为具体的年月日,to_char(字段名,'解析格式') as 别名
  2. sysdate是系统的日期
--拿到年
select datedemo 日期,to_char(datedemo,'yyyy') as 年 from test
--拿到星期几
select to_char(datedemo,'day') as 星期 from test;

单行函数——数值为空函数

  1. Oracle中与空做运算,结果为空
select ename,sal*12+comm 年薪 from emp;
  1. nvl函数为了解决如上运算字段为空的问题:nvl(字段,0),将空置为0
select ename,nvl(sal*12+comm,0) 年薪   from emp;,3

单行函数——decode和case when函数

  1. decode(列,【search,result】,【search,esult】)函数相当于switch..case是具体值的比较
--查询ename列,当ename==小明时输出明明
select ename,decode(ename,'小明','明明','小白','白白') 昵称 from emp
  1. 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. 分组查询注意点

1.使用分组函数只能将分组的条件多行函数查询出来(group by后面是什么,select后面就是什么,还可以是多行函数)

--分组
select job,avg(sal),count(job) from emp group by job;
  1. havingwhere一样都是条件查询
  1. having后面的都是函数,必须要跟group by一起使用
  2. where与having在单表查询中无法同时使用,但是当多表时可以同时使用
-- 查询人数大于2个人的部门
select d.dname,count(*)
from dept d,emp e
where d.deptno=e.deptno
group by dname
having count(*)>2;
  1. order by 默认是升序asc,降序是desc

多表联查

  1. 在开发的时候多表查询,当没有条件时,就会出现笛卡尔积的情况,
  2. 内连接也是多表查询 的一种情况
  3. 多表查询之自查询(也是内连接了,相当于主键与外键)
-- 如下可知,e1是员工表,e2是领导表,其实是一张表
select e1.ename,e1.empno,e2.mgr,e2.ename
from emp e1,emp e2
where e1.empno=e2.mgr;
  1. and与or的区别
  1. sal=200 or sal=500等价于sal in(200,500)只满足一个条件就可以输出
  2. and是两个条件同时满足
  1. 每日一练
-- 查询每个员工编号,姓名,部门名称,工资等级和他上级领导的姓名,工资等级
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 ;

多表联查——内连接

  1. 内连接:当主键等于外键,查询出来的结果就叫内连接
-- 多表联查
select d.dname,count(ename)
from dept d,emp e
where e.deptno=d.deptno
group by dname

多表联查——外连接

  1. 外连接oracle哪个表有加号,哪个表就是匹配表,当加号在右表,左表是全部显示,就是左连接(那边是主表,就是什么连接)
  2. 外连接的使用时机:
  1. 内连接的使用:查询部门对应的员工信息(当部门里没有员工时,不会做操作)
  2. 外连接的使用:查询所有部门对应的员工信息
--查询每个部门都有哪些员工,即使没有员工也要输出
--左连接,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

多表查询——自查询

  1. 自查询的多个表是同一个表
-- 查询员工的上级领导的工资
select e1.ename 领导名,e1.sal 领导工资
from emp e1,emp e2 where e1.empno=e2.mgr ;

子查询

  1. 把一个查询的结果作为另一个查询的条件
  2. 查询每个部门的最低工资,最低工资的雇员和部门名称
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

模糊查询

  1. %表示随意的几个字符都行,_表示一个字符
select * from emp where ename like '小%';

oracle与mysql的区别

  1. 自增长oracle设置字段主键自增长,必须设置为序列,mysq设置字段自增长直接设置即可auto_increment(前提是该字段必须是主键,外键,唯一健)
  2. 分页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 
  1. 外连接oracle哪个表有加号,哪个表就是匹配表,当加号在右表,左表是全部显示,就是左连接(那边是主表,就是什么连接)

视图

  1. 视图:虚拟的表,用完就没用了,和表的操作是大同小异
  2. 视图语法
  1. 视图里是不允许字段重复的
  2. 一般不会对视图做修改和删除的
  3. 对视图做修改和删除时,也会对表中的数据有影响,所以一般将视图设置为只读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;

索引

  1. 索引:索引可以加快查询的速度,创建的主键,唯一都是索引
  2. 索引的语法:
--创建索引
create index 序列名 on 表名(字段名)
create index index_emp on emp(job)
  1. 创建带主键的表(也是索引)
--加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的编程

  1. 格式
declare 说明,一般是对变量的说明
begin真正的sql语句dbms_output.put_line('输出的语句')
exceptionwith others then异常处理
end;
  1. 普通的,根据输入的员工的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;
  1. 记录型变量:变量 表名%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;
  1. 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;
  1. 循环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;
  1. for循环
declarenum number(10):=1;
beginfor num in 1 .. 10 loopdbms_output.put_line(num);end loop;
end;
  1. 游标:是为了将数据一条条取出来,
--格式
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;

存储过程

  1. 存储过程:在大型数据库中,用于完成某种功能的sql语句集(和Java中的方法很像,可以在任意的位置上调用)
--创建存储过程
create or  replace procedure hellowordisbegindbms_output.put_line('第一个存储过程');
end helloword;
--调用存储过程(可以本窗口也可以在别的窗口调用)beginhelloword;
end;
  1. 实例:给指定员工涨工资100块(创建存储过程的时候,参数不要加 括号)
  1. 存储过程中的参数:in表示传递进去的参数
  2. 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;

函数

  1. 函数和存储过程就一个区别是函数有return返回值,而存储过程没有,但是函数和存储过程都可以通过out来指定输出参数
  2. 函数的格式
--函数的创建
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;

触发器

  1. 格式
create or replace trigger 触发器名
before/after insert/操作 on 表名
declare
变量名 数据类型;
beginsql语句;
end 触发器名;--做操作的时候就可以触发触发器
  1. 插入员工后打印一句“插入成功”
--创建触发器
create or replace trigger insedataafter insert on emp
declarebegindbms_output.put_line('员工插入成功');
end insedata;
--插入数据
insert into  emp(empno,ename) values(10,'小明明');
  1. 不能在休息时间插入数据
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的简易理解相关推荐

  1. 简易理解设计模式之:责任链模式——OA中请假流程示例

    介绍: 责任链模式属于行为型设计模式.它的定义为:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止. 类图: ...

  2. 1.oracle的dump理解一 BH buffer header

    1.oracle的dump理解一 BH buffer header 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/5122844 ...

  3. oracle数据库报错12154,Oracle客户端简易连接报错ORA-12154,TNS-03505

    Oracle客户端简易连接报错ORA-12154,TNS-03505 环境: 服务端:RHEL6.5 + Oracle Server 11.2.0.4 客户端:Win2003 + Oracle Cli ...

  4. 简易理解设计模式之:桥接模式——穿衣服经典案例2

    介绍: 桥接模式属于结构型模式.它的定义为:将抽象部分与实现部分分离,使它们都可以独立的变化. 类图: Abstraction(抽象化角色):抽象部分,保持对实现部分对象的引用,抽象部分中的方法需要调 ...

  5. 【OpenGl】万向节死锁的简易理解

    [OpenGl]万向节死锁的简易理解 看了一些博文,说的不够容易理解. 我觉得反着理解比较容易.把一些博客里俯仰偏航的顺序倒着来看. 万向节死锁的图片里,旋转顺序绕自身Z(蓝色).自身Y(红色)旋转, ...

  6. oracle 存储过程(分析理解)

    我的理解 比较简单(仅供参考)   存储过程就相当于java里面的方法 简单讲就是一串代码能够实现某个特定的功能,想要使用这个方法直接调用方法名就能够使用他的功能,这就是方法 oracle 存储过程也 ...

  7. oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园

    ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表 use_nl(t1,t2):表示对表t1.t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁 ...

  8. Oracle里schema理解

    在Oracle中,一个用户就是一个Schema,表都是建立在Schema中的,也可以理解为每个用户拥有不同的表.一个用户想访问另外一个用户,也就是另外一个schema的表的时候,可以用 usernam ...

  9. oracle中@,深入理解Oracle中的DBCA

    但凡是学习 过Oracle的同学,DBCA都是一个必备工具,有了这个工具,创建数据库成为可能.而DBCA本身有图形和静默两种方式.静默方式看起来高大上,可以轻松搞定一个看似很复杂的创建数据库过程,而只 ...

最新文章

  1. Docker不再是唯一的选择
  2. the graphics window has detected an error and is not able to ini
  3. 从ngrx store里selector出来的Observable,执行subscribe的单步调试
  4. 算法复习第三章分治法
  5. 如何把Linux的虚拟内存调成0,手把手教您扩展虚拟内存
  6. 二叉树的中序遍历_94. 二叉树的中序遍历 - 中等
  7. git reset hard/soft/mixed区别
  8. BZOJ 1013 球形空间产生器
  9. 我什么时候应该使用访客设计模式? [关闭]
  10. 常用的五种大数据分析方法
  11. Golang unsafe包使用笔记
  12. Linux设置node的process.env.NODE_ENV
  13. 系统架构设计说明书(模板)和概要设计说明书(模板)和详细设计说明书(模板)
  14. JAVA各类基础高级面试题和中间件面试题资料
  15. 缓冲电路/延时上电电路
  16. PHP自学笔记 ---李炎恢老师PHP第一季 TestGuest0.8
  17. 中国移动OMS操作系统厂商播思获1740万美元风投
  18. 怎么还原计算机网络,怎么把网络协议还原为默认设置
  19. 产品720vr全景摄影展示吸引客户主动浏览
  20. 如何使用memset函数

热门文章

  1. java2019常见面试题集总结
  2. 【翻译】ILR-我的Gadgets去哪里了——ILR: Where’d My Gadgets Go?
  3. OpenCV_在图像上添加十字线
  4. nodeJS之路径PATH模块
  5. linux vim界面命令大全,vim命令大全
  6. 学习记录EasyTouch:EasyButton
  7. 西门子s7-200固件升级
  8. c 服务器来源组件,服务器C/S 组件模式的调研
  9. linux开机启动的线程没有log,Linux学习笔记总结
  10. BA、DA、AA、TA参考