Oracle
===============================
数据库:
Oracle------>甲骨文(Oracle) 49+%
DB2---------->IBM 49+%
SqlServer---->微软
My Sql------->(Oracle) 开源典型
Oracle:(神谕)
数据的隔离采用用户的方式
userName
passWord
一个数据库的概念:一组内存,一组进程
user
sys:超级管理员
system:管理员
scott:普通用户
用户:可以直接被授权,被指定角色
角色:可以自定义 role 角色包含一组权限
权限:系统中固定 create any table
管理员的角色,可以操作用户和角色
Oracle提供命令行的方式来访问系统
sqlplus
*修改用户密码
1 alter user system identified by aaa;
(规范的写法都是大写)
*创建用户:
1 create user luchong identified by aaa;
用户必须被授权才能访问ORACLE数据库
*授权:
1 grant create any table to luchong;
角色:权限的集合
创建角色:
1 create role userrole;
角色授权:
1 grant create any table to userrole;
将角色授权给用户:
1 grant userrole to luchong;
connect:角色(包含与数据连接等操作的权限)
resource:角色(包含创建对象等的权限)
1 grant connect,resource to luchong; 2 conn luchong/aaa;//连接用户
撤销权限:
1 revoke create any table from luchong;
物理结构:
管理系统
全局数据库:一组日志文件,一组控制文件
一组数据文件.
data space
tablespace:表空间,逻辑概念,对应一个数据文件
Oracle中,创建的user如果指定表空间,管理系统会默认指定
user的默认表空间为users--users.dbf
一个用户会有默认表空间和临时表空间
默认表空间存储数据
临时表空间存储临时数据
sql命令->发送Oracle管理系统->编译sql命令
->形成执行计划->执行
创建表空间:
1 create tablespace luchongts datafile('d:/luchongts.data' size 50M);
创建用户指定表空间
1 create user luchong identified by aaa 2 default tablespace luchongts;
删除用户
1 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(设置回滚点)
表的管理
1 create table tbname ( 2 cname1 type(length) 3 ...... 4 );
1.Oracle中命名规则
*只能包含字母,数字,下划线,$和#
*长度限定在1-30个字符
*同一个数据库中的用户,不能有相同的用户名
*不能使用Oracle中的保留字和关键字
*Oracle中的名字不区分大小写
*见名知意
-user t_user
2.Oracle中常用的数据类型
*varchar2:变长字符类型 varchar2(10),
*char:不变长字符类型 char(18)
*number:数字 number(3) number(6,2) 六位数->其中两位是小数
*date:日期
创建一张表**
1 create table student( 2 id number(4), 3 name varchar2(10), 4 age number(2), 5 score number(4,1), 6 idcard char(18), 7 birth date 8 );
需求:创建商品表(编号,名称,价格,类别编号)
商品类别表(编号,类别名)
1 create table product( 2 product number(4), 3 productname varchar2(20), 4 price number(7,2), 5 categoryno number(2) 6 ); 7 create table category( 8 categoryno number(2), 9 categoryname varchar2(10) 10 );
查看表结构
desc product;
约束:保证数据的完整性
数据完整性:业务数据的正确性和完备性,
包含实体完整性,域完整性,参照完整性
*主键约束:primary key
*外键约束:foreign key,references
*非空约束:not null
*唯一约束:unique
*检查约束:check
*主键约束:字段中的数据非空 唯一
主键,用来标识记录,开发中,表一定有主键
表只能有一个主键,可以有多个字段组成一个主键.
添加主键的语法:
字段级约束,将约束直接在字段中添加
表级约束,字段定义结束后添加
*以用户表为例
*第一种方式
自己命名
1 create table t_user1( 2 id number(4) 3 constraint t_user1_id_pk primary key, 4 username varchar2(20), 5 userpwd varchar2(16), 6 name varchar2(20) 7 );
*第二种方式
使用系统默认方式命名
1 create table t_user2( 2 id number(4) primary key, 3 username varchar2(20), 4 userpwd varchar2(16), 5 name varchar2(20) 6 );
表级约束:
1 create table t_user3( 2 id number(4), 3 username varchar2(20), 4 userpwd varchar2(16), 5 name varchar2(20), 6 constraint t_user3_id_pk primary key(id)---使用默认名的表级约束 7 ); 8 9 create table t_user4( 10 id number(4), 11 username varchar2(20), 12 userpwd varchar2(16), 13 name varchar2(20) 14 );
通过修改表添加主键:
1 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
*添加外键约束
*方式一
1 create table dept1( 2 deptno number(2) primary key, 3 dname varchar2(10), 4 loc varchar2(20) 5 ); 6 create table emp1( 7 empno number(4) primary key, 8 ename varchar2(20), 9 sal number(7,2), 10 job varchar2(20), 11 deptno number(2) references dept1(deptno) 12 );
*方式二
1 create table emp2( 2 empno number(4) primary key, 3 ename varchar2(20), 4 sal number(7,2), 5 job varchar2(20), 6 deptno number(2), 7 foreign key(deptno) references dept1(deptno) 8 ); 9 10 create table emp3( 11 empno number(4) primary key, 12 ename varchar2(20), 13 sal number(7,2), 14 job varchar2(20), 15 deptno number(2) 16 );
***开放中比较常用
1 alter table emp3 add foreign key(deptno) 2 references dept1(deptno);
*********
1 create table emp4( 2 empno number(4) primary key, 3 ename varchar2(20) not null, 4 sal number(7,2) check(sal between 800 and 20000), 5 idcard char(18) unique, 6 job varchar2(20), 7 deptno number(2) 8 );
修改表 alter table ....
添加字段:
1 alter table emp4 add comm number(6,2);
修改字段类型
1 alter table emp4 modify comm number(7,2);
删除字段
1 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)
-----创建表
1 create table emp( 2 empno number(4) primary key, 3 ename varchar2(12), 4 job varchar2(20), 5 mgr number(4), 6 hiredate date, 7 sal number(7,2), 8 comm number(6,2), 9 deptno number(2) 10 ); 11 create table dept( 12 deptno number(2) primary key, 13 dname varchar2(12), 14 loc varchar2(10) 15 );
添加外键
1 alter table emp add foreign key(mgr) 2 references emp(empno); 3 alter table emp add foreign key(deptno) 4 references dept(deptno); 5 6 insert into dept values(10,'财务部','海淀区'); 7 insert into dept(deptno,dname,loc)values(20,'研发部','西城区'); 8 commit; 9 select * from dept; 10 insert into dept(deptno,dname,loc)values(30,'市场部','东城区'); 11 insert into dept(deptno,dname,loc)values(40,'审计部','朝阳区'); 12 13 insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values 14 (7000,'KING','总裁',null,'13-1月-2013',25000,null,10); 15 16 insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values 17 (7369,'刘德华','经理',7000,'13-3月-2013',18000,200,10); 18 19 insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values 20 (7469,'李宇春','经理',7000,'15-3月-2013',22000,200,20); 21 22 insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values 23 (7470,'詹姆斯','经理',7000,'1-4月-2014',21000,200,20); 24 25 insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values 26 (7370,'SMITH','普通员工',7000,'10-1月-2014',8000,500,10);
复制数据
1 create table emp_copy 2 as select * from emp;
复制表数据
1 insert into emp_copy 2 select * from emp_copy;
*修改数据
update
1 update emp set job='数据分析员' where ename='詹姆斯';
---多个一起修改
1 update emp set job='数据分析员' where empno=7469 or empno=7370;
*删除数据
delete
1 delete from emp where empno =7370; 2 delete from emp where empno in(1000,2000,3000,4000);
*查询数据
1 select cn1,cn2,cn3......tablename; 2 select cn1 from tablename; 3 select * from tablename;
*条件查询
select ...from ....where条件
比较:>,>=,<,<=,=,!=,<>(不等)
需求:职位不是经理的员工信息
1 select empno,ename,job,sal,comm,deptno,hiredate,mgr 2 from emp where job<>'经理';
需求:查询所有普通员工的信息
1 select empno,ename,job,sal,comm,deptno,hiredate,mgr 2 from emp where job='普通员工';
----值区分大小写
需求:列出入职日期在2005年后的员工名,入职日期
1 select ename,hiredate from emp 2 where hiredate>='1-1月-2015';
Oracle续=========================
查询
null值查询 is null ,is not null
查询没有奖金的员工的姓名,工资,奖金
1 select ename,sal,comm from emp 2 where comm is null or comm=0;
布尔连接
and,与的运算
or,或的运算
需求:列出05年后入职,工资大于8000的员工的姓名
入职日期,工资.
1 select ename,hiredate,sal from emp 2 where hiredate>'1-1月-2015' and sal >8000;
---给表起别名
1 select e.ename,e.hiredate,sal 2 from emp e where ......
--双引号可以用来给字段起别名
1 select e.ename,e.hiredate as "薪水",sal 2 from emp e where ...... 3 4 String sql="select ename,hiredate,sal where 1=1";
//使用append追加(多条件查询)
=======================================
or,或的运算
需求:涨薪,职位是普通员工
或没有奖金的员工的工资涨薪500,
列出,涨薪后的员工姓名,工资
1 select ename,sal+500 as nsal from emp 2 where job='普通员工' or comm is null;
==================================
模糊查询
like
%:若干位若干字符 J%(J开头后面不管)
_(下划线):一位若干字符_I __I%(表示第三位是I后面不管)
需求:列出员工姓名,工资,入职日期
姓名中必须包含用户输入的内容
1 select ename,sal,hiredate from emp 2 where ename like '%KI%';(名字中只要有KI)
==================================
范围
in,not in
需求:列出10,20号部门的员工姓名,工资
部门号.
1 select ename,sal,hiredate from emp 2 where deptno in(10,20); 3 between....and,not between....and
需求:列出13年1月份到14年1月份入职员工姓名,
入职日期.
1 select ename,hiredate from emp 2 where hiredate between '1-1月-2013' and 3 '1-1月-2014';
***排序查询***
order by:指定排序字段
asc:升序(默认)
desc:降序
数字从小到大
日期从早到晚
字符根据字母序
排序可以有多个参考字段,参考顺序从前到后
需求:根据查询20号部门的员工姓名,工资,入职日期
根据工资降序排序.
1 select ename,sal,hiredate from emp 2 where deptno=20 order by sal desc;
需求:列出工资大于10000的员工姓名,工资,入职日期,
根据入职日期升序,工资降序排序
1 select ename,sal,hiredate from emp 2 where sal>10000 order by sal desc and hiredate asc;
*null值所在值中排序最大
需求:列出员工姓名,工资,奖金
根据奖金降序显示数据。
1 select ename,sal,comm from emp 2 order by comm desc;
分组查询;
分组:group by
运算:组函数 sum avg max min count
需求:统计公司内部有多少个员工?
---- 查询表的记录数
1 select count(empno) from emp;
需求:列出公司内部每种职位的员工的工资总和.
1 select job,sum(sal) from emp 2 group by job;
需求:列出公司内部每个部门的员工工资平均值
1 select deptno,avg(sal) avg_sal, 2 max(sal) max_sal,min(sal) min_sal 3 from emp 4 group by deptno;
注意:分组查询只能查询分组字段,和组函数运算的结果.
需求:列出平均工资大于10000的部门号
和平均工资
having:筛选分组后的结果
1 select deptno,avg(sal) from emp 2 group by deptno having avg(sal)>10000;
需求:列出部门号大于10号部门,平均工资
大于10000的部门号和平均工资.
1 select deptno,avg(sal) from emp 2 where deptno>10 group by deptno 3 having avg(sal)>10000;
需求:列出部门号大于10号部门,平均工资大于
大于10000的部门号和平均工资.根据平均工资降序排序
1 select deptno,avg(sal) from emp 2 where deptno>10 group by deptno 3 having avg(sal)>10000 order by avg(sal) desc;
=================================================
关联查询(多表查询)
连接条件
KING 财务部
需求:列出员工名,部门名,部门号,部门地址
1 select ename,deptno,dname,loc from 2 emp,dept;
笛卡尔乘积现象(避免)
1 select ename,e.deptno,dname,loc from 2 emp e,dept d where e.deptno=d.deptno;
*内连接查询 都是满足连接条件的数据
select..from t1 inner join t2
on 连接条件
需求:列出员工名,部门名,部门号,部门地址
------内连接-----
1 select ename,e.deptno,dname,loc from 2 emp e inner join dept d on e.deptno=d.deptno;
---等值查询,与内连接返回的数据相同--
1 select ename,e.deptno,dname,loc from 2 emp e,dept d where e.deptno=d.deptno;
*外连接:保证数据的不缺失
左外连接:保证左表数据不缺失
右外连接:保证右表数据不缺失
全外连接:保证所有表数据不缺失
需求:列出员工名,部门名,部门号,部门地址
左外连接来实现:(一般常用)--1
1 select ename,e.deptno,dname,loc 2 from emp e left outer join dept d 3 on e.deptno=d.deptno;
左外方式二(Oracle中有的)
1 select ename,e.deptno,dname,loc 2 from emp e,dept d 3 where e.deptno=d.deptno(+); 4 5 select ename,e.deptno,dname,loc 6 from emp e left join dept d 7 on e.deptno=d.deptno;
---------结果是一样的------
右外连接实现
1 select ename,e.deptno,dname,loc 2 from dept d right outer join emp e 3 on e.deptno=d.deptno;
------全外连接
1 select ename,e.deptno,dname,loc 2 from emp e full outer join dept d 3 on e.deptno=d.deptno;
需求:列出员工号,员工姓名,经理工号,
经理的姓名
自连接
1 select e1.empno,e1.ename,e1.mgr,e2.ename 2 from emp e1 left join emp e2 on 3 e1.mgr=e2.empno;
需求:列出员工号,员工姓名,经理工号,
经理的姓名,员工的部门地址,
部门号
------超过两张表的左外连接-----
1 select e1.empno,e1.ename,e1.mgr,e2.ename,dname,loc,d.deptno 2 from emp e1 left join emp e2 on 3 e1.mgr=e2.empno left join dept d 4 on e1.deptno=d.deptno;
=================================================
SQL中常用的函数
*字符函数
1 lower,upper 2 select ename,job,sal from emp 3 where lower(ename)='king'; 4 concat(连接字符串) 5 select concat('Hello','Oracle!') 6 from dual;
------ ||(表示拼接)
1 select 'Hello'|| 'oracle'from dual;(效果同上) 2 My sal is 1000,I hope 2000!; 3 select ename || '''s sal is' || sal ||',I hope' || sal*2 || '!' 4 from emp; 5 6 length,substr 7 select ename,length(ename) 字符数, 8 hiredate,substr(hiredate,0,2) from // 0:表示第0个位置 2:表示第二个位置 9 emp;
*数学函数
round:四舍五入
trunc:截断
mod:求余
1 select round(45.54,2) from dual; 2 select trunc(45.562) from dual; 3 select mod(10,2) from dual;
*日期函数
sysdate(返回当前系统的时间)
1 select sysdate from dual;
日期可以运算
select hiredate ,hiredate+1 from emp;
*months_between(两个日期之间的间隔天数)
需求:列出员工姓名,入职月数
1 select ename, 2 round(months_between(sysdate,hiredate)) 3 from emp where hiredate is not null;
add_months
1 select add_months(sysdate,3) from dual;
next_day 下个星期对应的日期
select next_day(sysdate,'星期三') from dual;
last_day 某月最后一天的日期
1 select last_day(sysdate) from dual;
round,(<=15舍掉日 >15,加一日)
1 select round(sysdate,'MONTH') from dual;
trunc
1 select trunc(sysdate,'DAY') from dual;
extract:返回指定的年或月或日
1 select extract(month from sysdate) from dual; 2 select extract(year from sysdate) from dual;
===========================================================================
*转换函数
to_char:日期转换特定格式的字符串(***************)
1 select ename,to_char(hiredate,'yyyy-MM-dd') from emp;
yyyy:4位数字表示年
mm:2位数字表示月份
dd:2位数字表示日
year:用英文单词表示年
dy:星期的单词前3位
2016年06月06号
1 select ename,to_char(hiredate,'yyyy"年"MM"月"dd"日"') 2 from emp;
timestamp类型,常用的日期类型,包含时分秒
1 create table t_usersys( 2 id number(4) primary key, 3 registtime timestamp default systimestamp 4 ); 5 select id,to_char(registtime,'YYYY-MM-DD HH24:MI:SS')---时 分 秒 6 from t_usersys;
to_date:将字符串转换为日期(******************)
2016-6-6 06:06:06
1 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:本地货币符号
1 select ename,sal,to_char(sal,'L999,999,999,99') 2 from emp;
空值计算:
nvl:nvl(comm,0)(当comm为null时就把它换成是0)
1 select ename,sal,comm,(sal+nvl(comm,0))*12 年薪 from emp;
去重:
select distinct job from emp;
======================================================================
子查询
需求:列出20号部门中,比30号部门平均工资大的员工姓名,工资,职位
1 select ename,sal,job from emp 2 where deptno=20 and 3 sal>(select avg(sal) 4 from emp where deptno=30);
(先执行子查询)
需求:列出SMITH的同部门同事的姓名.工资,部门号..
1 select ename,sal,deptno from emp where deptno= 2 (select deptno from emp where lower(ename)='smith') 3 and lower (ename)<>'smith';
in:在范围之内
需求:列出包含20号部门中的职位的员工的姓名,职位,工资。
1 select ename,job,sal from emp where job in( 2 select distinct job from emp where deptno=20);
all:所有
any:任意一个
需求:列出员工姓名,工资,职位工资大于20号部门所有员工工资
的姓名,工资,职位.(>max)
1 select ename,sal,job from emp where sal > all(select sal from 2 emp where deptno=20 3 );
需求:列出员工姓名,工资,职位工资大于20号部门任意一个员工工资
的姓名,工资,职位.(>min)
1 select ename,sal,job from emp where sal > any(select sal from 2 emp where deptno=20 3 );
需求:将员工工资低于20号部门平均工资的员工工资涨薪500
1 update emp set sal=sal+500 where sal <(select avg(sal) from emp where deptno=20);
子查询也可以用在from子句中
1 select e.* from (select * from emp where deptno=20)e;
(关联子查询)
需求:有下属的员工姓名,工资
exists:是否存在
1 select empno,ename,sal from emp e where exists( 2 select mgr from emp where mgr=e.empno 3 );
需求:列出工资大于本部门平均工资的员工姓名,工资,奖金,部门号.
1 select ename,sal,comm,deptno 2 from emp e where sal >( 3 select avg(sal) from emp where deptno=e.deptno 4 );
==========================================================
集合操作
union,union all(合并集合)
需求;查询20号部门,工资大于10000,
将两个集合合并
1 select ename,sal,deptno from emp 2 where deptno=20; 3 -----union去重合并--------- 4 -----union all---不去重合并------ 5 select ename,sal,deptno from emp 6 where sal>10000; 7 8 select ename,sal,deptno from emp where deptno=20 9 union 10 select ename,sal,deptno from emp where sal>10000;
intersect 获取两个结果集的(交集)
查询职位是经理,工资大于10000
1 select ename,job,sal from emp 2 where job='经理' intersect 3 select ename,job,sal from emp 4 where sal >10000; 5 minus:(差集) 6 rownum:行号,伪列 7 select empno,ename,rownum from emp where 8 rownum<=10 minus 9 select empno,ename,rownum from emp where 10 rownum<=5;
============================================
Oracle中的分页查询(*****)
page:当前页数
pageSize(perPage):每页条目
begin=(page-1)*pageSize;
end=page*pageSize;
显示任意一段记录
4-6
1 select ename,sal,r from ( 2 select ename,sal,rownum r from emp where rownum<=6 3 )where r>=4; 4 ---效果同上---(********开发常用*****) 5 select ename,sal,r from( 6 select e.ename,e.sal,rownum r from 7 (select ename,sal from emp)e) 8 where r>=4 and r<=6; 9 ----比较好理解的一种(*****开发常用*****) 10 select ename,sal,r from( 11 select ename,sal ,rownum r from emp) 12 where r between 4 and 6; 13 14 mysql分页:limit 限定 15 select ename,sal from emp 16 limit 10,5;//第一个数字是开始位置,第二个数字是每页显示的最大数
==================================================================
序列(sequence):是一种用来生成唯一数字值
的数据库对象(重要)
序列的值由Oracle程序按递增或递减的顺序自动生成的
是一种高效的获取唯一键值的途径.
序列是独立的字段
通常情况下,一个序列为一个表提供主键值。(也可以为多个表
提供主键值。
)
1 ------序列举例 2 create table t_user_hjf( 3 id number(4), 4 username varchar2(20), 5 password varchar2(20) 6 ); 7 ----创建一个简单的序列--- 8 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操作
连接视图:基于多表
需求:创建视图,列出每个部门的员工的平均工资,最大工资,最小工资
工资总和。
1 create view empsalview 2 as 3 select avg(sal) avg_sal ---在使用函数时必须起别名 4 ,deptno,max(sal) max_sal, ---在使用函数时必须起别名 5 min(sal) min_sal ---在使用函数时必须起别名 6 ,sum(sal) sum_sal ---在使用函数时必须起别名 7 from emp group by deptno; 8 应用视图:select * from empsalview;
通过视图来做DML操作
1 create or replace view empview as---创建视图 2 select empno,ename,sal,comm,job from emp; 3 4 insert into empview values(lcseq.nextval,'黄剑飞',20000,1000,'数据分析员');--插入数据 5 6 delete from empview where ename='黄剑飞';---删除数据
带有约束视图
*with check option
DML操作只能
1 create or replace view empview 2 as 3 select empno,ename,deptno 4 from emp 5 where deptno=10 6 with check option;
---添加数据失败 部门号只能是10---(加了with check option以后)
1 insert into empview values( 2 lcseq.nextval,'李四',20 3 );
1 -----正确的方式--------- 2 insert into empview values( 3 lcseq.nextval,'李四',10 4 ); 5 6 *with read only:只读,不支持DML 7 create or replace view empview 8 as 9 select empno,ename,deptno 10 from emp 11 where deptno=10 12 with read only; ---只读视图--- 13 ----添加数据失败 只读-------- 14 insert into empview values( 15 lcseq.nextval,'李四',10 16 ); 17 18 数据字典 也是表 19 user_tables 20 select * from user_tables; 21 user_views 22 select * from user_views; 23 user_sequences 24 select * from user_sequences; 25 26 ===================================================== 27 索引(index): 28 create index emp_copy_empno_index 29 on 30 emp_copy(empno); 31 32 create index emp_copy_ename_job_index 33 on 34 emp_copy(ename,job); 35 Oracle中主键字段,unique字段(自动添加索引) 36 删除索引: 37 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
1 -----创建权限表--- 2 CREATE TABLE t_privilege( 3 pid NUMBER(2) PRIMARY KEY, 4 name VARCHAR2(20) 5 ); 6 -----创建角色表---- 7 CREATE TABLE t_role( 8 rid NUMBER(2) PRIMARY KEY, 9 name VARCHAR2(20) 10 ); 11 ----创建权限角色表---(中间表) 12 CREATE TABLE privilege_role( 13 rid NUMBER(2), 14 pid NUMBER(2), 15 PRIMARY KEY(rid,pid) 16 ); 17 ---给中间表添加一个外键---- 18 ALTER TABLE privilege_role ADD 19 FOREIGN KEY(rid) REFERENCES t_role(rid); 20 ---给中间表添加一个外键---- 21 ALTER TABLE privilege_role ADD 22 FOREIGN KEY(pid) REFERENCES t_privilege(pid); 23 -----角色表创建序列----- 24 CREATE SEQUENCE roleseq; 25 ----------初始化权限表的数据--- 26 INSERT INTO t_privilege VALUES( 27 1,'角色管理' 28 ); 29 INSERT INTO t_privilege VALUES( 30 2,'管理员管理' 31 ); 32 INSERT INTO t_privilege VALUES( 33 3,'资费管理' 34 ); 35 INSERT INTO t_privilege VALUES( 36 4,'账务账号管理' 37 ); 38 INSERT INTO t_privilege VALUES( 39 5,'业务账号管理' 40 ); 41 INSERT INTO t_privilege VALUES( 42 6,'账单管理' 43 ); 44 INSERT INTO t_privilege VALUES( 45 7,'报表管理' 46 ); 47 -----初始化角色表的数据-------- 48 INSERT INTO t_role VALUES( 49 roleseq.NEXTVAL,'超级管理员' 50 ); 51 INSERT INTO t_role VALUES( 52 roleseq.NEXTVAL,'管理员' 53 ); 54 INSERT INTO t_role VALUES( 55 roleseq.NEXTVAL,'账号管理员' 56 ); 57 --初始化角色权限表数据---------- 58 INSERT INTO privilege_role VALUES( 59 1,1 60 ); 61 INSERT INTO privilege_role VALUES( 62 1,2 63 ); 64 INSERT INTO privilege_role VALUES( 65 1,3 66 ); 67 INSERT INTO privilege_role VALUES( 68 1,4 69 ); 70 INSERT INTO privilege_role VALUES( 71 1,5 72 ); 73 INSERT INTO privilege_role VALUES( 74 1,6 75 ); 76 INSERT INTO privilege_role VALUES( 77 1,7 78 ); 79 INSERT INTO privilege_role VALUES( 80 2,1 81 ); 82 INSERT INTO privilege_role VALUES( 83 2,2 84 ); 85 INSERT INTO privilege_role VALUES( 86 2,3 87 ); 88 INSERT INTO privilege_role VALUES( 89 3,5 90 ); 91 INSERT INTO privilege_role VALUES( 92 3,6 93 ); 94 INSERT INTO privilege_role VALUES( 95 3,7 96 ); 97 ------创建管理员表------ 98 CREATE TABLE t_admin( 99 aid number(4) PRIMARY KEY, 100 admin_code VARCHAR2(30), 101 password VARCHAR2(8), 102 name VARCHAR2(20), 103 telephone VARCHAR2(15), 104 email VARCHAR2(50), 105 enrolldate DATE 106 ); 107 -----创建管理员序列--- 108 CREATE SEQUENCE adminseq 109 START WITH 1000 110 INCREMENT BY 10; 111 -----初始化管理员表数据--- 112 INSERT INTO t_admin VALUES( 113 adminseq.NEXTVAL,'admin','aaa', 114 '刘备','13333333333','liubei@tedu.cn', 115 SYSDATE 116 ); 117 INSERT INTO t_admin VALUES( 118 adminseq.NEXTVAL,'guanyu','aaa', 119 '关羽','13444444444','guanyu@tedu.cn', 120 SYSDATE 121 ); 122 INSERT INTO t_admin VALUES( 123 adminseq.NEXTVAL,'zhangfei','aaa', 124 '张飞','13555555555','zhangfei@tedu.cn', 125 SYSDATE 126 ); 127 INSERT INTO t_admin VALUES( 128 adminseq.NEXTVAL,'lvbu','aaa', 129 '吕布','13666666666','lvbu@tedu.cn', 130 SYSDATE 131 ); 132 ------创建管理员角色表--- 133 CREATE TABLE admin_role( 134 aid NUMBER(4), 135 rid NUMBER(4), 136 PRIMARY KEY(aid,rid) 137 ); 138 -----给管理员角色表添加外键--- 139 ALTER TABLE admin_role ADD 140 FOREIGN KEY(aid) REFERENCES t_admin(aid); 141 ALTER TABLE admin_role ADD 142 FOREIGN KEY(rid) REFERENCES t_role(rid); 143 -----初始化管理员角色表的数据--- 144 INSERT INTO admin_role VALUES( 145 1010,2 146 ); 147 INSERT INTO admin_role VALUES( 148 1020,3 149 ); 150 INSERT INTO admin_role VALUES( 151 1030,2 152 ); 153 INSERT INTO admin_role VALUES( 154 1030,3 155 ); 156 INSERT INTO admin_role VALUES( 157 1030,1 158 );
==============================================
实现项目中角色管理的功能
1,分页显示角色
1 SELECT rid,name FROM 2 (SELECT rid,name,rownum r 3 FROM t_role 4 WHERE rownum<=2) 5 WHERE r>=1;
2:根据已知角色的id,显示对应的
权限的名字
1 SELECT name FROM 2 t_privilege p LEFT JOIN privilege_role pr 3 ON p.pid=pr.pid 4 WHERE 5 pr.rid=1;
3:添加角色并授权
1 INSERT INTO t_role(rid,name)VALUES( 2 roleseq.NEXTVAL,'资费管理员' 3 ); 4 ---授权--- 5 INSERT INTO privilege_role(rid,pid)VALUES( 6 4,1 7 ); 8 INSERT INTO privilege_role(rid,pid)VALUES( 9 4,2 10 );
4:点击去修改的链接,根据角色ID,查询角色信息以及权限ID
1 SELECT rid,name FROM t_role WHERE 2 rid=1; 3 4 SELECT pid FROM privilege_role WHERE 5 rid=1; 6 7 SELECT r.rid,name,pr.pid FROM t_role r LEFT JOIN 8 privilege_role pr ON 9 r.rid=pr.rid where 10 r.rid=1;
5:点击确认修改按钮
*修改角色的名字
1 UPDATE t_role SET name='超级管理员' 2 WHERE rid=4;
*修改角色权限
先清空角色权限,在添加新权限
1 DELETE FROM privilege_role WHERE rid=1; 2 INSERT INTO privilege_role(rid,pid) 3 VALUES(4,1); 4 INSERT INTO privilege_role(rid,pid) 5 VALUES(4,2); 6 INSERT INTO privilege_role(rid,pid) 7 VALUES(4,3);
6:删除角色
先删除中间表角色与权限的对应关系
1 DELETE FROM privilege_role 2 WHERE rid=4; 3 DELETE FROM t_role 4 WHERE rid=4;
实现项目中的管理员模块查询功能
动态条件分页查询管路员功能
aid name
1001 张三
1002 李四
rid name
1 超级管理员
2 管理员
pid name
1 角色管理
2 管理员管理
1 SELECT aid,name,email FROM t_admin 2 WHERE aid IN( 3 SELECT DISTINCT aid FROM admin_role 4 WHERE rid IN( 5 SELECT DISTINCT rid FROM privilege_role 6 WHERE pid=1 7 ) 8 );
----------------------------------------------
*查询权限ID为1对应的管理员的ID和NAME
1 SELECT DISTINCT a.aid,name FROM t_admin a 2 JOIN admin_role ar ON a.aid=ar.aid 3 JOIN privilege_role pr ON ar.rid=pr.rid 4 WHERE pr.pid=1;
------分页---------------------------------
1 SELECT aid,name FROM( 2 SELECT aid,name,ROWNUM r FROM( 3 SELECT DISTINCT a.aid,name FROM t_admin a 4 JOIN admin_role ar ON a.aid=ar.aid 5 JOIN privilege_role pr ON ar.rid=pr.rid 6 WHERE 1=1 7 AND pr.pid=1 8 AND ar.aid=2 9 )WHERE ROWNUM<=4) 10 WHERE r>=3;
--------------------------------------------
登录:
*查询登录用户的详细信息(此处默认是管理员)
1 SELECT aid,name,admin_code,password 2 FROM t_admin 3 WHERE admin_code='admin' 4 AND password='aaa';
*查询登录用户的具备的权限(假设当前的用户为1010号管理员)
1 SELECT DISTINCT pid FROM admin_role ar 2 JOIN privilege_role pr ON 3 ar.rid=pr.rid 4 WHERE ar.aid=1010;
作者:little飞 出处:http://www.cnblogs.com/little-fly/ 欢迎转载 也请保留这段声明 谢谢!