【数据库】oracle基础概述

orcale版本后缀说明
i:internet
g:gird 10g/11g 迎合分布式计算而做出的变化
c:cloud 表示云计算的意思
 
所有数据库都使用相同或者相似的语言:
定义:DDL:Data Definition Language
操纵:DML: Data Manipulation Language
事务控制:TCL: Transaction Control Language
数据查询:DQL: Data Query Language
数据控制:DCL: Data Control Language
 
pl/sql:通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言
是Oracle数据库对sql语句的扩展,在普通的sql语句的使用上增加了编程语言的的特点
 
oracle的默认端口号是 1521
 
数据类型:
number(n) number(n,m) m表示小数的位数
字符串类型:char(n) 最大2000字节 定长n字节   ||   varchar2(n) 最大4000字节  最多n字节
date 7个字节 默认的格式是:DD-MON-RR(年)
 
default 'm';   not null;   rename n to m;
alter 修改表
alter table students add address varchar(2);
alter table student modify address varchar(200);
alter table student rename column address to stu_address;
alter table student drop column stu_address;
 
insert into () students values();
select * from students;
update students set h=1 where id=1;
delete from students where id=2;
 
commit;提交缓存数据
rollback;回滚数据   只能是在没有提交的情况下 才能回滚
truncate table students 清空表 无法回退(ddl) 全部删除效率比delete大
distinct 去除重复行  select name "ename",age from students;取别名
 
字符串类型
long和clob
lang:varchar2加长版,存储变长字符串,最多达2gb的字符串数据。
long有诸多限制:每个表只能有一个long类型列,不能作为主键,不能建立索引,不能出现在查询条件中
clob:储存定长或变长字符串,最多达4gb的字符串数据   建议开发中使用clob替代long类型
 
字符串函数
concat:返回字符串连接的值 select concat("n","m") from dual;
连接符: “||”select "hello"||"students" from dual;
 
length:返回字符串的长度
select length(“hello”)from emp;
 
upper:变大写  lower:变小写  initcap:首字符变大写
 
trim: select trim('e' from 'ehelle')from dual;截取前后指定的字符
ltrim: select ltrim('ehelle','e') 截取左边指定的字符
rtrim:  select rtrim('ehelle','e') 截取右边的字符
 
lpad: select lpad(sal,10,'$') from emp;10位显示不够在左边补上'$'
rpad: select rpad(sal,10,'$') from emp;10位显示不够在右边补上'$'
 
substr(char1,n,m)
select substr("hello",2,3) from dual;  从e(2)开始共取三个
 
select instr(char,指定字符) from dual;  获取指定字符的索引
 
 
数值类型
number number(总位数,小数位数)
数值函数
round(n,m):  四舍五入  n是待处理的数字,m是表示四舍五入到小数点后m位  可取0 或负数
trunc(n,m):  类似round(n,m) 但是去位  即截取
mod(m,n)  返回m除以n后的余数  n为0则直接返回m
ceil(n)  大于或者等于n的最小整数值
floor(n)  小于或者等于n的最大整数值
 
日期类型
date可以精确到s
timestamp可以精确到(ns)纳秒
日期函数
sysdate 精确到s  格式DD-MM-RR  可以转换成当前系统时间的s  
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
systimestamp可以精确到毫秒 12小时计时法 显示时区
 
to_char把日期类型转换成字符串类型
to_char(日期,格式字符串) select to_char(sysdate,"yyyy"年"mm"月"dd"日) from dual;
 
to_date把字符串日期转换成日期类型
to_date(字符串,格式字符串)  select to_date('2000-01-01','yyyy-mm-dd') from dual;
 
last_day(n)当月最后一天
add_months(sysdate,n) n月之后的日期
monsth_between(n,m)两个日期之间相差的月份
next_day(sysdate,n)当前日期的下一个星期n的日期  1-7表示周日到周六
 
聚合函数   *所有聚合函数都是忽略null的计算 计算平均值的时候需要注意*
min(),max(),sum(),avg(),count()
 
select count(*) from emp where comm is not null;
 
group by 字段1,字段2,。。。
 
 
查询每个部门的工资总额(部门编号,工资总额)
select deptno,sum(sal) from emp group by deptno order by deptno;
 
##where 不能和聚合函数一起使用  要使用having代替
null的含义 null,即空值,任何数据类型均可取值null
查询实际收入(奖金+工资)
select ename,sal+com from emp;
null做算数运算,运行的结果为空
 
通用函数:(可以用于转换空值   如果为空就转换成0)  解决空值问题
nvl     nvl2
select nvl(1,2) from dual;如果第一个参数不为空返回第一个参数,第一个参数为空就返回第二个参数
select nvl(1,2,3) from dual;如果第一个参数不为空返回2,如果为空返回第三个参数
 
导入数据文件dmp
将一个用户所属的数据导入另一个用户
imp system/密码 fromuser=导出用户  touser=导出用户 file=c:/scott.dmp
 
where子句
select * from emp where deptno=10;
 
比较运算符 > < >= <= = != <>
查询不是10号部门的员工信息
select * from emp where deptno !=10;
查询ename是king的员工编号和工资
select empno,sal from emp where ename='KING';
查询1981年2月20号入职的员工姓名,入职日期,部门编号
select ename,hiredate,deptno from emp where hirdate='20-2月-81';
 
逻辑运算符 and or not(不能独立使用)
查询工资大于1000,并且job=cleark的员工信息
select * from emp where sal>1000 and job='CLERK';
查询工资大于1000,或者job=cleark的员工信息
select * from emp where sal>1000 or job='CLERK';
 
any/all,不能独立使用,和比较运算符一起使用 > >= < <=
 
between...and,in,like, is null
in(list):查询10号或者20号部门的员工   select * from emp where deptno in(10,20) 只要满足列表里面条件就可以
 
like  
_表示一个占位符  %表示0个或者多个     
查询ename 第二个字母是A的员工信息 select * from emp where ename like   '_A%';
 
is null 判断空值
查询没有奖金的员工的姓名和编号
select ename,empno from emp where comm is null;
 
not   between...and
not in
not like
is not null
 
## 所有的聚合函数都是忽略null的计算
显示奖金的平均值 14个平均奖金
select sum(comm)/count(*) from emp;
 
where 不能和聚合函数一起使用 只能使用having
having通常和group by子句一起使用
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000
 
关联查询(连接查询)
查询两个或两个以上数据表或视图的查询叫做连接查询,连接查询通常建立在存在相互关系的父子表之间
 
笛卡尔积指做关联操作的每一个表的每一行都和其他表的每一行做组合,假设两个表的记录条数分别是x和y,笛卡尔积将返回x*y条记录    通常笛卡尔积没有意义的
 
内连接查询:把满足条件的数据查出来
inner join ... on
查询员工的基本信息,部门名称
 
表别名  使用别名就必须都使用别名   否则会出错
select emp.*,dname from emp e inner join dept d on e.deptno=d.deptno;
 
省略inner join
select e.*,dname from emp e,dept d where e.deptno = d.deptno;
 
等值连接查询,非等值连接查询  
查询员工的工资,姓名,工资等级
select e.ename,e.sal,g.grade from emp e,salgrade g where e.sal between losal and hisal;
 
多表连接查询的时候,连接条件n-1个有效的连接条件 才不会出现笛卡尔积
 
外连接查询 : 除了把满足条件的数据查出来,还可以把不满足条件的数据查出来
左外连接查询,右外连接查询,满外连接查询
 
左外连接查询:除了把满足条件的数据查除来,还要把左表中不满足条件的数据查询出来
left join ... on
查询所有员工的信息,部门编号
select emp.*,dname from emp left join dept on emp.deptno=dept.deptno;
右外连接查询:除了把满足条件的数据查出来,还要把右表中不满足条件的数据查询出来
right join ... on
满外连接查询 : 除了把满足条件的数据查出来,还要把左右表中不满足条件的数据查出来
full join ... on
 
## 自连接查询
一种特殊的连接查询,数据的来源是一个表,即关联关系来自于单表中的多个列
表中列参照同一个表中的其他列的情况称做自参照表连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接
例子:查询员工的姓名和他部门经理的姓名
select e.ename,m.ename from emp e,emp m where e.mgr = m.empno;
 
##子查询(内层查询)
定义:当一个查询是另一个查询的条件时,称之为子查询
(子查询可以出现在where子句,having子句,from子句,select子句中)
* where子句
查询比scott员工工资高的信息
select * from emp where sal>(select sal from emp where ename='scott')
查询比7369号员工晚入职1年的员工信息 (单行子查询)
select * from emp where hiredate > (select add_months(hiredate,12*1) from emp where empno = 7369);
* having子句
查询最低工资大于30号部门的最低工资的部门信息(部门编号,最低工资)
select deptno,min(sal) from emp group by deptno having min(sal)>(select min(sal) from emp where deptno = 30)
* from子句
查询工资超过本部门平均工资的员工信息
###  select e.* from emp e,(select deptno,avg(sal) sag_sal from emp group by deptno) x where e.deptno = x.deptno and e.sal>sag_sal;
* select子句
查询员工姓名,工资,部门名称
select e.ename,e.sal,(select d.dname from dept d where d.deptno = e.deptno) dname from emp e;
 
#子查询,按查询结果:单行子查询和多行子查询
单行子查询:子查询返回一行,使用单行运算符(比较运算符)
多行子查询:子查询返回多行,使用多行子查询(in,any,all)
查询比7369号员工晚入职1年的员工信息 (单行子查询)
select * from emp where hiredate > (select add_months(hiredate,12*1) from emp where empno = 7369);
查询管理者的员工信息:(多行子查询)
select * from emp where empno in (select distinct mgr from emp);
查询大于30号部门的所有员工工资的员工信息
select * from emp where sal>all (select distinct sal from emp where deptno = 30);
all和any不常用可以使用单行的方法代替
select * from emp where sal > (select max(sal) from emp where deptno = 30);
 
#子查询,按照子查询和主查询执行顺序分类
标准子查询:先执行子查询,用于主查询
相关子查询:先执行主查询,后执行子查询
 
***查询工资超过本部门平均工资的员工信息
select  *  from emp e where sal>(select avg(sal) from emp where deptno =e.deptno)     
(先执行主查询 去得到本部门  在将本部门带到子查询)
 
分页查询
oracle中分页查询会用到伪列(rownum),用于返回标识行数据顺序的数字
 
伪列(rownum):查询一行添加一个行号,从1开始依次顺序添加  (不存在于表中)
select emp.* from emp where rownum = 1;
查询数据的前三行
select e.* from emp where rownum<=3;
注意:不能查询>= 因为是查询一行添加一行 但是可以通过结果集和内视图实现
 
*** rownum  作为结果集中可以使用的数据,通过行内视图实现
select  *  from (select emp.*,rownum rn from emp) where rn>=3;
 
分页的功能
select * from (select emp.*,rownum rn from emp) where rn between 11 and 20;
 
(n-1)*pageSize + 1     n*pagesize
 
按工资降序排序,取出工资降序排列后的第8到10条数据
## select * from (select e.*,rownum rn from (select emp.* from emp order by sal desc ) e) where rn between 8 and 10;
 
### decode函数
查询员工表,按照员工的职位来计算奖金的金额
manager 1.2     analyst 1.1  saleman  1.05   sal
select ename,job,sal decode(job,'manager',sal*12,'annalyst',sal*1.05,sal) bonus from emp;
 
### case 语句
select ename,job,sal,
case job when 'manager' then sal*1.2
              when  'anayst' then sal*1.1
              when  'salseman' then sal*1.05
              else sal
    end bonus
    from emp;
 
计算人数,analyst/manager 属于vip,其他都属于operation,vip和operation进行计数
select decode(job,
    'manager','vip',
    'analyst','vip',
    'operation') job,
    count(*)
     from emp
    group by decode(job,
    'manager','vip',
    'analyst','vip',
    'operation') ;
 
三个排序函数
按照部门分组,组内按照sal排序
row_number:      1,2,3,4,5,6
select ename, deptno, sal,
row_number()  
over(partition by deptno order by sal)
as emp_no
from emp;
 
rank:        1,2,2,4,4,6
select ename,deptno,sal,
rank()
over(partition by deptno order by sal)
as emp_no
from emp;
 
dense_rank:    1,2,2,3,3,4
rank()        
select ename,deptno,sal,
dense_rank()
over(partition by deptno order by sal)
as emp_no
from emp;
 
集合操作
查询职务是manager的员工信息,工资大于2500的员工信息
union:  有重复就去掉   并
select ename,job,sal from emp where job='manager'
union
select ename,job,sal from emp where sal>2500;
union all:  显示重复的部分  并
select ename,job,sal from emp where job='manager'
union all
select ename,job,sal from emp where sal>2500;
intersect  交集
select ename,job,sal from emp where job='manager'
intersect
select ename,job,sal from emp where sal>2500;
minus  差集  第一个结果集中存在    在二个结果集中不存在
select ename,job,sal from emp where job='manager'
minus
select ename,job,sal from emp where sal>2500;
 
##视图
视图(view)也被称作虚表,即虚拟的表,是一组数据的逻辑表示
视图本身不包含任何数据,它包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化
 
视图作用:简化复杂查询   限制数据访问
 
select 语句是基于单表建立的,且不包含任何函数运算、表达式或分组函数,叫做简单视图,此时是基表的子集
select语句同样是基于单表,但是包含了单行函数、表达式、分组函数或者gruop by子句,叫做复杂视图
select语句是基于多个表的,叫做连接视图
 
写了or replace 是当视图存在的时候进行修改
create or replace view view_name  
as
select 子句
 
复杂视图是不能做增删改的  只有简单视图可以   但是对视图进行增删改是会改变原表的  不建议使用
定义视图的主要目的就是简化数据的查询
 
read only 只读
create or replace view view_name  
as
select 子句 with read only;
 
drop view 删除视图
 
## 序列
什么是序列:用来生成唯一数字值的数据库对象
作用:用来生成表的主键值
序列的定义:
create sequence dept_seq
start with 100
increment by 10
使用序列(取值)  
nextval  是取下一个值 select dept_seq.nextval from dual
currval  是取当前值
删除序列
drop sequence dept_seq
 
##索引:为了提高数据库的查询效率,建立的数据库对象
索引一旦被建立就将被oracle系统自动维护
 
索引的分类:
聚集索引:索引的顺序和表记录的顺序一致
非聚集索引:索引的顺序和表记录的顺序不一致
 
适合创建索引的列
1.主键列和唯一性约束列一定要建立索引
2.经常查询的数据列创建索引
3.经常出现在where子句中的列要创建索引
不适合创建索引的列
1.经常被修改的列
2.对于那些只有很少数据值的列也不应该增加索引
3.查询中很少涉及的列,重复值比较多的列不适合创建序列
4.数据表规模不是很大,不适合创建索引
 
创建索引   基于哪个表的哪个列
create index index_name on table_name(column)
create index emp_ename on emp(ename);
select * from emp  where ename = 'king';使用索引不需要指定具体的索引
删除索引
drop index emp_ename;
 
约束(constraint)的全称是约束条件,也称作完整性约束条件
约束是在数据表上强制执行的一些数据校验规则,当执行dml操作时,数据必须符合这些规则,如果不符合则无法执行
约束条件可以保证表中数据的完整性,保证数据见的商业逻辑
约束条件包括:
非空约束(not null)
唯一性约束(Unique)
主键约束(primary key)
外键约束(foreign key)
检查约束(check)
create table  test1(
tid number(4) primary key,
name varchar(20) not null,
email varchar(40),
gender char(1),
constraint email_un unique(email),    //约束名+约束类型
constraint gender_ck check(gender='F' or gender='M');
 
*如果表里面有外键,就称作外键表(从表),所指向的表称作主键表 (主表)
create table emp1(
empno number(4) primary key,
dname varchar2(30),
deptno,
constraint emp1_dept_fk foreign key(deptno) references dept1(deptno)
)
 
添加啊主键约束
create table t2(id number(4),name varchar(30));
alter table t2 add constraint t2_pk primary key(id);
 
###  plsql编程语言
pl/sql 是一种过程化的编程语言,运行于服务器端的编程语言
pl/sql是对于sql语言的扩展,pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大
pl/sql的特点
1.改善性能 pl/sql是以语句块的形式发送的降低了负载   sql则是以语句为单位的发送的
2.模块化 可以把不同的任务用不同的块来实现
3.可重用性  pl/sql定义存储过程和函数  实现了模块的可重用性
 
pl/sql块 声明+执行(必须有)+异常处理部分
1.只定义执行部分
begin dbms_output.put_line('hello!') ;
end;
2.包含声明部分和执行部分
declare v_name avrchar(30);
begin
select ename into v_ename from emp where empno = 7839;
dbms_output.put_line(v_ename);
end;
3.包含声明执行和异常部分
declare v_name avrchar(30);
begin
select ename into v_ename from emp where empno = 7839;
dbms_output.put_line(v_ename);
exception when no_date_found then
dbms_output.put_line('查无此人');
end;
pl/sql程序设计中的标识符定义与sql的标识符定义的要求相同
标识符号不能超过30个字符
第一个字符必须是字母
不分大小写
不能是sql保留字
## 建议使用的变量名方法
程序变量 V_name
程序常量 C_constant
游标常量 Name_cursor
记录类型 Name_type
参数 P_name
## pl/sql中的变量基本数据类型
char 定长字符串
varchar2 可变长度字符串
binary_integer 带符号整数,为整数计算优化性能
number(p,s) 数值
long 变长字符串
date 日期
boolean 布尔
rowid 存放数据库行号
 
定义变量,存储员工的姓名和工资
declare
v_name varchar2;
v_sal number(5);
v_x number(3) := 2;
begin select ename,sal into v_ename,v_sal from emp where empno = 7839;
dbms_output.put_line(v_ename || ',' || v_sal);    //用||连接内容
end;
 
参照表的列类型
表名.字段名%type
declare
v_name emp.eanme%type ; ...
 
记录类型
type 类型名 is record(
变量名1,变量名2,
)
declare  
type emp_record is record(
v_name emp.ename%type,
v_sal emp.sal%type
);
e emp_record;
begin
select ename,sal into e from emp where empno = 7839
dbms_output.put_line(e.v_ename || ',' || e.v_sal);
end;
 
参照记录类型
表名%rowtype
declare e emp%rowtype;
begin
select * into e
from emp
where empno = 7839;
dbms_output.put_line(e.eanme || ',' || e.sal || ',' || e.hiredate);
end;
原文地址:https://www.cnblogs.com/coder-ydq/p/13306470.html