[原创]关于ORACLE的使用入门
Oracle
===============================
数据库:
Oracle------>甲骨文(Oracle) 49+%
DB2---------->IBM 49+%
SqlServer---->微软
My Sql------->(Oracle) 开源典型
Oracle:(神谕)
数据的隔离采用用户的方式
userName
passWord
一个数据库的概念:一组内存,一组进程
user
sys:超级管理员
system:管理员
scott:普通用户
用户:可以直接被授权,被指定角色
角色:可以自定义 role 角色包含一组权限
权限:系统中固定 create any table
管理员的角色,可以操作用户和角色
Oracle提供命令行的方式来访问系统
sqlplus
*修改用户密码
alter user system identified by aaa;
(规范的写法都是大写)
*创建用户:
create user luchong identified by aaa;
用户必须被授权才能访问ORACLE数据库
*授权:
grant create any table to luchong;
角色:权限的集合
创建角色:
create role userrole;
角色授权:
grant create any table to userrole;
将角色授权给用户:
grant userrole to luchong;
connect:角色(包含与数据连接等操作的权限)
resource:角色(包含创建对象等的权限)
grant connect,resource to luchong;
conn luchong/aaa;//连接用户
撤销权限:
revoke create any table from luchong;
物理结构:
管理系统
全局数据库:一组日志文件,一组控制文件
一组数据文件.
data space
tablespace:表空间,逻辑概念,对应一个数据文件
Oracle中,创建的user如果指定表空间,管理系统会默认指定
user的默认表空间为users--users.dbf
一个用户会有默认表空间和临时表空间
默认表空间存储数据
临时表空间存储临时数据
sql命令->发送Oracle管理系统->编译sql命令
->形成执行计划->执行
创建表空间:
create tablespace luchongts datafile('d:/luchongts.data' size 50M);
创建用户指定表空间
create user luchong identified by aaa
default tablespace luchongts;
删除用户
drop user luchong;
SQL:Structured Query Language(结构化的查询语言)
SQL的分类:
DML(Data Manipulation Language)数据操作语言
insert update delete
DQL(Data Query Language)数据查询语言
select
CRUD:create Read Update Delete
DDL(Data Definition Language)数据定义语言
create drop alter
DCL(Data Control Language)数据控制语言
grant revoke
DTL(Data Transaction Language)数据事务语言
commit(提交) rollback(回滚)
savepoint(设置回滚点)
表的管理
create table tbname (
cname1 type(length)
......
);
1.Oracle中命名规则
*只能包含字母,数字,下划线,$和#
*长度限定在1-30个字符
*同一个数据库中的用户,不能有相同的用户名
*不能使用Oracle中的保留字和关键字
*Oracle中的名字不区分大小写
*见名知意
-user t_user
2.Oracle中常用的数据类型
*varchar2:变长字符类型 varchar2(10),
*char:不变长字符类型 char(18)
*number:数字 number(3) number(6,2) 六位数->其中两位是小数
*date:日期
创建一张表**
create table student(
id number(4),
name varchar2(10),
age number(2),
score number(4,1),
idcard char(18),
birth date
);
需求:创建商品表(编号,名称,价格,类别编号)
商品类别表(编号,类别名)
create table product(
product number(4),
productname varchar2(20),
price number(7,2),
categoryno number(2)
);
create table category(
categoryno number(2),
categoryname varchar2(10)
);
查看表结构
desc product;
约束:保证数据的完整性
数据完整性:业务数据的正确性和完备性,
包含实体完整性,域完整性,参照完整性
*主键约束:primary key
*外键约束:foreign key,references
*非空约束:not null
*唯一约束:unique
*检查约束:check
*主键约束:字段中的数据非空 唯一
主键,用来标识记录,开发中,表一定有主键
表只能有一个主键,可以有多个字段组成一个主键.
添加主键的语法:
字段级约束,将约束直接在字段中添加
表级约束,字段定义结束后添加
*以用户表为例
*第一种方式
自己命名
create table t_user1(
id number(4)
constraint t_user1_id_pk primary key,
username varchar2(20),
userpwd varchar2(16),
name varchar2(20)
);
*第二种方式
使用系统默认方式命名
create table t_user2(
id number(4) primary key,
username varchar2(20),
userpwd varchar2(16),
name varchar2(20)
);
表级约束:
create table t_user3(
id number(4),
username varchar2(20),
userpwd varchar2(16),
name varchar2(20),
constraint t_user3_id_pk primary key(id)---使用默认名的表级约束
); create table t_user4(
id number(4),
username varchar2(20),
userpwd varchar2(16),
name varchar2(20)
);
通过修改表添加主键:
alter table t_user4 add primary key(id);
*外键约束:
字段必须参照某个表的主键的值
foreign key,references
部门表:(deptno,dname,loc)
deptnop primary key
员工表:(empno,ename,sal,job,deptno)
empno primary key
deptno foreign key
*添加外键约束
*方式一
create table dept1(
deptno number(2) primary key,
dname varchar2(10),
loc varchar2(20)
);
create table emp1(
empno number(4) primary key,
ename varchar2(20),
sal number(7,2),
job varchar2(20),
deptno number(2) references dept1(deptno)
);
*方式二
create table emp2(
empno number(4) primary key,
ename varchar2(20),
sal number(7,2),
job varchar2(20),
deptno number(2),
foreign key(deptno) references dept1(deptno)
); create table emp3(
empno number(4) primary key,
ename varchar2(20),
sal number(7,2),
job varchar2(20),
deptno number(2)
);
***开放中比较常用
alter table emp3 add foreign key(deptno)
references dept1(deptno);
*********
create table emp4(
empno number(4) primary key,
ename varchar2(20) not null,
sal number(7,2) check(sal between 800 and 20000),
idcard char(18) unique,
job varchar2(20),
deptno number(2)
);
修改表 alter table ....
添加字段:
alter table emp4 add comm number(6,2);
修改字段类型
alter table emp4 modify comm number(7,2);
删除字段
alter table emp4 drop (comm);
删除表:
drop table emp4;删除表结构
truncate table emp4;截断表(截断所有的数据,数据无法恢复)
delete from emp4;删除所有的数据(数据可以恢复,开发使用)
DML(核心)
*insert 添加记录
dept(deptno,name,loc)
emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
-----创建表
create table emp(
empno number(4) primary key,
ename varchar2(12),
job varchar2(20),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(6,2),
deptno number(2)
);
create table dept(
deptno number(2) primary key,
dname varchar2(12),
loc varchar2(10)
);
添加外键
alter table emp add foreign key(mgr)
references emp(empno);
alter table emp add foreign key(deptno)
references dept(deptno); insert into dept values(10,'财务部','海淀区');
insert into dept(deptno,dname,loc)values(20,'研发部','西城区');
commit;
select * from dept;
insert into dept(deptno,dname,loc)values(30,'市场部','东城区');
insert into dept(deptno,dname,loc)values(40,'审计部','朝阳区'); insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(7000,'KING','总裁',null,'13-1月-2013',25000,null,10); insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(7369,'刘德华','经理',7000,'13-3月-2013',18000,200,10); insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(7469,'李宇春','经理',7000,'15-3月-2013',22000,200,20); insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(7470,'詹姆斯','经理',7000,'1-4月-2014',21000,200,20); insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(7370,'SMITH','普通员工',7000,'10-1月-2014',8000,500,10);
复制数据
create table emp_copy
as select * from emp;
复制表数据
insert into emp_copy
select * from emp_copy;
*修改数据
update
update emp set job='数据分析员' where ename='詹姆斯';
---多个一起修改
update emp set job='数据分析员' where empno=7469 or empno=7370;
*删除数据
delete
delete from emp where empno =7370;
delete from emp where empno in(1000,2000,3000,4000);
*查询数据
select cn1,cn2,cn3......tablename;
select cn1 from tablename;
select * from tablename;
*条件查询
select ...from ....where条件
比较:>,>=,<,<=,=,!=,<>(不等)
需求:职位不是经理的员工信息
select empno,ename,job,sal,comm,deptno,hiredate,mgr
from emp where job<>'经理';
需求:查询所有普通员工的信息
select empno,ename,job,sal,comm,deptno,hiredate,mgr
from emp where job='普通员工';
----值区分大小写
需求:列出入职日期在2005年后的员工名,入职日期
select ename,hiredate from emp
where hiredate>='1-1月-2015';
Oracle续=========================
查询
null值查询 is null ,is not null
查询没有奖金的员工的姓名,工资,奖金
select ename,sal,comm from emp
where comm is null or comm=0;
布尔连接
and,与的运算
or,或的运算
需求:列出05年后入职,工资大于8000的员工的姓名
入职日期,工资.
select ename,hiredate,sal from emp
where hiredate>'1-1月-2015' and sal >8000;
---给表起别名
select e.ename,e.hiredate,sal
from emp e where ......
--双引号可以用来给字段起别名
select e.ename,e.hiredate as "薪水",sal
from emp e where ...... String sql="select ename,hiredate,sal where 1=1";
//使用append追加(多条件查询)
=======================================
or,或的运算
需求:涨薪,职位是普通员工
或没有奖金的员工的工资涨薪500,
列出,涨薪后的员工姓名,工资
select ename,sal+500 as nsal from emp
where job='普通员工' or comm is null;
==================================
模糊查询
like
%:若干位若干字符 J%(J开头后面不管)
_(下划线):一位若干字符_I __I%(表示第三位是I后面不管)
需求:列出员工姓名,工资,入职日期
姓名中必须包含用户输入的内容
select ename,sal,hiredate from emp
where ename like '%KI%';(名字中只要有KI)
==================================
范围
in,not in
需求:列出10,20号部门的员工姓名,工资
部门号.
select ename,sal,hiredate from emp
where deptno in(10,20);
between....and,not between....and
需求:列出13年1月份到14年1月份入职员工姓名,
入职日期.
select ename,hiredate from emp
where hiredate between '1-1月-2013' and
'1-1月-2014';
***排序查询***
order by:指定排序字段
asc:升序(默认)
desc:降序
数字从小到大
日期从早到晚
字符根据字母序
排序可以有多个参考字段,参考顺序从前到后
需求:根据查询20号部门的员工姓名,工资,入职日期
根据工资降序排序.
select ename,sal,hiredate from emp
where deptno=20 order by sal desc;
需求:列出工资大于10000的员工姓名,工资,入职日期,
根据入职日期升序,工资降序排序
select ename,sal,hiredate from emp
where sal>10000 order by sal desc and hiredate asc;
*null值所在值中排序最大
需求:列出员工姓名,工资,奖金
根据奖金降序显示数据。
select ename,sal,comm from emp
order by comm desc;
分组查询;
分组:group by
运算:组函数 sum avg max min count
需求:统计公司内部有多少个员工?
---- 查询表的记录数
select count(empno) from emp;
需求:列出公司内部每种职位的员工的工资总和.
select job,sum(sal) from emp
group by job;
需求:列出公司内部每个部门的员工工资平均值
select deptno,avg(sal) avg_sal,
max(sal) max_sal,min(sal) min_sal
from emp
group by deptno;
注意:分组查询只能查询分组字段,和组函数运算的结果.
需求:列出平均工资大于10000的部门号
和平均工资
having:筛选分组后的结果
select deptno,avg(sal) from emp
group by deptno having avg(sal)>10000;
需求:列出部门号大于10号部门,平均工资
大于10000的部门号和平均工资.
select deptno,avg(sal) from emp
where deptno>10 group by deptno
having avg(sal)>10000;
需求:列出部门号大于10号部门,平均工资大于
大于10000的部门号和平均工资.根据平均工资降序排序
select deptno,avg(sal) from emp
where deptno>10 group by deptno
having avg(sal)>10000 order by avg(sal) desc;
=================================================
关联查询(多表查询)
连接条件
KING 财务部
需求:列出员工名,部门名,部门号,部门地址
select ename,deptno,dname,loc from
emp,dept;
笛卡尔乘积现象(避免)
select ename,e.deptno,dname,loc from
emp e,dept d where e.deptno=d.deptno;
*内连接查询 都是满足连接条件的数据
select..from t1 inner join t2
on 连接条件
需求:列出员工名,部门名,部门号,部门地址
------内连接-----
select ename,e.deptno,dname,loc from
emp e inner join dept d on e.deptno=d.deptno;
---等值查询,与内连接返回的数据相同--
select ename,e.deptno,dname,loc from
emp e,dept d where e.deptno=d.deptno;
*外连接:保证数据的不缺失
左外连接:保证左表数据不缺失
右外连接:保证右表数据不缺失
全外连接:保证所有表数据不缺失
需求:列出员工名,部门名,部门号,部门地址
左外连接来实现:(一般常用)--1
select ename,e.deptno,dname,loc
from emp e left outer join dept d
on e.deptno=d.deptno;
左外方式二(Oracle中有的)
select ename,e.deptno,dname,loc
from emp e,dept d
where e.deptno=d.deptno(+); select ename,e.deptno,dname,loc
from emp e left join dept d
on e.deptno=d.deptno;
---------结果是一样的------
右外连接实现
select ename,e.deptno,dname,loc
from dept d right outer join emp e
on e.deptno=d.deptno;
------全外连接
select ename,e.deptno,dname,loc
from emp e full outer join dept d
on e.deptno=d.deptno;
需求:列出员工号,员工姓名,经理工号,
经理的姓名
自连接
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1 left join emp e2 on
e1.mgr=e2.empno;
需求:列出员工号,员工姓名,经理工号,
经理的姓名,员工的部门地址,
部门号
------超过两张表的左外连接-----
select e1.empno,e1.ename,e1.mgr,e2.ename,dname,loc,d.deptno
from emp e1 left join emp e2 on
e1.mgr=e2.empno left join dept d
on e1.deptno=d.deptno;
=================================================
SQL中常用的函数
*字符函数
lower,upper
select ename,job,sal from emp
where lower(ename)='king';
concat(连接字符串)
select concat('Hello','Oracle!')
from dual;
------ ||(表示拼接)
select 'Hello'|| 'oracle'from dual;(效果同上)
My sal is 1000,I hope 2000!;
select ename || '''s sal is' || sal ||',I hope' || sal*2 || '!'
from emp; length,substr
select ename,length(ename) 字符数,
hiredate,substr(hiredate,0,2) from // 0:表示第0个位置 2:表示第二个位置
emp;
*数学函数
round:四舍五入
trunc:截断
mod:求余
select round(45.54,2) from dual;
select trunc(45.562) from dual;
select mod(10,2) from dual;
*日期函数
sysdate(返回当前系统的时间)
select sysdate from dual;
日期可以运算
select hiredate ,hiredate+1 from emp;
*months_between(两个日期之间的间隔天数)
需求:列出员工姓名,入职月数
select ename,
round(months_between(sysdate,hiredate))
from emp where hiredate is not null;
add_months
select add_months(sysdate,3) from dual;
next_day 下个星期对应的日期
select next_day(sysdate,'星期三') from dual;
last_day 某月最后一天的日期
select last_day(sysdate) from dual;
round,(<=15舍掉日 >15,加一日)
select round(sysdate,'MONTH') from dual;
trunc
select trunc(sysdate,'DAY') from dual;
extract:返回指定的年或月或日
select extract(month from sysdate) from dual;
select extract(year from sysdate) from dual;
===========================================================================
*转换函数
to_char:日期转换特定格式的字符串(***************)
select ename,to_char(hiredate,'yyyy-MM-dd') from emp;
yyyy:4位数字表示年
mm:2位数字表示月份
dd:2位数字表示日
year:用英文单词表示年
dy:星期的单词前3位
2016年06月06号
select ename,to_char(hiredate,'yyyy"年"MM"月"dd"日"')
from emp;
timestamp类型,常用的日期类型,包含时分秒
create table t_usersys(
id number(4) primary key,
registtime timestamp default systimestamp
);
select id,to_char(registtime,'YYYY-MM-DD HH24:MI:SS')---时 分 秒
from t_usersys;
to_date:将字符串转换为日期(******************)
2016-6-6 06:06:06
insert into t_usersys(id,registtime)values(1002,to_date('2016-6-6 06:06:06','YYYY-MM-DD HH24:MI:SS'));
to_char:将数字转换到特殊格式的字符串
9:表示任意一位的数字
$:美元符号
L:本地货币符号
select ename,sal,to_char(sal,'L999,999,999,99')
from emp;
空值计算:
nvl:nvl(comm,0)(当comm为null时就把它换成是0)
select ename,sal,comm,(sal+nvl(comm,0))*12 年薪 from emp;
去重:
select distinct job from emp;
======================================================================
子查询
需求:列出20号部门中,比30号部门平均工资大的员工姓名,工资,职位
select ename,sal,job from emp
where deptno=20 and
sal>(select avg(sal)
from emp where deptno=30);
(先执行子查询)
需求:列出SMITH的同部门同事的姓名.工资,部门号..
select ename,sal,deptno from emp where deptno=
(select deptno from emp where lower(ename)='smith')
and lower (ename)<>'smith';
in:在范围之内
需求:列出包含20号部门中的职位的员工的姓名,职位,工资。
select ename,job,sal from emp where job in(
select distinct job from emp where deptno=20);
all:所有
any:任意一个
需求:列出员工姓名,工资,职位工资大于20号部门所有员工工资
的姓名,工资,职位.(>max)
select ename,sal,job from emp where sal > all(select sal from
emp where deptno=20
);
需求:列出员工姓名,工资,职位工资大于20号部门任意一个员工工资
的姓名,工资,职位.(>min)
select ename,sal,job from emp where sal > any(select sal from
emp where deptno=20
);
需求:将员工工资低于20号部门平均工资的员工工资涨薪500
update emp set sal=sal+500 where sal <(select avg(sal) from emp where deptno=20);
子查询也可以用在from子句中
select e.* from (select * from emp where deptno=20)e;
(关联子查询)
需求:有下属的员工姓名,工资
exists:是否存在
select empno,ename,sal from emp e where exists(
select mgr from emp where mgr=e.empno
);
需求:列出工资大于本部门平均工资的员工姓名,工资,奖金,部门号.
select ename,sal,comm,deptno
from emp e where sal >(
select avg(sal) from emp where deptno=e.deptno
);
==========================================================
集合操作
union,union all(合并集合)
需求;查询20号部门,工资大于10000,
将两个集合合并
select ename,sal,deptno from emp
where deptno=20;
-----union去重合并---------
-----union all---不去重合并------
select ename,sal,deptno from emp
where sal>10000; select ename,sal,deptno from emp where deptno=20
union
select ename,sal,deptno from emp where sal>10000;
intersect 获取两个结果集的(交集)
查询职位是经理,工资大于10000
select ename,job,sal from emp
where job='经理' intersect
select ename,job,sal from emp
where sal >10000;
minus:(差集)
rownum:行号,伪列
select empno,ename,rownum from emp where
rownum<=10 minus
select empno,ename,rownum from emp where
rownum<=5;
============================================
Oracle中的分页查询(*****)
page:当前页数
pageSize(perPage):每页条目
begin=(page-1)*pageSize;
end=page*pageSize;
显示任意一段记录
4-6
select ename,sal,r from (
select ename,sal,rownum r from emp where rownum<=6
)where r>=4;
---效果同上---(********开发常用*****)
select ename,sal,r from(
select e.ename,e.sal,rownum r from
(select ename,sal from emp)e)
where r>=4 and r<=6;
----比较好理解的一种(*****开发常用*****)
select ename,sal,r from(
select ename,sal ,rownum r from emp)
where r between 4 and 6; mysql分页:limit 限定
select ename,sal from emp
limit 10,5;//第一个数字是开始位置,第二个数字是每页显示的最大数
==================================================================
序列(sequence):是一种用来生成唯一数字值
的数据库对象(重要)
序列的值由Oracle程序按递增或递减的顺序自动生成的
是一种高效的获取唯一键值的途径.
序列是独立的字段
通常情况下,一个序列为一个表提供主键值。(也可以为多个表
提供主键值。
)
------序列举例
create table t_user_hjf(
id number(4),
username varchar2(20),
password varchar2(20)
);
----创建一个简单的序列---
create sequence userseq;
1 递增1
序列的应用:
nextval:获取序列的下一个值
currval:获取序列当前值
*必须访问nextval之后才能访问currval*
insert into t_user_hjf(id,username,password)values(userseq.nextval,'aaa','aaa');
create sequence lcseq start with 1000 ---起始值
increment by 10---步长
maxvalue 9990---最大值
cycle---自动循环
--nocycle---不自动循环
cache 30----缓存中存储值的个数
--nocache----不缓存
====================================================
视图(view):命名的查询,虚表
虚拟的表,是一组数据的逻辑表示
本身并没有数据,它只包含映射到
基表的一个查询语句.
用户创建视图,需要用户具备创建视图的权限
create view或create any view
授权:grant create any view to hjf2;
create or replace view empview as
select ename,sal,comm,job from emp;
应用视图:
select * from empview;
简单视图:基于单表,没有使用函数,组函数,group by的字句
复杂视图:基于单表,可能包含单行函数,表达式,分组函数,group by字句等
不能实现DML操作
连接视图:基于多表
需求:创建视图,列出每个部门的员工的平均工资,最大工资,最小工资
工资总和。
create view empsalview
as
select avg(sal) avg_sal ---在使用函数时必须起别名
,deptno,max(sal) max_sal, ---在使用函数时必须起别名
min(sal) min_sal ---在使用函数时必须起别名
,sum(sal) sum_sal ---在使用函数时必须起别名
from emp group by deptno;
应用视图:select * from empsalview;
通过视图来做DML操作
create or replace view empview as---创建视图
select empno,ename,sal,comm,job from emp; insert into empview values(lcseq.nextval,'黄剑飞',20000,1000,'数据分析员');--插入数据 delete from empview where ename='黄剑飞';---删除数据
带有约束视图
*with check option
DML操作只能
create or replace view empview
as
select empno,ename,deptno
from emp
where deptno=10
with check option;
---添加数据失败 部门号只能是10---(加了with check option以后)
insert into empview values(
lcseq.nextval,'李四',20
);
-----正确的方式---------
insert into empview values(
lcseq.nextval,'李四',10
); *with read only:只读,不支持DML
create or replace view empview
as
select empno,ename,deptno
from emp
where deptno=10
with read only; ---只读视图---
----添加数据失败 只读--------
insert into empview values(
lcseq.nextval,'李四',10
); 数据字典 也是表
user_tables
select * from user_tables;
user_views
select * from user_views;
user_sequences
select * from user_sequences; =====================================================
索引(index):
create index emp_copy_empno_index
on
emp_copy(empno); create index emp_copy_ename_job_index
on
emp_copy(ename,job);
Oracle中主键字段,unique字段(自动添加索引)
删除索引:
drop index myindex;
======================================================
表设计的三大范式
第一范式:原子性
第二范式:完全依赖
第三范式:依赖不能传递
id ename sal comm deptno(pk)
1001 张三
id deptno loc
=============================
事务:一组SQL语句操作的逻辑单元
事务的机制:可以保证一组操作,完全成功
执行,完成整个工作单元
特点:(ACID)
Atomicity(原子性)*
事务的原子性是指包含的操作要么全成功,要么全失败.可以保证
数据的一致性。
Consistency(一致性)*
事务前后,会保证数据的一致性的业务规则。
Isolation(隔离性)*
隔离级别:
read nocommit;读不提交
read commit;读提交
serialize;串行化
数据库支持多个事务并发对数据进行读写,修改的操作
不同的事务之间,不会相互影响.
避免交叉操作数据带来数据的不一致性
Durability(持久性)
事务结束对数据的修改应该是持久的.
commit;提交
rollback;回滚
savepoint s;
rollback s;
===================================================
数据库项目:(管理员管理,角色管理,权限)
*表的创建 设计
*数据的初始化
*功能的SQL语句
数据的对应关系
一对多的对应关系
关系模型:主表 从表(FK)
多对多的对应关系
关系模型: 表A(aid) 表B(bid) 表AB(aid,bid)
primary key(aid,bid)
admin
aid username pwd rid
1001 张飞 aaa 30
1002 刘备 aaa 30
admin_role(中间表)
aid rid
1001 10
1001 20
1001 30
1002 20
role
rid rolename
10 超级管理员
20 普通管理员
30 角色管理员
role_privi(中间表)
rid pid
10 1
10 2
10 3
10 4
20 3
privi
pid pname
1 管理员管理
2 角色管理
3 资费管理
4 账务账号管理
t_privilege(权限表)
pid(pk) name
privilege_role(权限角色表)
rid(fk) pid(fk)
pk(rid,pid)
t_role(角色表)
rid(pk) name
-----创建权限表---
CREATE TABLE t_privilege(
pid NUMBER(2) PRIMARY KEY,
name VARCHAR2(20)
);
-----创建角色表----
CREATE TABLE t_role(
rid NUMBER(2) PRIMARY KEY,
name VARCHAR2(20)
);
----创建权限角色表---(中间表)
CREATE TABLE privilege_role(
rid NUMBER(2),
pid NUMBER(2),
PRIMARY KEY(rid,pid)
);
---给中间表添加一个外键----
ALTER TABLE privilege_role ADD
FOREIGN KEY(rid) REFERENCES t_role(rid);
---给中间表添加一个外键----
ALTER TABLE privilege_role ADD
FOREIGN KEY(pid) REFERENCES t_privilege(pid);
-----角色表创建序列-----
CREATE SEQUENCE roleseq;
----------初始化权限表的数据---
INSERT INTO t_privilege VALUES(
1,'角色管理'
);
INSERT INTO t_privilege VALUES(
2,'管理员管理'
);
INSERT INTO t_privilege VALUES(
3,'资费管理'
);
INSERT INTO t_privilege VALUES(
4,'账务账号管理'
);
INSERT INTO t_privilege VALUES(
5,'业务账号管理'
);
INSERT INTO t_privilege VALUES(
6,'账单管理'
);
INSERT INTO t_privilege VALUES(
7,'报表管理'
);
-----初始化角色表的数据--------
INSERT INTO t_role VALUES(
roleseq.NEXTVAL,'超级管理员'
);
INSERT INTO t_role VALUES(
roleseq.NEXTVAL,'管理员'
);
INSERT INTO t_role VALUES(
roleseq.NEXTVAL,'账号管理员'
);
--初始化角色权限表数据----------
INSERT INTO privilege_role VALUES(
1,1
);
INSERT INTO privilege_role VALUES(
1,2
);
INSERT INTO privilege_role VALUES(
1,3
);
INSERT INTO privilege_role VALUES(
1,4
);
INSERT INTO privilege_role VALUES(
1,5
);
INSERT INTO privilege_role VALUES(
1,6
);
INSERT INTO privilege_role VALUES(
1,7
);
INSERT INTO privilege_role VALUES(
2,1
);
INSERT INTO privilege_role VALUES(
2,2
);
INSERT INTO privilege_role VALUES(
2,3
);
INSERT INTO privilege_role VALUES(
3,5
);
INSERT INTO privilege_role VALUES(
3,6
);
INSERT INTO privilege_role VALUES(
3,7
);
------创建管理员表------
CREATE TABLE t_admin(
aid number(4) PRIMARY KEY,
admin_code VARCHAR2(30),
password VARCHAR2(8),
name VARCHAR2(20),
telephone VARCHAR2(15),
email VARCHAR2(50),
enrolldate DATE
);
-----创建管理员序列---
CREATE SEQUENCE adminseq
START WITH 1000
INCREMENT BY 10;
-----初始化管理员表数据---
INSERT INTO t_admin VALUES(
adminseq.NEXTVAL,'admin','aaa',
'刘备','','liubei@tedu.cn',
SYSDATE
);
INSERT INTO t_admin VALUES(
adminseq.NEXTVAL,'guanyu','aaa',
'关羽','','guanyu@tedu.cn',
SYSDATE
);
INSERT INTO t_admin VALUES(
adminseq.NEXTVAL,'zhangfei','aaa',
'张飞','','zhangfei@tedu.cn',
SYSDATE
);
INSERT INTO t_admin VALUES(
adminseq.NEXTVAL,'lvbu','aaa',
'吕布','','lvbu@tedu.cn',
SYSDATE
);
------创建管理员角色表---
CREATE TABLE admin_role(
aid NUMBER(4),
rid NUMBER(4),
PRIMARY KEY(aid,rid)
);
-----给管理员角色表添加外键---
ALTER TABLE admin_role ADD
FOREIGN KEY(aid) REFERENCES t_admin(aid);
ALTER TABLE admin_role ADD
FOREIGN KEY(rid) REFERENCES t_role(rid);
-----初始化管理员角色表的数据---
INSERT INTO admin_role VALUES(
1010,2
);
INSERT INTO admin_role VALUES(
1020,3
);
INSERT INTO admin_role VALUES(
1030,2
);
INSERT INTO admin_role VALUES(
1030,3
);
INSERT INTO admin_role VALUES(
1030,1
);
==============================================
实现项目中角色管理的功能
1,分页显示角色
SELECT rid,name FROM
(SELECT rid,name,rownum r
FROM t_role
WHERE rownum<=2)
WHERE r>=1;
2:根据已知角色的id,显示对应的
权限的名字
SELECT name FROM
t_privilege p LEFT JOIN privilege_role pr
ON p.pid=pr.pid
WHERE
pr.rid=1;
3:添加角色并授权
INSERT INTO t_role(rid,name)VALUES(
roleseq.NEXTVAL,'资费管理员'
);
---授权---
INSERT INTO privilege_role(rid,pid)VALUES(
4,1
);
INSERT INTO privilege_role(rid,pid)VALUES(
4,2
);
4:点击去修改的链接,根据角色ID,查询角色信息以及权限ID
SELECT rid,name FROM t_role WHERE
rid=1; SELECT pid FROM privilege_role WHERE
rid=1; SELECT r.rid,name,pr.pid FROM t_role r LEFT JOIN
privilege_role pr ON
r.rid=pr.rid where
r.rid=1;
5:点击确认修改按钮
*修改角色的名字
UPDATE t_role SET name='超级管理员'
WHERE rid=4;
*修改角色权限
先清空角色权限,在添加新权限
DELETE FROM privilege_role WHERE rid=1;
INSERT INTO privilege_role(rid,pid)
VALUES(4,1);
INSERT INTO privilege_role(rid,pid)
VALUES(4,2);
INSERT INTO privilege_role(rid,pid)
VALUES(4,3);
6:删除角色
先删除中间表角色与权限的对应关系
DELETE FROM privilege_role
WHERE rid=4;
DELETE FROM t_role
WHERE rid=4;
实现项目中的管理员模块查询功能
动态条件分页查询管路员功能
aid name
1001 张三
1002 李四
rid name
1 超级管理员
2 管理员
pid name
1 角色管理
2 管理员管理
SELECT aid,name,email FROM t_admin
WHERE aid IN(
SELECT DISTINCT aid FROM admin_role
WHERE rid IN(
SELECT DISTINCT rid FROM privilege_role
WHERE pid=1
)
);
----------------------------------------------
*查询权限ID为1对应的管理员的ID和NAME
SELECT DISTINCT a.aid,name FROM t_admin a
JOIN admin_role ar ON a.aid=ar.aid
JOIN privilege_role pr ON ar.rid=pr.rid
WHERE pr.pid=1;
------分页---------------------------------
SELECT aid,name FROM(
SELECT aid,name,ROWNUM r FROM(
SELECT DISTINCT a.aid,name FROM t_admin a
JOIN admin_role ar ON a.aid=ar.aid
JOIN privilege_role pr ON ar.rid=pr.rid
WHERE 1=1
AND pr.pid=1
AND ar.aid=2
)WHERE ROWNUM<=4)
WHERE r>=3;
--------------------------------------------
登录:
*查询登录用户的详细信息(此处默认是管理员)
SELECT aid,name,admin_code,password
FROM t_admin
WHERE admin_code='admin'
AND password='aaa';
*查询登录用户的具备的权限(假设当前的用户为1010号管理员)
SELECT DISTINCT pid FROM admin_role ar
JOIN privilege_role pr ON
ar.rid=pr.rid
WHERE ar.aid=1010;
作者:little飞 出处:http://www.cnblogs.com/little-fly/ 欢迎转载 也请保留这段声明 谢谢!
[原创]关于ORACLE的使用入门的更多相关文章
- Oracle数据库基础入门《二》Oracle内存结构
Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...
- Oracle数据库基础入门《一》Oracle服务器的构成
Oracle数据库基础入门<一>Oracle服务器的构成 Oracle 服务器是一个具有高性能和高可靠性面向对象关系型数据库管理系统,也是一 个高效的 SQL 语句执行环境. Oracle ...
- Oracle 基础知识入门
前记: 近来项目用到Oracle数据库,大学学了点,后面基本忘记得差不多了,虽然基本语法跟sql 差不多,但是oracle知识是非常多的. 这里简单说点基础知识,希望后面补上更多的关于ORacle知识 ...
- Oracle数据库从入门到精通 单行函数问题
视频课程:李兴华 Oracle从入门到精通视频课程 学习者:阳光罗诺 视频来源:51CTO学院 Oracle数据库从入门到精通-单行函数 在数据库中,为了方便用户的数据开发,往往会提供一系列的支持函数 ...
- Oracle PL/SQL入门之慨述
Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...
- 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
[原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...
- 【原创】oracle的tpc-c测试及方法
大家好,很高兴来到博客园分享自己的所见所得.希望和大家多多交流,共同进步. 本文重点在于简介使用BenchmarkSQL对oracle进行tpcc的测试步骤,只是一个简单入门的过程. 开源测试工具:B ...
- Oracle数据库从入门到精通-分组统计查询
视频课程:李兴华 Oracle从入门到精通 视频课程学习者:阳光罗诺 视频来源:51CTO学院 整体内容: 统计函数的使用 分组统计查询的实现 对分组的数据过滤 统计函数 在之前我们就学习过一个COU ...
- Oracle数据库从入门到精通 多表查询知识以及范例
视频课程:李兴华 Oracle从入门到精通视频课程 学习者:阳光罗诺 视频来源:51CTO学院 总体内容: 多表查询的意义以及基本问题. 表的连接查询 SQL:1999语法标准对多表查询的支持. 数据 ...
随机推荐
- Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...
- C# 对象实例化 用json保存 泛型类 可以很方便的保存程序设置
用于永久化对象,什么程序都行,依赖NewtonSoft.用于json序列化和反序列化. using Newtonsoft.Json; using System; using System.Collec ...
- (转)从0开始搭建SQL Server AlwaysOn 第一篇(配置域控+域用户DCADMIN)
原文地址: http://www.cnblogs.com/lyhabc/p/4678330.html 实验环境: 准备工作 软件准备 (1) SQL Server 2012 (2) Windows S ...
- 一个无限加载瀑布流jquery实现
实现大概是下面的效果,写了比较详细的注释 <!DOCTYPE html><html> <head> <meta charset="UTF-8&quo ...
- 我的MYSQL学习心得(五) 运算符
我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 浅谈SOA
概念 wiki对于SOA定义如下: A service-oriented architecture (SOA) is a design pattern in which application com ...
- 应用Grunt自动化地优化你的项目前端
在不久前我曾写了一篇 应用r.js来优化你的前端 的文章,为大家介绍了r.js这个实用工具,它可以很好地压缩.合并前端文件并打包整个项目.但是如果将r.js放到项目中,我们不得不顾及到一个问题——项目 ...
- ASP.NET MVC Model绑定(一)
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
- CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换
CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换 三维世界里的旋转(rotate),可以用一个3x3的矩阵描述:可以用(旋转角度float+旋转轴vec3)描述.数学家欧拉证明了这两种形式可 ...
- 安装keil MDK5
昨天买的stm32板子今天就到了,顺丰速度确实很快. 我这是刚开始整STM32,首先需要下载keil MDK,直接杀去keil官网下载,其实对于学习者,我建议大家下载软件能去官网就去官网,尽量少用二道 ...