这篇文章记录了这两天自学oracle的一些笔记然后还有对老师上课的一些总结 然后还有一些自己写的sqll语句 介意初学者可以认真看一下:
Oracle的安装
安装前注意事项:
1.安装前必须要关闭电脑防火墙 2.安装前电脑需要断网 3 一开始安装的时候出现先决条件检查失败解决方法 或者提示安装提示环境不满足最低要求解决方法
oracle安装失败如何处理:
1.正常安装后出现问题
a.执行oracle提供的卸载程序
b.重启电脑进入安全模式(按住F8)
c.找到oracle对应的磁盘,删除oracle文件
d.运行注册表命令“regedit.exe",找到oracle相关文件并删除
2.oracle安装失败
a.重启电脑进入安全模式(按住F8)
b.找到oracle对应的磁盘,删除oracle文件
c.运行注册表命令“register.exe",找到oracle相关文件并删除
安装完成后注意事项:
1.将oracle数据库的TNSListener和ORCL服务修改为手动启动,在使用oracle时再启动服务
安装时:
1.将win64_11gR2_database_2of2\database\stage\Components下的文件复制到win64_11gR2_database_1of2\database\stage\Components
关于安装资源包需要的可以去Oracle官网下载 没有的也可以私信博主
Oracle的一些基本操作(ps:这里我就用我一些平时练习的语句来作为案例了)
--创建用户
create user myadmin identified by my123;
--创建表空间
create tablespace s_table datafile 'D:\s_table.dbf' size 100m;
--给权限
grant connect ,resource to myadmin;
--删除权限
revoke connect , resource from myadmin;
select * from scott.emp;
select t.*, rownum from scott.emp t;
-- 分页
select * from (select t.*,rownum nr from scott.emp t) a where nr between 3 and 4;
select * from (select t.* ,rownum from scott.emp t)a where rownum<2
select t.* ,rownum nr from scott.emp t where rownum <4;
--伪列
select 'a' 第一列 ,'b' from dual;
select 'a' 第一列 ,'b' from dual;
union
select 'c' 第三列 ,'b' from dual;
create table stu(
stu_id number(10),
stu_name varchar2(20),
stu_age varchar2(10)
);
-- 复制表 条件成立 复制表数据 条件不成立 复制表结构
create table stu_1 as select * from stu where 1=1
-- 去重复值
select distinct(stu_age) from stu_1
--年龄出现次数大于 等于 三的信息
select stu_age ,count(stu_age) from stu_1 group by stu_age having count(stu_age) >=3
select * from stu_1
insert into stu
(stu_id, stu_name, stu_age)
values
(1, '小钟','18');
insert into stu
(stu_id, stu_name, stu_age)
values
(2, '小刘','18');
commit;
select * from stu;
--删除
delete stu where stu_name ='小钟';
rollback;--回滚
--添加多行
insert into stu
(stu_id, stu_name, stu_age)
select 3,'彭建','18' from dual
union
select 4,'彭建2','28' from dual
insert into stu
(stu_id, stu_name, stu_age)
select 5,'彭3建','17' from dual
union
select 6,'彭4建','28' from dual;
--添加
commit;
select stu_age ,count(stu_age) from stu where stu_age='18' group by stu_age having count(*)<5;
我个人认为这里其实对于我们这些不是专门学数据库这门语言的人来说只要掌握以下知识点就行了:
--创建表空间
create tablespace tbs_temp1
datafile 'E:\G150831\oreacl\表空间\tbs_temp1.dbf'
size 55m
--创建用户
create user tbs
identified by sa123
default tablespace tbs_temp1
--给用户分配权限(新用户登录给权限)
grant connect,resource to tbs
--收回权限
revoke connect,resource from tbs
--删除
--先删用户
--再删表空间
drop user tbs;
drop tablespace tbs_temp1
Oracle的一些基础操作
我的练习代码
--伪列 rowid(地址) rownum(给行的序号1)
select * from emp;
select t.*,rowid from emp t
select t.*,rownum from emp t
--分页
select * from(
select t.*,rownum nr from emp t
)a where nr between 5 and 8
--前3条 在oracle里没有top关键字 rownum 只能用于小于号
select t.*,rownum from emp t
where rownum<4
--伪表
select 'a' from dual;
select 'a' 第一列,'b' from dual
union
select 'b','c' from dual;
--oracle不区分大小写,每个行代码结束;
--查
--增删改(commit提交)
insert into test_1
(sid, sname, sex)
values
(10, '吓跑张', '男');
insert into test_1
(sid, sname, sex)
values
(11, '吓跑张', '男');
insert into test_1
(sid, sname, sex)
values
(12, '吓跑张', '男');
insert into test_1
(sid, sname, sex)
values
(13, '吓跑张', '男');
commit;--提交服务器 C/S
select sid, sname, sex from test_1
--删除
delete test_1 where sname='吓跑张'
rollback;--回滚
select * from emp where comm is null
select distinct job from emp;
--插入多行
insert into test_1(sid,sname,sex)
select 9,'彭坚','男' from dual
union
select 10,'于红','女' from dual;
--char varchar2 long 字符类型
-- date 时间类型
--number(p,s) p精度,s小数点位数 数值类型
--order by
select * from test_1 order by sid asc;
--where group by having
select sex,count(*) from test_1 where sex='男'
group by sex having count(*)>5
Oracle的一些内置函数
取系统当前时间:sysdate
转换函数
to_char(date,日期格式):将数值型或者日期型转化为字符型。
to_date('...','日期格式'):字符串类型转时间类型
to_number():字符串类型转数字类型
数值函数:
四舍五入函数 round(数据,保留到小数点后几位)
1表示保留到小数点后一位,-1表示保留到小数点前一位。
例:select round(15.36,1) from dual;
截取数值函数 trunc(数据,保留到小数点后几位)
例:select trunc(123.456,1) from dual;
截取到小数点后一位,注意:与round函数不同,不会四舍五入。
字符函数
substr length
字符是大小写敏感的
转小写 lower(字段名)
转大写 upper(字段名)
首字母大写 initcap(字段名)
字符串拼接 concat(字段1, 字段2)
截取子串 substr(字段名, 起始位置,取字符个数)
我的练习代码
-- 获取当前系统时间
select sysdate from dual
-- 打印当前时间 pl-sql写法
begin
dbms_output.put_line(sysdate);
end;
-- 转换函数
--to_char(date ,日期格式);将数值类型或者日期类型 转换Wie字符串类型
select to_char(sysdate,'yyyy"年"mm"月"dd"日"-hh:MM:ss') from dual
--to_date('','日期格式')
select to_date('2019-2-27','yyyy-mm-dd') from dual
--to_number() 字符串转数字
--四舍五入函数 round (数据 ,保留到小数点后的几位)
-- 1 表示保留到小数点后一位 -1 表示保留到小数点前一位
select round(186.672,1) from dual
select round(186.612,-1) from dual
--截取函数 trunc (数据 ,保留到小数点后的几位) 不会四舍五入
select trunc(123.36,1) from dual
Oracle的PL写法
--PL/SQL基本语法
--打印
--变量与赋值
--所有的声明一定要写在begin外面--在PL/SQL语句中select 必须结合into 使用
--%type一个列的类型 %rowtype一行的数据类型
我的练习代码
--PLsql语句
--打印
begin
dbms_output.put('123');
dbms_output.put_line('321');
end;
--变量赋值
--所有的声明都要放在begin end 外
select * from stu
declare a number;
begin
select stu_id into a from stu where stu_name='小钟';
dbms_output.put_line('小钟的学号是:'||a);
end;
--一个select 语句只能写一个into语句
--- 多个变量声明用 ; 隔开
-- 打印一号学员的姓名 性别\
declare name varchar2(20);
age varchar2(20);
begin
select stu_name,stu_age into name,age from stu where stu_id =1;
dbms_output.put_line('一号学员的名字'||name||'年龄:'||age);
end;
--%type一个列的类型 %rowtype一行的数据类型
declare name stu.stu_name%type;
age stu.stu_age%type;
begin
select stu_name,stu_age into name,age from stu where stu_id =1;
dbms_output.put_line(name||'---'||age);
end;
--%rowtype一行的数据类型
--异常:exception
--sqlcode:数据库操作的返回码
--sqlerrm:返回指定错误代码的错误信息。
declare r stu%rowtype;
begin
select * into r from stu ;
dbms_output.put_line(r.stu_name||'---'||r.stu_age||'--'||r.stu_id);
exception
when too_many_rows then
dbms_output.put_line('行太多'||sqlcode||'错误信息'||sqlerrm);
when no_data_found then
dbms_output.put_line('找不到数据');
when others then
dbms_output.put_line('异常');
end;
--if elsif else
declare name stu.stu_name%type;
begin
select stu_name into name from stu where stu_id = 2;
if(name = '小钟')then
dbms_output.put_line('恭喜猜对了');
elsif(name = '小思')then
dbms_output.put_line('很遗憾');
else
dbms_output.put_line('没有这个人') ;
end if;
end;
--case when 条件 then 结果
declare
names stu.stu_name%type;
begin
select stu_name into names from stu where stu_id = 1;
case names
when '小钟' then
dbms_output.put_line('小钟好');
when '小思' then
dbms_output.put_line('小思好');
else
dbms_output.put_line('不是小钟');
end case;
end;
--循环 loop while for
--无条件循环
--1.循环 1-100
--loop end loop;
declare
i number(10);
begin
i := 10;
loop
dbms_output.put_line(i);
i := i + 1;
exit when i > 100;
end loop;
end;
--无条件循环
declare i number;
begin
i:=1;
while(i<10) loop
dbms_output.put_line(i);
i := i + 1;
end loop;
end;
--for
declare i number;
begin
--i:=1;
for i in 10..20 loop--变量的声明在begin外面,开始循环数..结束循环数
dbms_output.put_line(i);
end loop;
end;
declare i number;
begin
for i in 1..100 loop
dbms_output.put_line(i);
end loop;
end;
--打印1-100的偶数
declare i number;
begin
i:=2;
loop
if(mod(i,2)=0)then
dbms_output.put_line(i);
end if;
i:=i+1;
exit when i>100;
end loop;
end;
Oracle的函数的定义和使用
1. 自定义函数:
1.1 无参有返回
--or replace 如果存在该函数就替换
create or replace function tsex
return varchar2 --返回类型无需定义类型长度,无需;
is
tname varchar2(20);
begin
select tname into tname from stu_01 where tid=1;
return tname;
end;
1.2 有参数有返回值
--3.2有参有返回
create or replace function getName(tida number)
return varchar2
as
tname varchar2(20);
begin
select tname into tname from stu_01 where tid=tida;
return tname;
end;
2. 函数的调用
--1.伪表
select tsex from dual;
--2.变量
declare name varchar2(20);
begin
name:=tsex;
dbms_output.put_line(name);
end;
-- 手动输入的值
declare tname varchar2(20);
begin
tname:='&请输入你的姓名:';
dbms_output.put_line(tname);
end;
Oracle 游标
游标
1.隐士游标
--游标
--隐士游标:自动声明,打开,关闭;
--%found:为true,有影响行数
--%notfound:为true,没有影响行数
--%rowcount:返回影响行数
--%isopen:返回游标是否打开,默认为false
begin
update stu_01 set tname='张三' where tid=1;
if(sql%found) then
dbms_output.put_line('修改成功');
dbms_output.put_line(sql%rowcount);
else
dbms_output.put_line('修改失败!');
end if;
end;
select * from stu_01;
2.显示游标
--显示游标
--显示游标 声明cursor open打开 fetch提取 close关闭
declare tn varchar2(20);
cursor yb is --声明游标
select tname from stu_01;
begin
open yb;--打开游标
loop
fetch yb into tn;--提取
exit when yb%notfound;
dbms_output.put_line(tn);
end loop;
close yb;--关闭游标
end;
--根据部门编号查询返回ename
declare en emp.ename%type;--一列类型
dno number;
cursor yb(deptno number) is
select ename from emp where deptno=dno;
begin
dno:='&请输入部门编号:';
open yb(dno);
loop
fetch yb into en;
exit when yb%notfound;
dbms_output.put_line(en);
end loop;
end;
-- 循环游标
declare
cursor yb is select * from stu_01;
begin
for i in yb
loop
dbms_output.put_line(i.tid||'----'||i.tname||'____'||i.tsex);
end loop;
end;
--ref游标 声明游标类型 声明游标变量 打开 提取 关闭
3.REF游标
动态关联结果集的临时对象。
declare type refyb is ref cursor;--声明游标类型
yb refyb;--声明游标变量
r stu_01%rowtype;
begin
open yb for select * from stu_01;--打开游标
loop
fetch yb into r;
exit when yb%notfound;
dbms_output.put_line(r.tname);
end loop;
close yb;--关闭游标
end;
Oracle 同义词 序列 视图
1.同义词
1)公用同义词:由一个特殊的用户组Public所拥有。顾名思 义,数据库中所有的用户都可以使用公用同义词。公用同义 词往往用来标示一些比较普通的数据库对象,这些对象往往 大家都需要引用。
2)私有同义词:它是跟公用同义词所对应,他是由创建他的 用户所有。当然,这个同义词的创建者,可以通过授权控制 其他用户是否有权使用属于自己的私有同义词。
--授权某个用户crate synonym的权限,若用户名为scott
grant create synonym to scott
--撤销scott创建同义词的权限
revoke create synonym from scott;
--创建私有同义词
create synonym syn_name for table_name;
--创建公有同义词
create public synonym syn_name for table_name;
--删除私有同义词
Drop synonym syn_name
--删除私有同义词
Drop public synonym syn_name
--替换同义词
create or replace synonym syn_name for table_name;
2.序列
1)序列是用于生成唯一、连续号的对象
2)序列可以是升序的,也可以是降序的
3)创建:
create sequence 序列名
start with 1 --设置开始值
increment by 1 --设置每次增加数
maxvalue 9999 --设置最大值
minvalue 1 --设置最小值
4)使用:
取下一个值:
select 用户名.序列名.nextval from dual;
取当前值:
select 用户名.序列名.currval from dual;
3.视图
1)创建
create view 视图名
as
select * from 表名
2)删除
drop 视图名
3)修改
4.索引
1)索引是与表相关的一个可选结构,用以提高sql语句的执行性能
2)oracle自动维护索引
练习代码
--同义词:别名
--私有同义词
create synonym stu1 for scott.stu_01;
select * from ss;
delete from ss where tid=6;
select * from stu_01;
--创建公有同义词
create public synonym stu2 for stu_01;
select * from stu2;
--删除私有同义词
drop synonym ss;
Oracle 储存信息和包
1.创建存储过程
语法:
create procedure pro_name[(参数列表)]
is|as
定义当地变量
begin
执行代码块
[异常]
end;
2.包规范
1)包头部
create package 包名
is|as
代码块
end;
2)包主体
create package body 包名
is|as
代码块
end;
select * from emp;
--根据雇员编号打印雇员姓名
create or replace procedure getEname(eno number)
as
myname varchar2(20);
begin
select ename into myname from emp where empno=eno;
dbms_output.put_line(myname);
end;
--调用存储过程
begin
getename(7499);
end;
execute getename(7499);
--根据雇员编号打印姓名,并返回job
create or replace procedure getEjob(eno in out number,ejob out varchar2)
as
myname varchar2(20);
begin
select ename,job,empno into myname,ejob,eno from emp where empno=eno;
--dbms_output.put_line(myname);
end;
--调用
declare ejob varchar2(20);
eno number;
begin
eno:='&请输入编号';
getEjob(eno,ejob);
dbms_output.put_line('职位:'||ejob||'雇员编号:'||eno);
end;
--程序包规范
--程序包主体
Oracle 触发器
1.创建存储过程
语法:
create procedure pro_name[(参数列表)]
is|as
定义当地变量
begin
执行代码块
[异常]
end;
2.包规范
1)包头部
create package 包名
is|as
代码块
end;
2)包主体
create package body 包名
is|as
代码块
end;
练习代码
--触发器
/*1、建立触发器:学生信息表中‘王丽'不能删除、修改;
插入时检查名字叫'张洋洋'的不能添加*/
create or replace trigger t_stu01
after delete or update or insert
on student
for each row
begin
case when deleting then
if(:old.sname='王丽')then
raise_application_error(-20001,'不能删除王丽');
end if;
when updating then
if(:old.sname='王丽')then
raise_application_error(-20002,'不能修改王丽的信息');
end if;
when inserting then
if(:new.sname='张洋洋')then
raise_application_error(-20003,'不能添加张洋洋');
end if;
end case;
end;
--触发器:一段预先编译好的sql代码,自动触发,当进行增删改,自动调用该触发器。
delete from student where sname='王丽'
select * from student;
select * from score;
insert into student
(sno, sname, ssex, sbirthday, class)
values
(110, '张洋洋', '男',TO_DATE('2011-2-24 ','YYYY-MM-DD'), 95031);
/*2、删除表中的学生信息,将成绩也要配套删除*/
create or replace trigger t_stu02
after delete
on student
for each row
declare myno number;
begin
myno:=:old.sno;
delete from score where sno=myno;
end;
delete from student where sno=110;
rollback;
/*3、触发器实现列自增的功能*/
--创建表
create table stu_02(tid number,tname varchar2(20),tsex varchar2(10));
--创建序列
create sequence seq_stu02;
--创建触发器
create or replace trigger t_stu03
before insert
on stu_02
for each row
begin
select seq_stu02.nextval into :new.tid from dual;
end;
insert into stu_02(tname,tsex) values('aa','女');
select * from stu_02;
Oracle 事务和锁
触发器
:new --为一个引用最新的列值;
:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;
事务
set auto on \\开启自动提交
set auto off \\关闭自动提交
set auto imm \\开启即时提交
savepoint 保存点名;\\设置保存点
rollbacke;//回滚
rollbacke to 保存点;\\回滚到指定的保存点
练习代码
select * from stu_02
savepoint a;
insert into stu_02
(tname, tsex)
values
('张三', '男');
savepoint b;
insert into stu_02
(tname, tsex)
values
('李四', '男');
rollback to b;
commit;
delete from stu_02 where tid=21;
rollback;
Oracle 索引
索引:
语法:create index 索引名 on 表名(列名)
Normal:标准索引
Unique:唯一索引
Bitmap:位图索引
创建索引会在表空间创建一个索引页。
提高查询的速度,减少磁盘的I/O(读、写);
表有较多的列,这个列经常被查询。
索引在使用过程中会生成索引碎片,索引是oracle自动维护。
就需要手动维护(删除,再重建)
删除表的时候,索引跟着删除。
tid 设置索引
select * from table where tid>=1000 and tid<=2000;
select * from table;
select * from emp;
empno, 编号
ename, 姓名
job, 工作
mgr, 经理(上级)
hiredate, 入职时间
sal, 基本工资
comm, 佣金
deptno 部门编号