oracle入门学习之oracle数据库结构
1. oracle数据库结构
1.1 Oracle可以看做是一个大的数据库???,里面可以创建很多实例;
一个实例对应多个表空间、多个用户;
一个用户只能有一个表空间;
一个表空间可以有多个用户;
一个用户只能看到自己建的表;
1.2 表空间,用户创建
-- 创建表空间
create tablespace myspace --创建myspace的表空间,并将其关联的物理文件保存到
datafile 'c:\mydata.dbf' --c:\mydata.dbf该文件中,初始大小为100M,以后每次扩展
size 100m --10M.
autoextend on
next 10m
-- 创建用户
create user cater
identified by rsx123
default tablespace myspace
-- 用户授权
grant dba to cater
2. 数据类型,约束,序列
2.1数据类型
2.1.1数值型 NUMBER
整数 number(2) 88
小数number(2,1) 8.8
2.1.2 字符型
Char 固定长度 <=2000
Varchar2 可变长度 <=4000
Long 大文本 <=2G
2.1.3 日期型
DATE 精确到秒
TIMESTAMP 精确到秒后9位
当前日期 sysdate
日期运算
日期 +- 数字 = 日期
Select (sysdate + 3) from dual;
日期 +- 日期 = 数字(天数)
2.1.4 二进制
CLOG 存储字符数据 <= 4G
BLOG 存储视频,音频等 <=4G
2.2 约束
2.2.1 主键 primary key
2.2.2 唯一 unique
2.2.3 非空 not null
2.2.4 检查 check
例如:插入数据时性别只能在0,1中取值
Create table t_check_test(
"ID" number primary key,
"NAME" varchar2(30) not null,
"SEX" number(1) check(SEX in(0,1))
);
2.2.5 外键 foreign key
2.3 序列
序列的创建与使用常用于主键
Create sequence seq_test; --创建序列
select seq_test.nextval from dual; --序列中下一个值
select seq_test.currval from dual; --序列中的当前值常用函数
创建序列的完整语法
CREATE SEQUENCE 序列名
[INCREMENT BY n] --每次增长n
[START WITH n] --从n开始取值
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --最大最小值
[{CYCLE|NOCYCLE}] --循环
[{CACHE n|NOCACHE}];--缓存序列值的个数
3. 常用函数
3.1 字符
Substr 截取
Select substr(‘abcdefg’,2,3) from dual; --bcd 起始索引号为1
Concat 拼接
select concat('abc','def') from dual;
Length 长度
select length('abcdefg') from dual;
3.2 数值
Round 四舍五入
select round(2.5) from dual; --3
Trunc 取整
select trunc(2.99) from dual; --2
Mod 取余
select mod(11,4) from dual; --3
3.3 转换
To_char 转换为字符
日期-->字符
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
数字-->字符
Select to_char(2) from dual;
To_number 转换成数字
字符-->数字
Select to_number('12.03') from dual;
To_date 转换成日期
字符-->日期
Select to_date('2018-05-31 15:12:31','yyyy-mm-dd hh24:mi:ss') from dual;
--2018/5/31 15:12:31
3.4 日期
Month_between(date1,date2) 两个日期间隔的月数
Add_month(date,n) 在日期的基础上增加n个月
3.5 通用
Nvl(字段,替代值) 空值处理
Select name, nvl(tele,’未填写’) from person; -- tele为空值时,返回’未填写’
Decode 条件判断
语法:DECODE(col/expression, [search1,result1],[search2, result2]....[default])
Col/expression:列名或表达式
Search1,search2...:用于比较的条件
Result1, result2...:返回值
Select name,decode(sex,1,’男’,0,’女’) from person;
--sex字段值为1则返回男,为0返回女
3.6 聚合
Count 统计
Sum 求和
Avg 平均值
Min/max 最大/最小值
4. 高级查询
4.1多表关联查询
4.1.1内连接
select ct.name,c.name,c.opendate,s.name
from t_class c ,t_student s,t_class_type ct
where c.id = s.classid
and ct.id = c.type;
4.1.2外连接(两种形式)
--sql1999语法
select s.name,m.score from t_student s left join t_mark m
on s.id = m.studentid;
--oracle语法
select s.name,m.score from t_student s , t_mark m
where s.id = m.studentid(+);
内外连接区别:当与之关联的表没有数据时,内连接查询”主从表”都不会显示;外连接显示”主表”数据,”从表”如果没有数据则显示为空;
4.2分组统计
select co.id,co.name,round(avg(m.score),1) 平均分
from t_mark m,t_course co
where m.courseid = co.id
group by co.id,co.name
having round(avg(m.score),1) > 55
order by round(avg(m.score),1);
-- 分组后的条件不能小于查询字段
4.3子查询
-- 查询每门课程最高分
select co.name,h.maxscore from t_course co,
(select m.courseid id ,max(m.score) maxscore
from t_mark m group by m.courseid ) h
where co.id = h.id;
-- in 查询缺考学生及课程名
select s.name,co.name
from t_student s,t_course co
where s.id not in(
select distinct m.studentid from t_mark m
);
4.4分页排序查询(三层嵌套)
select * from ( --第三层分页
select a.* ,rownum r from( -- 第二层加rownum
select * from t_mark m order by m.score desc --第一层:排序
) a)
where r >= 5 and r <= 10 ;
5. 视图
特点:
隔离基表的改变;
简化了sql命令;
视图中的数据被修改,基表中的数据也会被修改;
语法:
Create view 视图名 as
sql语句;
create view v_student as
select * from t_student where sex=1;
select * from v_student;
--更新视图后,表中的数据也会相应改变;
update v_student set tele='19911112222' where ID=7;
只读视图:
Create view v_student as
Select * from t_student where edu=’本科’ with read only;
6. 索引
6.1索引结构
索引也是需要占用存储空间,并消耗性能的,因此创建合理的索引才能提高性能;
索引的结构为树形结构,每个节点存储rowid(每条记录的物理地址);
6.2索引创建,复合索引
语法:create index 索引名 on 表名(字段名);
Create index index_student_name on t_student(name);
复合索引:
Create index index_student_sex_name on t_student(sex,name);
--需要查询两个索引树,性能不一定能有提高;
7. Plsql语法
7.1语法结构
[declare
--声明变量
]
Begin
--代码逻辑
[exception
--异常处理
]
End;
7.2常量与变量
变量:
变量名 数据类型(长度)
两种赋值方式:
:=
Select into
常量:
常量名 constant 数据类型(长度) := value --常量声明时必须赋值
Eg:
Declare
v_name varchar2(30);
V_tele varchar2(30);
V_constant constant number := 100;
Begin
Select name,tele into v_name,v_tele from t_student where id=5;
DBMS_OUPUT.put_line(v_name||v_tele||v_constant); --输出在会话框
End;
7.3属性类型
引用类型 %type
变量名 表名.字段名%type -- 该变量的类型就是该字段的类型
记录型 %rowtype
变量名 表名%rowtype
Declare
v_name t_student.name%type;
V_student t_student%rowtype;
Begin
v_name:=’小明’;
Select * into v_student from t_student where id=5;
DBMS_OUTPUT.put_line(v_student.name||v_student.tele);
End;
7.4条件判断
语法1:
If 条件 then
--业务sql
Else
--业务sql
End if;
语法2:
If 条件 then
--业务sql
Elsif 条件 then
--业务sql
Else
--业务sql
End if;
7.5循环
语法1:无条件循环
Loop
--业务sql
Exit when 结束条件;
End loop;
语法2:有条件循环
While 条件(结束条件)
Loop
--业务
End loop;
语法3:for循环
For 变量 in 起始值..结束值 ---变量不用在declare中声明
Loop
--业务
End loop;
8. 异常
8.1预定义异常
Oracle 21个预定义异常
命名的系统异常产生原因
ACCESS_INTO_NULL未定义对象
CASE_NOT_FOUNDCASE中若未包含相应的WHEN,并且没有设置ELSE时
COLLECTION_IS_NULL集合元素未初始化
CURSER_ALREADY_OPEN游标已经打开
DUP_VAL_ON_INDEX唯一索引对应的列上有重复的值
INVALID_CURSOR在不合法的游标上进行操作
INVALID_NUMBER内嵌的SQL语句不能将字符转换为数字
NO_DATA_FOUND使用select into未返回行,或应用索引表未初始化的元素时
TOO_MANY_ROWS执行select into时,结果集超过一行
ZERO_DIVIDE除数为0
SUBSCRIPT_BEYOND_COUNT元素下标超过嵌套表或VARRAY的最大值
SUBSCRIPT_OUTSIDE_LIMIT使用嵌套表或VARRAY时,将下标指定为负数
VALUE_ERROR赋值时,变量长度不足以容纳实际数据
LOGIN_DENIEDPL/SQL应用程序连接到oracle数据库时,提供了不正确的用户名或密码
NOT_LOGGED_ONPL/SQL应用程序在没有连接oralce数据库的情况下访问数据
PROGRAM_ERRORPL/SQL内部问题,可能需要重装数据字典&pl./SQL系统包
ROWTYPE_MISMATCH宿主游标变量与PL/SQL游标变量的返回类型不兼容
SELF_IS_NULL使用对象类型时,在null对象上调用对象方法
STORAGE_ERROR运行PL/SQL时,超出内存空间
SYS_INVALID_ID无效的ROWID字符串
TIMEOUT_ON_RESOURCEOracle在等待资源时超时
Declare
v_name t_student.name%type;
V_student t_student%rowtype;
Begin
Select name into v_name from t_student where id<0;
Select * into v_student from t_student where id>1;
Exception
When no_data_found then
DBMS_OUTPUT.put_line(“未返回行”);
When too_many_rows then
DBMS_output.put_line(“结果集超过一行”);
End;
8.2自定义异常
语法:(声明区)
自定义异常名 exception;
pragma Exception_init(自定义异常名,错误编号);
Declare
Error_check exception;
Pragma exception_init(error_check,-2290);
Begin
--业务
Exception
When error_check then
--异常处理
End;
9. 游标
9.1语法结构
Declare
v_values 数据类型;
Cursor 游标名[(字段数据类型)] is sql语句;
Begin
Open 游标名[(值)];
Loop
Fetch 游标名 into v_values;
Exit when 游标名%notfound;
---业务处理
End loop;
Close 游标名;
End;
9.2循环取值
方式1:
declare
v_student t_student%rowtype; --接收游标中的值
cursor cur_student(v_sex number) is select * from t_student where sex=v_sex;
begin
open cur_student(1);
loop
fetch cur_student into v_student;
exit when cur_student%notfound;
Dbms_Output.put_line(v_student.NAME||v_student.EDU||v_student.TELE);
end loop;
close cur_student;
end;
方式2:(推荐)
declare
cursor cur_student(v_sex number) is select * from t_student where sex=v_sex;
begin
for v_student in cur_student(1) --v_student for循环自己定义
loop
Dbms_Output.put_line(v_student.NAME||v_student.EDU||v_student.TELE);
end loop;
end;
9.3隐式游标
默认隐式游标 SQL
可通过SQL的属性值来判断sql语句的执行结果
%notfound 刚才的sql语句没有影响到行
%found 刚才的sql语句影响到了行
begin
update t_student set name='小明' where ID=500;
if SQL%notfound then
DBMS_OUTPUT.put_line('sql执行失败');
end if;
if SQL%found then
DBMS_OUTPUT.put_line('sql执行成功');
end if;
commit;
end;
9.4系统引用游标
declare
v_student t_student%rowtype;
v_cursor sys_refcursor;
begin
open v_cursor for 'select * from t_student';
loop
fetch v_cursor into v_student;
exit when v_cursor%notfound;
dbms_output.put_line(v_student.name);
end loop;
close v_cursor;
end;
10. 存储过程
10.1语法结构
CREATE [ OR REPLACE ] PROCEDURE 存储过程名称
(参数,参数,参数) --输出参数必须声明out
IS|AS
变量声明部分;
BEGIN
逻辑部分
[EXCEPTION
异常处理部分]
END;
10.2应用
--判断班级是否满员(每个班最多20人),如果满员返回“此班已满员”
--如果输入的数据违反检查约束,则返回“违反检查约束”
create or replace procedure pro_student_add(
v_name varchar2,
v_sex number,
v_edu varchar2,
v_tele varchar2,
v_cardno varchar2,
v_classid number,
v_id out number,
v_msg out varchar2
)
as
v_count number;
err_check exception;
pragma exception_init(err_check ,-2290 );
begin
v_id:=-1;
--查询班级的人数
select count(1) into v_count from t_student
where classid=v_classid;
if v_count>=20 then
v_msg:='此班级已经爆满';
else
select seq_student.nextval into v_id from dual;
insert into t_student values(
v_id,
v_name,
v_sex,
v_edu,
v_tele,
v_cardno,
v_classid
);
commit;
v_msg:='添加成功';
end if;
exception
when err_check then
v_msg:='违反检查约束';
end;
10.3游标与存储过程
create or replace procedure pro_student_list(
v_list out sys_refcursor
)
as
begin
open v_list for select * from t_student;
end;
declare
v_student t_student%rowtype;
v_cursor sys_refcursor;
begin
pro_student_list(v_cursor);
loop
fetch v_cursor into v_student;
exit when v_cursor%notfound;
dbms_output.put_line(v_student.name);
end loop;
end;
11. 存储函数
11.1存储函数与存储过程
存储函数只能有一个返回值,存储过程可以有多个;
存储函数一般被sql语句调用,存储过程一般被应用程序调用;
11.2语法结构
Create function 函数名(参数1,参数2,...)
Return 数据类型
As
--声明
Begin
--业务处理
Return 返回值
End;
create function getStudentNamebyId(v_id number)
return varchar2
as
v_r_name varchar2(30);
begin
select name into v_r_name from t_student where ID=v_id;
return v_r_name;
end;
select getStudentNameById(studentid),round(avg(score),1) from t_mark
group by studentid;
12. 触发器
数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。
12.1语法结构
CREATE [or REPLACE] TRIGGER 触发器名
BEFORE | AFTER
[DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]
ON 表名
[FOR EACH ROW [WHEN(条件) ] ]
declare
……
begin
PLSQL 块
End ;
FOR EACH ROW 作用是标注此触发器是行级触发器,否则是语句级触发器
在触发器中触发语句与伪记录变量的值
触发语句:old:new
Insert所有字段都是空(null)将要插入的数据
Update更新以前该行的值更新后的值
delete删除以前该行的值所有字段都是空(null)
12.2 前置后置
前置:
---每次往t_class中插入数据时,主键自增
create or replace trigger tri_insert_class
before --操作前
insert
on t_class
for each row --每行起作用
declare
v_seq number; --序列值
begin
--select seq_class.nextval into v_seq from dual;
--:new.id:=v_seq;
--可简写成
select seq_class.nextval into :new.id from dual;
end;
后置:
---更新t_student后将更新信息记录到t_edu_log表中
create or replace trigger tri_student_edu_update
after
update of edu
on t_student
for each row
declare
begin
--:old :new
insert into t_edu_log values (seq_log.nextval,sysdate,
:old.id,:old.edu,:new.edu
);
end;
oracle入门学习之oracle数据库结构的更多相关文章
- Oracle入门学习笔记
参考文献 中文教程 http://wenku.baidu.com/view/b425f404e87101f69e319566.html 经典教程 http://wenku.baidu. ...
- oracle 10g 学习之oracle管理(3)
怎样将预先写好的sql脚本执行? select * from employees;→107条记录 利用 Oracle 企业管理器连接数据库服务器 点击打开以下界面: 此时已经连接成功了 用 Oracl ...
- MyBatis入门学习-连接oracle实现CURD基本操作
目录 前言 导入oracle库 配置 环境配置 配置引用 配置映射 查询 单条件查询 多条件查询 通过类字段传递参数 通过Map接口传参 Param注解 插入 更新 删除 字段映射 参考文献 前言 本 ...
- Oracle 入门学习笔记
linux命令 查看linux系统版本号 uname -r 或 uname -a 查看linux发行版本号 cat /etc/redhat-release 查看linux具体版本号 cat /proc ...
- oracle上课 学习2 oracle 游标 存储过程 有用
1.1. 训练描述 使用游标,打印emp中20号部门的所有员工的信息 操作步骤答案 declare cursor c_emp is select * from emp where deptno=10 ...
- 【转】MYSQL入门学习之八:数据库及表的基本操作
转载地址:http://www.2cto.com/database/201212/175867.html 一.操作数据库 www.2cto.com 1.查看数据库 show ...
- Python入门学习教程:数据库操作,连接MySql数据库
各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:Python教程:连接数据库,对数据进行增删改查操作 和py ...
- 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!
前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...
- Python入门学习——PyQt5程序基本结构
在学习python GUI部分时,一开始看书有点懵,看不懂框架,以下是个人学习所得(参考了别人的视频讲解),错误之处,望大家指教 #0.导入需要的包和模块from PyQt5.Qt import * ...
随机推荐
- Centos 7 安装openjdk8
一.使用yum命令搜索支持jdk版本 yum search java|grep jdk 二.使用yum安装jdk8 yum install -y java--openjdk 三.检查是否成功 java ...
- 以python为例讲解闭包机制
以python为例讲解闭包机制 缘起 在学习JS的过程中,总是无可避免的接触到闭包机制,尤其是接触到react后,其函数式的编程思想更是将闭包发扬光大,作为函数式编程的重要语法结构,python自然也 ...
- JavaScript常用技巧之进制转换
一.十进制转二进制 (8).toString(2) 二.二进制转十进制 parseInt("1000",2) 三.获取当前时间戳 // 方法 Date.now() // 对象和操作 ...
- sql developer 中文乱码解决办法
近日在fedora13中安装了oracle和sql developer,在英文环境下启动sql developer正常,可是切换到中文环境下就显示乱码.google了一下,确定是因为JDK不支持中文的 ...
- hdu 4826 Labyrinth(简单dp)
Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向 ...
- hdu1574 I Hate It (线段树,查询区间最大值)
Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟 ...
- 前端每日实战:81# 视频演示如何用纯 CSS 创作一个变色旋转动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ejZWKL 可交互视频 此视频是可 ...
- eclipse 中的.classpath和.project文件的具体作用(转)
转载博客:http://www.cnblogs.com/panjun-Donet/archive/2010/08/25/1807780.html .project是项目文件,项目的结构都在其中定义,比 ...
- shell变量相关知识
环境变量和普通变量 一.几个常用命令: 1. set : 输出所有变量,包含全局变量和局部变量 2. env : 只显示全局变量 3. declare : 输出所有的变量,函数,整数和已经导出的变量 ...
- Eclipse Missing artifact jdk.tools:jdk.tools:jar:1.6
Missing artifact jdk.tools:jdk.tools:jar:1.6 问题出在Eclipse Maven的支持上,在Eclipse下,java.home变量设置为用于启动Eclip ...