数据库模式:
外模式:模式的子集,一个模式可以有多个子模式, 子模式DDL;外模式是保证数据库安全性的一个有利措施
内模式:又叫存储模式,一个模式只有一个存储模式,它是数据物理结构和存储方式的描述,定义所有的内部记录类型,
索引 ,和文件的组织形式
概念模式:是对数据库中全局数据逻辑结构的描述;
数据库的二级映像,
外模式\模式映像
模式\内模式映像
数据完整性约束:
1.实体完整性:
实体完整性原则:属性A是基本关系R的主属性,则属性A不能取空值
2.参照完整性:
3.用户定义的完整性
数据字典:在Oracle数据库中,数据字典可以看作是一组表和视图结构,它们存放在SYSTEM表空间中,
数据文件:一个数据库可以拥有多个数据文件,但一个数据文件只对应一个数据库,
一个表空间可以由一个或多个数据文件组成;
数据文件是用于存储数据库数据的文件,
数据文件的大小可以用两种方式表示,字节和数据块
数据块是Oracle数据库中最小的数据组织单位,他的大小由参数"DB_BLOCK_SIZE"来确定
控制文件: 是一个很小的二进制控制文件,维护着数据库的全局物理结构,用以支持数据库成功的启动和运行
表空间:数据库中最大的逻辑结构,是组织数据和进行空间分配的逻辑结构,可以将表空间看作是数据库对象的容器,
三个默认表空间: SYSTEM SYSAUX TEMP ,一个或者多个临时表空间,
1.系统表空间:SYSTEM SYSAUX
2.永久表空间:用于永久性保存数据,如系统数据,应用系统数据
3.临时表空间:这些空间主要在查询带有排序(Group by ,Order by)算法时使用,当用完之后就立即
释放
4.撤销表空间:
自动撤销管理 SMU
手动撤销管理 RBU
在一个数据库中只能采用一种撤销空间管理模式,由参数"UNDO_MANAGEMENT"来确定 ,"AUTO" ,"MANUAL"
在SMU方式下,必须在数据库中创建一个撤销表空间,利用撤销表空间保存撤销记录;
5.大文件表空间和小文件表空间
一个大文件表空间对应一个单一的数据文件或临时文件,但是文件可以达到4G数据块大小。
小文件表空间:是默认创建的表空间类型,在小文件表空间中可以防止多达1022个数据文件,一个数据文件最多可以
放置64K个数据文件
表空间状态:读写状态
只读状态
脱机状态,使表空间暂时不被用户访问,增强了表空间的可用性,并提高了数据库管理的灵活性
表空间的作用:控制用户所占用的空间配额;
控制数据库所占用的磁盘空间,
段用于存储表空间中某一种特定的具有独立存储结构的对象的所有数据,它由一个区或者多个区组成,
段包含表空间的一种指定类型的逻辑存储结构,段是数据区的集合,每个段都分配给特定的数据结构,
存储在相同的表空间中;
1.数据段: 用于存储表中的所有数据,在一个表空间中创建了几个表,该表空间就有几个数据段;
数据段随着数据的增加而逐渐变大,段的增大过程是通过增加区的个数实现的额,
每次增加一个区,每个区的大小是块的整数倍
2.索引段:用于存储索引的额所有数据,
3.临时段:用于存储排序操作所产生的临时数据,
4.回滚段:用于存储用户数据被修改之前的值,以便在特定条件下回滚用户对数据的修改,
Oracle利用回滚段来恢复被回滚事务对数据库所做的修改,每个数据库都将至少拥有一个回滚段
区:是由物理上连续存放的块构成的,区是Oracle存储分配的最小单位,由一个 或者多个块组成,,一个或者多个区组成段,
数据块:是最小的数据管理单位,也是执行输入输出操作时的最小单位,Oracle快的大小是操作系统块大小的整数倍,
数据块的基本结构:
块头部: 包含块中一般的属性信息,快的物理地址,块的所属段的类型
表目录:
行信息:
空闲空间:
总结:多个数据库组成区,多个区组成段,多个段组成表空间,多个表空间组成数据库
Oracle11g新特性:
1.计划管理: 允许用户将某一特定语句的查询计划固定下来,
无论统计数据变化还是数据库版本变化都不会改变用户的查询计划。
2.资源管理器:不仅可以管理CPU,还可以管理I/O;
用户可以设置特定文件的优先级,文件类型,和ASM磁盘组
3.访问建议器:可以给出分区建议,包括对新的间隔分区的建议,
4.数据库重演:可以捕捉整个数据库的负载,并且传递到一个从备份或者standby数据库创建的测试数据库上,
5.事件打包服务:
6.自动SQL优化
7.数据库的备份和恢复
8.自动诊断知识库
9.自动内存优化
数据定义 CREATE DROP ALTER
数据操纵 SELECT INSERT UPDATE DELETE
数据控制 GRANT ,REVOKE
SQL编写规则: 关键字不区分大小写, 对象名和列名也不区分大小写,字符值和日期值区分大小写
数据定义:
创建 删除 修改
表 CREATE TABLE DROP TABLE ALTER TABLE
视图 CREATE VIEW DROP VIEW
索引 CREATE INDEX DROP INDEX
创建视图:视图是从一个或者几个基表导出的表,它是一个虚表,数据库中只存放视图的定义,而不存放视图对应的数据
create view prog_employees
as
select employee_id,first_name,last_name,email
from it_employees
where job_id='IT_PROG'
with check option;
创建索引:CREATE[UNIQUE][CLUSTER]INDEX<索引名>
ON<表名>(<列名>)
UNIQUE表示此索引的每一个索引值不能重复,对应唯一的数据记录
CLUSTER表示要建立的索引是聚簇索引
CREATE INDEX IT_LASTNAME ON IT_EMPLOYEES(LAST_NAME);
用户可以在查询频率最高的列上建立聚簇索引,从而提高查询效率,
由于聚簇索引是将索引和表记录放在一起存储,所以在 一个基表上最多只能创建一个聚簇索引、
DROP TABLE<表名> 删除基表定义后,表中的数据,在该表上建立的索引都将自动删除掉,
删除索引,将由系统对其维护,
ALTER TABLE<表名>
[ADD<新列名><数据类型>[完整性约束]]
[DROP<完整性约束名>]
[MODIFY<列名><数据类型>]
例:ALTER TABLE IT_EMPLOYEES ADD BIRTH_DATE DATE; 添加雇员生日 数据类型为日期型
ALTER TABLE IT_EMPLOYEE MODIFY MANAGER_ID NUMBER(8) 将MANEGER_ID字段改为8位
ALTER TABLE IT_EMPLOYEE DROP UNIQUE(EMPLOYEE_ID) 删除EMPLOYEE_ID字段的UNIQUE字段约束
算数表达式:
select employee_id ,first_name,last_name,salary*(1+0.1) from employees;
select employee_id ,first_name,last_name,salary*(1+0.1) new_salary from employees;
DISTINCT 删除结果重复的行
select distinct department_id from employees; 确保不出现重复的部门
WHERE 语句
select employee_id ,first_name,last_name from employees
where first_name like"B%"; 判断所有first_name列以“B”开头的雇员
连接运算符:
select employe_id,first_name,last_name,salary from employees
where department_id=60 and salary>2000;
如果使用OR运算符,则只要有任一个为TRUE 那么OR运算符就要返回TRUE
select employee_id ,first_name,last_name, department_id from employees
where department_id=60or department_id=30;
NULL值 用来描述记录中没有定义内容的字段值,
insert into departments(department_id,department_name,manage_id)
values(300,'数据库',NULL);
判断方式: IS NULL IS NOT NULL
select departmen_id,department_name,manager_id from departments
where manager_id is NULL;
ORDER BY 字句
select employee_id ,first_name,last_name ,salary
from employees
where salary>2000
order by salary;
默认升序 ASC 降序 DESC;
如果需要对多个列进行排序 ,只需要在order by 后面制定多个列名,
首先根据第一列进行排序
select last_name,job_id,salary from employees where salary>2000
order by job_id,salary desc;
GROUP BY
用于在查询结果集中对记录进行分组,以汇总数据或者为整个分组显示单行的汇总信息;
select job_id,avg(salary),sum(salary),max(salary),count(job_id) from employees
group by job_id;
使用group by字句时,必须满足下面的条件;
?select字句后面只可以有两类表达式:统计函数和进行分组的列名;
?select语句后面的列名必须是进行分组的列;除此之外添加其他列名都是错误的;
rollup group by 在使用后会添加一行汇总信息
select job_id,avg(salary),sum(salary),max(salary).count(*)
from employees group by rollup(job_id);
●HAVING字句:?group by
HABING子句和where子句的相似之处都是定义搜索条件, HAVING子句和组有关,而where
子句和单个行有关
select job_id,avg(salary),sum(salary),max(salary),count(*)
from employees group by job_id havingavg(salary)>10000;
多表连接查询:
select employee_id,last_name,department_name from employees,departments where
employees.department_id=departments.department_id;
表别名:
select em.employee_id,em.lastname,dep.department_name
from employees em,departments dep
where em.department.id=dep.department.id
and dep.department_name='Shipping';
select 语句中各子句执行的顺序 from子句最先被执行,然后是where子句, 最后才是select 子句
JOIN连接:除了使用逗号连接外,还支持关键字JOIN连接,
?使用内连接查询多个表时,还必须定义一个ON子句
select em.employee_id,em.last_name,dep.deparment_name,dep.department_id from
employees em inner join departments dep on
em.department_id = dep.department_id
where em.job_id='AD_ASST';
自然连接:
select em.employee,em.first_name,em.last_name,dep.department_name,
from employees em natural join department dep
where dep.department_name='Sales';
外连接
? 左外连接 :LEFT OUTER JOIN
?右外连接 : RIGHT OUTER JOIN
?全外连接 : FULL OUTER JOIN
集合操作:就是将两个或多个SQL查询结果合并构成复合查询,以完成一些特殊的任务需求
UNION (并运算)
可以将多个查询结果集相加,形成一个结果集,
select employee_id,last_name from employees where last_name like 'C%'
or last_name like'S%'
union
select employee_id,last_name from employees
where last_name like'S%'or last_name like'T%';
UNION ALL 与UNION语句工作方式基本相同,
UNION ALL 操作符形成的结果集包含有两个子结果集中重复的行
INTERSECT 是交集运算
MINUS 找出两个给定集合的差集,
返回从第一个查询中返回的,但是没有在在第二个查询中返回的记录
子查询:
IN关键字 :可以将原表中特定列的值与子查询返回的结果集中的值进行比较
select employee_id,last_name,department_id from employees
where department_id in(
select deparment_id from departments
where location_id=1700);
EXISTS 关键字
INSERT语句
insert into jobs(job_id,job_title,min_salary,max_salary)
values ('IT_TEST','测试员',3000.00,8000.00)
UPDATE 语句:
update employees
set salary =salary*1.15
where job_id='IT_PROG';
DELETE 语句:
delete from table_name;
delete from it_employees where employee_id=107;
从IT_EMPLOYEES 表中删除一条记录
TRUNCATE 语句
如果要删除表中所有的记录,使用TRUNCATE语句;
truncate table it_employees;
在truncate 语句中还可以使用关键字reuse storage 表示删除记录后仍然保留记录
占用的空间,
drop storage 删除记录后立即收回记录占用的空间
truncate table it_employees reuse storage;
delete 可以使用rollback来恢复数据,truncate 语句则不能
数据控制:
不同对象类型允许的操作权限
属性列和视图: insert select update delete以及四种权限的总和 ALLPRIVILEGES
基表的操作权限:查询,插入,修改,删除,修改表和建立索引
▲把查询it_employees 表的权限授给用户USER1
▲grant select on table it_employeees to User1;
★把对it_employees,jobs表的全部操作权限授予User2,use3
★grant ALL privileges on table employees,jobs to User2,User3;
?grant select on table pepartment to public;
?把对department的查询权限授予所有用户
?把查询it_employeees表和修改雇员编号的权限授予给用户user4;
?grant update(employee_id),select on table it_employees to User4;
?把对department表的insert权限授予User5用户,并允许将此权限再授予其他用户
?grant insert on table department to user5 with grant option
?DBA把在数据库db_employees中建立表的权限授予给User8;
?grant createtab on database db_employees to User8
revoke 语句
授予的权限可以由DBA或者其他授权者使用revoke 语句收回;
revoke update(employee_id) on table it_employees from User4;
revoke select on table department from public
Oracle 常用函数
1.字符类函数
ASCⅡ(<C1>)
用于返回c1第一个字母的ASCⅡ码,其中C1是字符串,
逆函数是CHR
select ASCⅡ('A')BIG_A,ASCⅡ('a') SMALL_A FROM dual;
结果:
BIG_A SMALL_A
65 97
CHR(<i>)
该函数用于求i对应的ASCⅡ字符,i是一个数字
select CHR(65),CHR(97) FROM dual;
2.CONCAT(c1,c2)
该函数将c2连接到c1后面,c1,c2均为字符串,
select concat (‘oracle’,‘11g’)name from dual
结果: name
oracle 11g
INITCAP(c1)
将c1中每个单词的第一个字母大写,其余字母小写返回
select INITCAP ('oracle universal install')name from dual;
INSTR(C1,[C2,<I>,[,J]]) 用于返回c2在c1中第J次出现的位置,搜索从第i个字符
开始,如果I是负数,那么搜索从右到左进行,但是位置还是从左到右计算
select INSTR('Moisossoppo','o',3,3) from dual;
LENGTH(c1)
该函数用于返回c1的长度,如果c1为null,那么返回null值
select length(oracle 11g)name from dual;
LOWER(C1)
用于返回c1的小写字符,
select LOWER(JOB_ID) FROM JOBS where LOWER(JOB_ID) LIKE 'it%';
REPLACE(C1,C2,[C3])
该函数用C3代替c1中的c2后返回,其中c1,c2,c3都是字符串
select REPLACE ('feelblue','blue','yellow') from dual;
feelyellow
SUBSTR(C1,<i>,[,j])
该函数表示从C1的第i位开始返回长度为J的子字符串,
select substr('Message',1,4)from dual;
结果: Mess
pl/sql语句
declare
--声明一些变量,常量,用户定义的数据类型以及游标等;
begin
-- 主程序体
exception
-- 异常处理程序
end;
--主程序体结束;
DECLARE
V_Department CHAR(3);
V_Course NUMBER;
BEGIN
INSERT INTO classes (department,courdse)
values(V_department,V_Course);
END;
pl/sql数据类型
数字类型: 存储整数和实数 NUMBER ,PLS_INTEGER 和 BINARY_INTEGER 三种基本数据类型
NUMBER类型的变量可以存储整数或者浮点数
BINARY_INTEGER 和PLS_INTEGER 类型的变量只能存储整数
字符类型:
用来存储字符串或者字符数据,varchar2,char,long ,nchar,nvarchar2
type 定义的数据类型,
type<数据类型名>is<数据类型>
type teacher_record is record;
定义常量:
<常量名>constant<数据类型>:=<值>
pass_score constant INTEGER :=60;
定义变量:<变量名><数据类型>[(宽度):=<初始值>]
address VARCHAR2(30);
循环结构: LOOP EXIT END
control_var:= 0; 初始化 control_var = 0
LOOP --开始循环
if control_var>5 THEN 如果control_var>5,则退出循环
EXIT;
END if;
control_var:=control_var+1; --改变control_var 值
END LOOP; 循环尾
PL/SQL的游标:
在pl/sql块中执行select insert update delete 语句时,oracle会在内存中为其分配
上下文去,即一个缓冲区,游标是指向该区的一个指针,或是命名的一个工作区,或是一种
结构化数据类型,它为应用程序提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式SQL语句应用程序的常见编程方式。
游标分为显式游标和隐式游标
显式游标:是由用户声明和操作的一种游标;
隐式游标:是Oracle为所有数据操纵语句自动声明和操作的一种游标,
显式游标的处理 声明游标 打开游标 提取游标 关闭游标
声明游标:CURSOR <游标名> IS SELECT<语句>;
打开游标:OPEN <游标名>的一部分
提取游标:FETCH<游标名> INTO <变量列表>
CLOSE <游标名>
DECLARE 定义四个变量
teacher_id NUMBER(5);
teacher_name VARCHAR2(50);
teacher_title VARCHAR2(50);
teacher_sex char(1);
CURSOR teacher_tur IS
SELECT TID,TNAME,TITLE,SEX FROM TEACHERS WHERE TID<117;
BEGIN
OPEN teacher_cur;
FETCH teacher_tur INTO teacher_id,teacher_name,teacher_title,teacher_sex;
--将第一行数据放入变量中,游标后移
fetch语句每执行一次,游标向后移动一行,直到结束
无论是显式游标还是隐式游标均有%ISOPEN,%FOUND,%NOTFOUND和%ROWCOUNT
过程:
迄今为止,每次执行都要被重新编译,并没有存储在数据库中,
因此不能被其他的pl/sql块使用,oracle允许在数据库内部创建并存储编译
过的pl/sql程序,以便随时调用使用,此类程序包含过程,函数,包。和触发器
我们可以将商业逻辑,企业规则等写成过程或者函数保存到数据库中,
创建过程
CREATE[OR REPLACE] PROCEDURE<过程名>
(<参数1>,[方式1]<数据类型1>,
<参数2>,[方式2]<数据类型2>
.....)
IS|AS
PL/SQL过程体
实例:动态观察teacher表中不同性别的人数,
create or replace procedure count_num
(in_sex in TEACHER.SEX%TYPE)--输入参数
AS
out_num NUMBER;
BEGIN
IF in_sex='M' THEN
SELECT count(sex) into out_num
from teachers
where sex='M';
dbms_output.putline(‘NUMBER OF MALE TEACHERS:'||out_num);
ELSE
SLEECT count(sex) into out_num
from teachers
where sex='F';
dbms_output.putline('NUMBER OF FEMALE TEACHERS:'||out_num);
END IF;
调用过程 EXECUTE
EXECUTE count_num('M');
删除过程 释放内存
DROP PROCEDURE count_num;
过程的参数类型及传递
过程的参数 三种类型
in 参数类型 表示这个参数值输入给过程,供过程调用
out类型 输出类型的参数 表示这个参数在过程中被赋值,可以传递给过程以外
的部分或者环境,
in out 类型 既向过程体传值,在过程中也被赋值传向过程体外
函数:
CREATE [OR REPLACE ] FUNCTION <>
(<参数1>,[方式1]<数据类型>,<参数2>,[方式2]<数据类型2>....)
RETURN <表达式>
IS|AS
PL/SQL 程序体 --其中必须要有一个return 子句
return在声明部分定义一个参数返回类型
而在函数体中必须有一个return语句,
通常函数体in类型的参数
实例:使用函数完成返回给定性别的老师数量
create or replace function count_num
(int_sex in TEACHERS.SEX%TYPE)
return NUMBER
AS
out_num NUMBER;
BEGIN
IF in_sex ='M' THEN
select count(SEX) INTO out_num
FROM TEACHERS
WHERE SEX ='m';
else
select count(sex) into out_num
from teachers
where sex ='f';
end if ;
return (out_num);
end count_num;
调用函数
VARIABLE man_num NUMBER
VARIABLE woman_num NUMBER
EXECUTE man_num:=count_num('m');
EXECUTE women_num:= count_num('f');
删除函数
drop function count_num;
程序包 简称包
用来将逻辑相关的PL/SQL块或元素等组织在一起,作为一个完整的单元存储在数据库中,
用名称来标识程序包
程序包: 说明部分 和包体部分
这两部分独立的存储在数据字典中,
create package<包名>
IS
变量,常量及数据类型定义;
游标定义头部
函数,过程的定义和参数列表以及返回类型
END<包名>
实例:
CREATE PACKAGE my_package
IS
man_num NUMBER; --定义两个全局变量
women_num NUMBER;
CURSOR teacher_tur; --定义一个游标
CREATE FUNCTION F_count_num(in_sex in TEACHERS.SEX%TYPE) --定义一个函数
RETURN NUMBER;
CREATE PROCEDURE P_count_num --定义一个过程
(in_sex in TEACHERS.SEX%TYPE,out_num out NUMBER);
END my package;
包体部分是包的说明部分中的游标,函数及过程的具体定义
格式:
CREATE PACKAGE BODY<包名>
AS
游标,函数,过程的具体定义;
END <包名>
触发器
基本原理 包括声明部分 ,异常处理部分,并且都有名称,都被存储在数据库中
DML触发器: 对表和视图执行DML操作时触发
instead of 触发器 只定义在视图上,用来替换实际的操作语句
系统触发器:对数据库系统进行操作(如DDL,启动或者关闭数据库等系统事件)
触发对象 :表 视图 模式 数据库
创建触发器
CREATE OR REPLACE TRIGGER <触发器名>
触发条件
触发体
CREATE TIRGGER my_trigger 定义一个触发器my_trigger
BEFROE INSERT OR UPDATE of TID,TNAME,on TEACHERS
FOR each row
WHEN (new.TNAME='David')
DECLARE
teacher.id TEACHERS.TID%TYPE;
INSERT_EXIST_TEACHER EXCEPTION;
BEGIN
SELECT TID INTO teacher_id
FROM TEACHERS
WHERE TNAME=new.TNAME;
RAISE INSERT_EXIST_TEACHER;
EXCEPTION
WHEN INSERT_EXIST_TEACHER THEN
INSERT INTO ERROR (TID,ERR)
VALUES(teacher_id,'the teacher already exists');
END my triqqer;
删除触发器
drop trigger my_trigger;
*********************************************************
save 命令
save file_name
使用save命令可以将缓冲区中的SQL语句保存到在当前路径下或指定路径下的指定文件
input 命令可以将sql*plus 命令输入到缓冲区中,然后用save命令保存到文件中
EDIT
创建文件
arraysize 用于设置从数据库中一次提取的行数
show arraysize
set arraysize
用于在执行DNL语句时设置是否自动提交
show autocommit
set autocommit 5
PAGESIZE 设置每页的默认行数
NEWPAGE 设置分隔页与页之间的空白行数
外模式:模式的子集,一个模式可以有多个子模式, 子模式DDL;外模式是保证数据库安全性的一个有利措施
内模式:又叫存储模式,一个模式只有一个存储模式,它是数据物理结构和存储方式的描述,定义所有的内部记录类型,
索引 ,和文件的组织形式
概念模式:是对数据库中全局数据逻辑结构的描述;
数据库的二级映像,
外模式\模式映像
模式\内模式映像
数据完整性约束:
1.实体完整性:
实体完整性原则:属性A是基本关系R的主属性,则属性A不能取空值
2.参照完整性:
3.用户定义的完整性
数据字典:在Oracle数据库中,数据字典可以看作是一组表和视图结构,它们存放在SYSTEM表空间中,
数据文件:一个数据库可以拥有多个数据文件,但一个数据文件只对应一个数据库,
一个表空间可以由一个或多个数据文件组成;
数据文件是用于存储数据库数据的文件,
数据文件的大小可以用两种方式表示,字节和数据块
数据块是Oracle数据库中最小的数据组织单位,他的大小由参数"DB_BLOCK_SIZE"来确定
控制文件: 是一个很小的二进制控制文件,维护着数据库的全局物理结构,用以支持数据库成功的启动和运行
表空间:数据库中最大的逻辑结构,是组织数据和进行空间分配的逻辑结构,可以将表空间看作是数据库对象的容器,
三个默认表空间: SYSTEM SYSAUX TEMP ,一个或者多个临时表空间,
1.系统表空间:SYSTEM SYSAUX
2.永久表空间:用于永久性保存数据,如系统数据,应用系统数据
3.临时表空间:这些空间主要在查询带有排序(Group by ,Order by)算法时使用,当用完之后就立即
释放
4.撤销表空间:
自动撤销管理 SMU
手动撤销管理 RBU
在一个数据库中只能采用一种撤销空间管理模式,由参数"UNDO_MANAGEMENT"来确定 ,"AUTO" ,"MANUAL"
在SMU方式下,必须在数据库中创建一个撤销表空间,利用撤销表空间保存撤销记录;
5.大文件表空间和小文件表空间
一个大文件表空间对应一个单一的数据文件或临时文件,但是文件可以达到4G数据块大小。
小文件表空间:是默认创建的表空间类型,在小文件表空间中可以防止多达1022个数据文件,一个数据文件最多可以
放置64K个数据文件
表空间状态:读写状态
只读状态
脱机状态,使表空间暂时不被用户访问,增强了表空间的可用性,并提高了数据库管理的灵活性
表空间的作用:控制用户所占用的空间配额;
控制数据库所占用的磁盘空间,
段用于存储表空间中某一种特定的具有独立存储结构的对象的所有数据,它由一个区或者多个区组成,
段包含表空间的一种指定类型的逻辑存储结构,段是数据区的集合,每个段都分配给特定的数据结构,
存储在相同的表空间中;
1.数据段: 用于存储表中的所有数据,在一个表空间中创建了几个表,该表空间就有几个数据段;
数据段随着数据的增加而逐渐变大,段的增大过程是通过增加区的个数实现的额,
每次增加一个区,每个区的大小是块的整数倍
2.索引段:用于存储索引的额所有数据,
3.临时段:用于存储排序操作所产生的临时数据,
4.回滚段:用于存储用户数据被修改之前的值,以便在特定条件下回滚用户对数据的修改,
Oracle利用回滚段来恢复被回滚事务对数据库所做的修改,每个数据库都将至少拥有一个回滚段
区:是由物理上连续存放的块构成的,区是Oracle存储分配的最小单位,由一个 或者多个块组成,,一个或者多个区组成段,
数据块:是最小的数据管理单位,也是执行输入输出操作时的最小单位,Oracle快的大小是操作系统块大小的整数倍,
数据块的基本结构:
块头部: 包含块中一般的属性信息,快的物理地址,块的所属段的类型
表目录:
行信息:
空闲空间:
总结:多个数据库组成区,多个区组成段,多个段组成表空间,多个表空间组成数据库
Oracle11g新特性:
1.计划管理: 允许用户将某一特定语句的查询计划固定下来,
无论统计数据变化还是数据库版本变化都不会改变用户的查询计划。
2.资源管理器:不仅可以管理CPU,还可以管理I/O;
用户可以设置特定文件的优先级,文件类型,和ASM磁盘组
3.访问建议器:可以给出分区建议,包括对新的间隔分区的建议,
4.数据库重演:可以捕捉整个数据库的负载,并且传递到一个从备份或者standby数据库创建的测试数据库上,
5.事件打包服务:
6.自动SQL优化
7.数据库的备份和恢复
8.自动诊断知识库
9.自动内存优化
数据定义 CREATE DROP ALTER
数据操纵 SELECT INSERT UPDATE DELETE
数据控制 GRANT ,REVOKE
SQL编写规则: 关键字不区分大小写, 对象名和列名也不区分大小写,字符值和日期值区分大小写
数据定义:
创建 删除 修改
表 CREATE TABLE DROP TABLE ALTER TABLE
视图 CREATE VIEW DROP VIEW
索引 CREATE INDEX DROP INDEX
创建视图:视图是从一个或者几个基表导出的表,它是一个虚表,数据库中只存放视图的定义,而不存放视图对应的数据
create view prog_employees
as
select employee_id,first_name,last_name,email
from it_employees
where job_id='IT_PROG'
with check option;
创建索引:CREATE[UNIQUE][CLUSTER]INDEX<索引名>
ON<表名>(<列名>)
UNIQUE表示此索引的每一个索引值不能重复,对应唯一的数据记录
CLUSTER表示要建立的索引是聚簇索引
CREATE INDEX IT_LASTNAME ON IT_EMPLOYEES(LAST_NAME);
用户可以在查询频率最高的列上建立聚簇索引,从而提高查询效率,
由于聚簇索引是将索引和表记录放在一起存储,所以在 一个基表上最多只能创建一个聚簇索引、
DROP TABLE<表名> 删除基表定义后,表中的数据,在该表上建立的索引都将自动删除掉,
删除索引,将由系统对其维护,
ALTER TABLE<表名>
[ADD<新列名><数据类型>[完整性约束]]
[DROP<完整性约束名>]
[MODIFY<列名><数据类型>]
例:ALTER TABLE IT_EMPLOYEES ADD BIRTH_DATE DATE; 添加雇员生日 数据类型为日期型
ALTER TABLE IT_EMPLOYEE MODIFY MANAGER_ID NUMBER(8) 将MANEGER_ID字段改为8位
ALTER TABLE IT_EMPLOYEE DROP UNIQUE(EMPLOYEE_ID) 删除EMPLOYEE_ID字段的UNIQUE字段约束
算数表达式:
select employee_id ,first_name,last_name,salary*(1+0.1) from employees;
select employee_id ,first_name,last_name,salary*(1+0.1) new_salary from employees;
DISTINCT 删除结果重复的行
select distinct department_id from employees; 确保不出现重复的部门
WHERE 语句
select employee_id ,first_name,last_name from employees
where first_name like"B%"; 判断所有first_name列以“B”开头的雇员
连接运算符:
select employe_id,first_name,last_name,salary from employees
where department_id=60 and salary>2000;
如果使用OR运算符,则只要有任一个为TRUE 那么OR运算符就要返回TRUE
select employee_id ,first_name,last_name, department_id from employees
where department_id=60or department_id=30;
NULL值 用来描述记录中没有定义内容的字段值,
insert into departments(department_id,department_name,manage_id)
values(300,'数据库',NULL);
判断方式: IS NULL IS NOT NULL
select departmen_id,department_name,manager_id from departments
where manager_id is NULL;
ORDER BY 字句
select employee_id ,first_name,last_name ,salary
from employees
where salary>2000
order by salary;
默认升序 ASC 降序 DESC;
如果需要对多个列进行排序 ,只需要在order by 后面制定多个列名,
首先根据第一列进行排序
select last_name,job_id,salary from employees where salary>2000
order by job_id,salary desc;
GROUP BY
用于在查询结果集中对记录进行分组,以汇总数据或者为整个分组显示单行的汇总信息;
select job_id,avg(salary),sum(salary),max(salary),count(job_id) from employees
group by job_id;
使用group by字句时,必须满足下面的条件;
?select字句后面只可以有两类表达式:统计函数和进行分组的列名;
?select语句后面的列名必须是进行分组的列;除此之外添加其他列名都是错误的;
rollup group by 在使用后会添加一行汇总信息
select job_id,avg(salary),sum(salary),max(salary).count(*)
from employees group by rollup(job_id);
●HAVING字句:?group by
HABING子句和where子句的相似之处都是定义搜索条件, HAVING子句和组有关,而where
子句和单个行有关
select job_id,avg(salary),sum(salary),max(salary),count(*)
from employees group by job_id havingavg(salary)>10000;
多表连接查询:
select employee_id,last_name,department_name from employees,departments where
employees.department_id=departments.department_id;
表别名:
select em.employee_id,em.lastname,dep.department_name
from employees em,departments dep
where em.department.id=dep.department.id
and dep.department_name='Shipping';
select 语句中各子句执行的顺序 from子句最先被执行,然后是where子句, 最后才是select 子句
JOIN连接:除了使用逗号连接外,还支持关键字JOIN连接,
?使用内连接查询多个表时,还必须定义一个ON子句
select em.employee_id,em.last_name,dep.deparment_name,dep.department_id from
employees em inner join departments dep on
em.department_id = dep.department_id
where em.job_id='AD_ASST';
自然连接:
select em.employee,em.first_name,em.last_name,dep.department_name,
from employees em natural join department dep
where dep.department_name='Sales';
外连接
? 左外连接 :LEFT OUTER JOIN
?右外连接 : RIGHT OUTER JOIN
?全外连接 : FULL OUTER JOIN
集合操作:就是将两个或多个SQL查询结果合并构成复合查询,以完成一些特殊的任务需求
UNION (并运算)
可以将多个查询结果集相加,形成一个结果集,
select employee_id,last_name from employees where last_name like 'C%'
or last_name like'S%'
union
select employee_id,last_name from employees
where last_name like'S%'or last_name like'T%';
UNION ALL 与UNION语句工作方式基本相同,
UNION ALL 操作符形成的结果集包含有两个子结果集中重复的行
INTERSECT 是交集运算
MINUS 找出两个给定集合的差集,
返回从第一个查询中返回的,但是没有在在第二个查询中返回的记录
子查询:
IN关键字 :可以将原表中特定列的值与子查询返回的结果集中的值进行比较
select employee_id,last_name,department_id from employees
where department_id in(
select deparment_id from departments
where location_id=1700);
EXISTS 关键字
INSERT语句
insert into jobs(job_id,job_title,min_salary,max_salary)
values ('IT_TEST','测试员',3000.00,8000.00)
UPDATE 语句:
update employees
set salary =salary*1.15
where job_id='IT_PROG';
DELETE 语句:
delete from table_name;
delete from it_employees where employee_id=107;
从IT_EMPLOYEES 表中删除一条记录
TRUNCATE 语句
如果要删除表中所有的记录,使用TRUNCATE语句;
truncate table it_employees;
在truncate 语句中还可以使用关键字reuse storage 表示删除记录后仍然保留记录
占用的空间,
drop storage 删除记录后立即收回记录占用的空间
truncate table it_employees reuse storage;
delete 可以使用rollback来恢复数据,truncate 语句则不能
数据控制:
不同对象类型允许的操作权限
属性列和视图: insert select update delete以及四种权限的总和 ALLPRIVILEGES
基表的操作权限:查询,插入,修改,删除,修改表和建立索引
▲把查询it_employees 表的权限授给用户USER1
▲grant select on table it_employeees to User1;
★把对it_employees,jobs表的全部操作权限授予User2,use3
★grant ALL privileges on table employees,jobs to User2,User3;
?grant select on table pepartment to public;
?把对department的查询权限授予所有用户
?把查询it_employeees表和修改雇员编号的权限授予给用户user4;
?grant update(employee_id),select on table it_employees to User4;
?把对department表的insert权限授予User5用户,并允许将此权限再授予其他用户
?grant insert on table department to user5 with grant option
?DBA把在数据库db_employees中建立表的权限授予给User8;
?grant createtab on database db_employees to User8
revoke 语句
授予的权限可以由DBA或者其他授权者使用revoke 语句收回;
revoke update(employee_id) on table it_employees from User4;
revoke select on table department from public
Oracle 常用函数
1.字符类函数
ASCⅡ(<C1>)
用于返回c1第一个字母的ASCⅡ码,其中C1是字符串,
逆函数是CHR
select ASCⅡ('A')BIG_A,ASCⅡ('a') SMALL_A FROM dual;
结果:
BIG_A SMALL_A
65 97
CHR(<i>)
该函数用于求i对应的ASCⅡ字符,i是一个数字
select CHR(65),CHR(97) FROM dual;
2.CONCAT(c1,c2)
该函数将c2连接到c1后面,c1,c2均为字符串,
select concat (‘oracle’,‘11g’)name from dual
结果: name
oracle 11g
INITCAP(c1)
将c1中每个单词的第一个字母大写,其余字母小写返回
select INITCAP ('oracle universal install')name from dual;
INSTR(C1,[C2,<I>,[,J]]) 用于返回c2在c1中第J次出现的位置,搜索从第i个字符
开始,如果I是负数,那么搜索从右到左进行,但是位置还是从左到右计算
select INSTR('Moisossoppo','o',3,3) from dual;
LENGTH(c1)
该函数用于返回c1的长度,如果c1为null,那么返回null值
select length(oracle 11g)name from dual;
LOWER(C1)
用于返回c1的小写字符,
select LOWER(JOB_ID) FROM JOBS where LOWER(JOB_ID) LIKE 'it%';
REPLACE(C1,C2,[C3])
该函数用C3代替c1中的c2后返回,其中c1,c2,c3都是字符串
select REPLACE ('feelblue','blue','yellow') from dual;
feelyellow
SUBSTR(C1,<i>,[,j])
该函数表示从C1的第i位开始返回长度为J的子字符串,
select substr('Message',1,4)from dual;
结果: Mess
pl/sql语句
declare
--声明一些变量,常量,用户定义的数据类型以及游标等;
begin
-- 主程序体
exception
-- 异常处理程序
end;
--主程序体结束;
DECLARE
V_Department CHAR(3);
V_Course NUMBER;
BEGIN
INSERT INTO classes (department,courdse)
values(V_department,V_Course);
END;
pl/sql数据类型
数字类型: 存储整数和实数 NUMBER ,PLS_INTEGER 和 BINARY_INTEGER 三种基本数据类型
NUMBER类型的变量可以存储整数或者浮点数
BINARY_INTEGER 和PLS_INTEGER 类型的变量只能存储整数
字符类型:
用来存储字符串或者字符数据,varchar2,char,long ,nchar,nvarchar2
type 定义的数据类型,
type<数据类型名>is<数据类型>
type teacher_record is record;
定义常量:
<常量名>constant<数据类型>:=<值>
pass_score constant INTEGER :=60;
定义变量:<变量名><数据类型>[(宽度):=<初始值>]
address VARCHAR2(30);
循环结构: LOOP EXIT END
control_var:= 0; 初始化 control_var = 0
LOOP --开始循环
if control_var>5 THEN 如果control_var>5,则退出循环
EXIT;
END if;
control_var:=control_var+1; --改变control_var 值
END LOOP; 循环尾
PL/SQL的游标:
在pl/sql块中执行select insert update delete 语句时,oracle会在内存中为其分配
上下文去,即一个缓冲区,游标是指向该区的一个指针,或是命名的一个工作区,或是一种
结构化数据类型,它为应用程序提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式SQL语句应用程序的常见编程方式。
游标分为显式游标和隐式游标
显式游标:是由用户声明和操作的一种游标;
隐式游标:是Oracle为所有数据操纵语句自动声明和操作的一种游标,
显式游标的处理 声明游标 打开游标 提取游标 关闭游标
声明游标:CURSOR <游标名> IS SELECT<语句>;
打开游标:OPEN <游标名>的一部分
提取游标:FETCH<游标名> INTO <变量列表>
CLOSE <游标名>
DECLARE 定义四个变量
teacher_id NUMBER(5);
teacher_name VARCHAR2(50);
teacher_title VARCHAR2(50);
teacher_sex char(1);
CURSOR teacher_tur IS
SELECT TID,TNAME,TITLE,SEX FROM TEACHERS WHERE TID<117;
BEGIN
OPEN teacher_cur;
FETCH teacher_tur INTO teacher_id,teacher_name,teacher_title,teacher_sex;
--将第一行数据放入变量中,游标后移
fetch语句每执行一次,游标向后移动一行,直到结束
无论是显式游标还是隐式游标均有%ISOPEN,%FOUND,%NOTFOUND和%ROWCOUNT
过程:
迄今为止,每次执行都要被重新编译,并没有存储在数据库中,
因此不能被其他的pl/sql块使用,oracle允许在数据库内部创建并存储编译
过的pl/sql程序,以便随时调用使用,此类程序包含过程,函数,包。和触发器
我们可以将商业逻辑,企业规则等写成过程或者函数保存到数据库中,
创建过程
CREATE[OR REPLACE] PROCEDURE<过程名>
(<参数1>,[方式1]<数据类型1>,
<参数2>,[方式2]<数据类型2>
.....)
IS|AS
PL/SQL过程体
实例:动态观察teacher表中不同性别的人数,
create or replace procedure count_num
(in_sex in TEACHER.SEX%TYPE)--输入参数
AS
out_num NUMBER;
BEGIN
IF in_sex='M' THEN
SELECT count(sex) into out_num
from teachers
where sex='M';
dbms_output.putline(‘NUMBER OF MALE TEACHERS:'||out_num);
ELSE
SLEECT count(sex) into out_num
from teachers
where sex='F';
dbms_output.putline('NUMBER OF FEMALE TEACHERS:'||out_num);
END IF;
调用过程 EXECUTE
EXECUTE count_num('M');
删除过程 释放内存
DROP PROCEDURE count_num;
过程的参数类型及传递
过程的参数 三种类型
in 参数类型 表示这个参数值输入给过程,供过程调用
out类型 输出类型的参数 表示这个参数在过程中被赋值,可以传递给过程以外
的部分或者环境,
in out 类型 既向过程体传值,在过程中也被赋值传向过程体外
函数:
CREATE [OR REPLACE ] FUNCTION <>
(<参数1>,[方式1]<数据类型>,<参数2>,[方式2]<数据类型2>....)
RETURN <表达式>
IS|AS
PL/SQL 程序体 --其中必须要有一个return 子句
return在声明部分定义一个参数返回类型
而在函数体中必须有一个return语句,
通常函数体in类型的参数
实例:使用函数完成返回给定性别的老师数量
create or replace function count_num
(int_sex in TEACHERS.SEX%TYPE)
return NUMBER
AS
out_num NUMBER;
BEGIN
IF in_sex ='M' THEN
select count(SEX) INTO out_num
FROM TEACHERS
WHERE SEX ='m';
else
select count(sex) into out_num
from teachers
where sex ='f';
end if ;
return (out_num);
end count_num;
调用函数
VARIABLE man_num NUMBER
VARIABLE woman_num NUMBER
EXECUTE man_num:=count_num('m');
EXECUTE women_num:= count_num('f');
删除函数
drop function count_num;
程序包 简称包
用来将逻辑相关的PL/SQL块或元素等组织在一起,作为一个完整的单元存储在数据库中,
用名称来标识程序包
程序包: 说明部分 和包体部分
这两部分独立的存储在数据字典中,
create package<包名>
IS
变量,常量及数据类型定义;
游标定义头部
函数,过程的定义和参数列表以及返回类型
END<包名>
实例:
CREATE PACKAGE my_package
IS
man_num NUMBER; --定义两个全局变量
women_num NUMBER;
CURSOR teacher_tur; --定义一个游标
CREATE FUNCTION F_count_num(in_sex in TEACHERS.SEX%TYPE) --定义一个函数
RETURN NUMBER;
CREATE PROCEDURE P_count_num --定义一个过程
(in_sex in TEACHERS.SEX%TYPE,out_num out NUMBER);
END my package;
包体部分是包的说明部分中的游标,函数及过程的具体定义
格式:
CREATE PACKAGE BODY<包名>
AS
游标,函数,过程的具体定义;
END <包名>
触发器
基本原理 包括声明部分 ,异常处理部分,并且都有名称,都被存储在数据库中
DML触发器: 对表和视图执行DML操作时触发
instead of 触发器 只定义在视图上,用来替换实际的操作语句
系统触发器:对数据库系统进行操作(如DDL,启动或者关闭数据库等系统事件)
触发对象 :表 视图 模式 数据库
创建触发器
CREATE OR REPLACE TRIGGER <触发器名>
触发条件
触发体
CREATE TIRGGER my_trigger 定义一个触发器my_trigger
BEFROE INSERT OR UPDATE of TID,TNAME,on TEACHERS
FOR each row
WHEN (new.TNAME='David')
DECLARE
teacher.id TEACHERS.TID%TYPE;
INSERT_EXIST_TEACHER EXCEPTION;
BEGIN
SELECT TID INTO teacher_id
FROM TEACHERS
WHERE TNAME=new.TNAME;
RAISE INSERT_EXIST_TEACHER;
EXCEPTION
WHEN INSERT_EXIST_TEACHER THEN
INSERT INTO ERROR (TID,ERR)
VALUES(teacher_id,'the teacher already exists');
END my triqqer;
删除触发器
drop trigger my_trigger;
*********************************************************
save 命令
save file_name
使用save命令可以将缓冲区中的SQL语句保存到在当前路径下或指定路径下的指定文件
input 命令可以将sql*plus 命令输入到缓冲区中,然后用save命令保存到文件中
EDIT
创建文件
arraysize 用于设置从数据库中一次提取的行数
show arraysize
set arraysize
用于在执行DNL语句时设置是否自动提交
show autocommit
set autocommit 5
PAGESIZE 设置每页的默认行数
NEWPAGE 设置分隔页与页之间的空白行数