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/ 欢迎转载 也请保留这段声明 谢谢!