zoukankan      html  css  js  c++  java
  • [原创]关于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

    *修改用户密码

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

    大家可以相互学习,我们都是热爱编程的IT少年,大家一起努力,让我们的IT梦飞得更高吧!!!
  • 相关阅读:
    看我这篇就够了!os.system批量执行py文件!!!!
    关于python文件显示为空白文件图标的解决办法
    Python Windows下整体项目环境迁移
    python + selenium + firefox 自定义配置文件启动浏览器
    Selenium OSError: [WinError 193] %1 不是有效的 Win32 应用程序
    redis安装后,输入redis-server.exe redis.windows.conf无法启动
    MongoDB安装
    安装tesserocr pillow报错
    【流水账】2021-07-09 Day-29
    【流水账】2021-07-08 Day-28
  • 原文地址:https://www.cnblogs.com/little-fly/p/6252202.html
Copyright © 2011-2022 走看看