Oracle数据库学习第二天

1.伪表,伪列

1.1.伪表dual

  1. 概念:

    • 就是一个不真实存在的虚拟表.伪表的作用就是用来构造一个符合sql规则的select语句.简单来说,伪表就是为让select语句不出现错误.
  2. 应用场景

    • 用来查询系统参数

    • 可以用来调用函数

    • 可以用来查询计算结果

            -- 查询一下的当前的登录用户
            select user from dual; 
            
            -- 查询系统当前的时间
            select sysdate from dual;
            
            -- 按照指定的格式输出当前系统的时间 yyyy-MM-dd,调用函数
            select to_char(sysdate,'yyyy-MM-dd HH:mm:ss') from dual;
            
            -- 查询计算的结果
            select 1+2 from dual;
      

1.2伪列rowid

  1. 在ORacle数据库中插入数据的时候,Oracle数据库会为该条数据创建一个ID.该ID号就是这条数据在磁盘上的物理地址.

         -- rowid;注意:如果需要查询*和其他的字段,就需要给*取别名
         -- 如果只是单独查询*不需要别名
         select rowid,e.* from emp e;
    
Oracle数据库学习第二天_第1张图片
rowid.png
  1. 但是在实际开发中,一般是不会直接使用rowid的查询表记录,我们是根据主键列查询表的记录.
  2. 注意:rowid只能作为条件进行查询,不可以修改rowid的值

1.3.伪列rownum

  1. Oracle执行查询的时候,rownum是根据sql查询出的结果给每行分配一个逻辑编号;每次的查询都会有不同的编号。编号从1开始.该编号就是伪列rownum,rownum的作用就是用来实现分页的功能.

         -- 查询emp表中的第二页的数据,每一页显示5行
         select * from (select rownum r,e.* from emp e where rownum <= 10) where r >= 5;
    
  2. 注意:使用rownum进行查询的时候,不可以使用大于,大于等于,等于号.如果是从1开始就除外.因为rownum是逻辑编号,如果新增了数据,rownum就会改变,所以等于号没有意义.

2.运算符

  1. 算术运算符: + - * / 没有%

         -- 查询员工的年薪(工资*12+奖金)
         select ename,sal*12+comm as 年薪 from emp;
    
  2. 比较运算符: > >= <= < = != in between...and is null is not null

             -- 获取工资大于等于2000,而且工资要小于等于3500的员工信息
             select * from emp where sal between 2000 and 3000;
             
             -- 查询所有奖金不为null的信息
             select * from emp where comm is not null
    
  3. 逻辑运算符 and or not

  4. 连接运算符 ||
    -- 查询员工的职位信息
    select ename || '的职位是:' || job from emp;

Oracle数据库学习第二天_第2张图片
11.png
  1. 集合运算符
    • 并集:union(去重复); union all(有重复)

        -- 并集:有重复,就是查询结果A中的子集与查询结果B中的子集相加
        select ename from emp where sal > 1000 and sal <3500
        union all
        select ename from emp where sal > 1000 and sal < 2500
        
        -- 并集:无重复,就是查询结果A中的子集与查询结果B中的子集相加然后取出重复部分
        select ename from emp where sal > 1000 and sal <3500
        union 
        select ename from emp where sal > 1000 and sal < 2500
      
    • 交集:intersect交集 minus 剪集

        -- 交集 是AB的公共数据
        select ename from emp where sal > 1000 and sal <3500
        intersect 
        select ename from emp where sal > 1000 and sal < 2500
        
        -- 减集 是A-AB中的公共部分 
        select ename from emp where sal > 1000 and sal <3500
        minus 
        select ename from emp where sal > 1000 and sal < 2500
      

3.函数

  1. 数值函数
函数 说明
mod(x,y) 求余
round(x,y) 四舍五入,如果参数y>0,那么就四舍五入到小数的第y位,
如果参数y<0,那么就四舍五入到小数点左边的第y位,
如果参数y为0或者是不指定参数,对整数部分进行四舍五入
trunc(x,y) 没有四舍五入的功能,是截取
        -- 数值函数
            select mod(10,3) from dual;
            select round(3.1415,3) from dual;
            select round(1314.1415,0) from dual;
            select trunc(1314.1415,3),trunc(1113.1415,-1) from dual;
  1. 字符型的函数
函数 说明
length 返回字符串的长度,是按照字符进行计算
replace(c1,c2,c3) 把一个字符串里面的内容替换,把c1里面的c2全部替换成c3
substr(c1,c2,c3) 从c1的c2位置开始截取c3个字符,不是索引,是从1个字符开始
        -- 字符型函数
        -- 查询姓名长度大于5的员工信息
        select * from emp where length(ename)>5
        
        -- 替换
        select replace('明天放假吗?真的放假吗?','放假','自习') from dual;
        
        -- 截取电话号码中的所有的8
        select substr('13988888888',4,8) from dual;
  1. 日期函数
函数 说明
sysdate/systimestamp 用来获取到当前的日期/时间
months_between(d1,d2) 返回两个日期相隔的月数
extract(c1 from d1) 用来获取日期时间中的某部分
interval 用来获取一个变动的日期或者是时间
    -- 获取到当前的时间
    select systimestamp from dual;
    
    -- 获取某个日期的年份
    select extract(year from sysdate) from dual;
    
    -- 需求:查询1987年入职的员工信息
    select * from emp where extract(year from hiredate) = 1987
    
    -- 获取到昨天的日期
    select sysdate - interval '1' day from dual;
    select sysdate - interval '1' month from dual;
    select systimestamp - interval '1' hour from dual;
  1. 转换函数
函数 说明
to_char 把数值或者是日期类型的数据和转换成字符串
to_date 把字符串转换为日期类型数据
to_timstamp 把字符串转换成时间类型的数据
    -- 转换函数
    select ename,job,to_char(sal,'$999,999,999') from emp;
    select ename,job,to_char(hiredate,'YYYY"年"MM"月"DD HH24:MM:SS') from emp;
    select to_date('2017/4/02','yyyy/MM/dd') from dual;
    select date '2017-04-01' from dual
    select to_timestamp('2017/04/01 12:56:31','yyyy/MM/dd HH24:mi:ss') from dual;
    select timestamp '2017-04-01 12:56:31' from dual
  1. 其他函数

    函数 功能
    nvl(exp1,exp2) 如果exp1为空,就返回exp2,否则返回exp1
    decode(条件,值1,翻译值1,值2,翻译值2....值n,翻译值n,缺省值) 判断条件,如果等于值1,就返回翻译值1,以此类推,如果都不等于,返回缺省值
    -- 给所有入职超过1年的员工奖金加300块
    update emp
    set comm = nvl(comm,0) + 300 -- 如果奖金为null就返回0,如果不为null就返回本身
    where months_between(sysdate,hiredate) > 12
    
    -- 查询员工的部门名称,如果10是对应accounting,如果是20对应.
    select ename,deptno,decode(deptno,10,'ACCOUNTING',20,'RESEARCH',30,'SALES','无部门') from emp;

4.表空间

4.1 表空间的概念

  1. 表空间就是用来存储用户数据的地方.
  2. 一个Oracle数据库可以有多个表空间,Oracle数据库创建用户的时候,Oracle数据库会给该用户分配一个表空间,也就是说,用户的数据是默认保存在自己的表空间下面.一个表空间并不是一个用户独享的.用户可以把数据保存在不同的表空间里面.
  3. 但是表空间值是一个存储数据的逻辑单元.一个表空间里面包含了多个数据文件,用户的数据就是保存在这些数据文件中.
  4. 一个数据库中有多个表空间,一个表空间中有多个数据文件.
  5. 每一个数据库中都有一个名为SYSTEM的表空间,就是系统表空间,该表空间是在创建数据库或者数据库的安装的时候自动创建的,用于存储系统的数据字典表,程序单元,过程,包和触发器.
  6. 数据文件都是以DBF结尾的.
Oracle数据库学习第二天_第3张图片
dbf.png
  1. 问题:是现有表空间还是先有用户呢?
    • 先有表空间,用户创建好后分配表空间.

4.2 创建表空间

  1. 语法格式:

          create tablespace 表空间名
          datafile '数据文件的路径'size 默认大小 
          [autoextend on] [next 扩展大小]
          [maxsize 最大容量]
    
Oracle数据库学习第二天_第4张图片
tablespace.png
  1. 注意:一个表空间至少要包含一个数据文件.

4.3 查询表空间

  1. 语法 dba_data_files:查询表空间以及数据文件的信息
Oracle数据库学习第二天_第5张图片
dba_data_files.png
  1. 问题:如果表空间中的数据文件容量超过了他的最大容量,怎么办?
    • 办法一:修改数据文件的最大容量
    • 办法二:添加数据文件
    • 注意:Oracle数据库不允许修改数据文件.

4.4 扩展表空间

  1. 语法格式:

     alter tablespace 表空间 
     add datafile '数据文件的路径' size 默认大小 
     [autoextends on next 扩展大小] 
     [maxsize 最大容量]
    
Oracle数据库学习第二天_第6张图片
altertablespace.png
  1. 注意:Orcale用户只会跟表空间打交道,而不会跟数据文件打交道.

4.5 删除表空间

  1. 语法格式: drop tablespace 表空间 [including contents and datafiles];
droptablespace.png
  1. 如果指定了 including contents and datafiles 参数,删除表空间的时候Oracle数据库就会把表空间中的所有的数据文件也一起删除

4.6 常用的表空间有哪些

  1. 临时表空间:用来存储一些中期活动的数据.(Oracle数据库自动维护)

  2. 撤销表空间:是用来保存未提交事务的数据.修改数据的时候,修改前的数据就会保存到撤销表空间里面,如果执行了事务提交的操作,在撤销表空间下的数据就会被清空,如果执行了事务回滚的操作,Oracle数据库就会把撤销表空间下的数据覆盖修改后的数据.(Oracle数据库的自动维护)

  3. 永久表空间,它是用来存储用户的永久数据的,包括了保存表,视图,过程,索引等数据.(我们自己维护的一个表空间).

5.用户管理

用户 说明
sys 超级管理员,包括了所有的系统权限,必须要以sysdba身份去登录
system 普通的管理员,具有一些创建表空间,用户管理,用户授权等功能
scott 测试用户,需要解锁才可以使用

5.1 查询Oracle数据库的用户

  1. dba_users:查询当前系统中所有用户的详细信息
Oracle数据库学习第二天_第7张图片
dba_users.png

5.2 创建用户

语法格式:

    create user 用户名 identified by 密码[default tablespace 表空间]
createuser.png

5.3 用户授权

5.3.1 系统权限

  1. 系统权限:就是可以创建系统对象(表,索引,视图,同义词)的权限.
  2. 授予系统权限:grant create XXX to 用户;
    • create session: 用户登录的权限
    • create tbale:创建表
    • craete index:创建索引的权限
    • .....注意只有管理员才有权利授予系统权利
Oracle数据库学习第二天_第8张图片
grantcreate.png
  1. 模式Schema
    • Oracle数据库管理员创建用户的时候,Oracle数据库会为该用户创建一个模式,模式就是一个用户中所有对象的集合.一个用户对应着一个模式.模式名与用户名是相同的.如果我们要访问其他用户的对象,那么就必须要通过'模式.对象'进访问.

5.3.2 对象权限

  1. 对象权限:就是对数据库对象的操作权限.

  2. 授予对象权限的语法:grant 操作 on 对象 to 用户

Oracle数据库学习第二天_第9张图片
grantall.png
  1. 常见的操作:select; insert; delete; update; all

  2. 注意:只有系统管理员或者是对象的拥有者才有权利授权给其他用户访问该用户的对象.

5.3.3 查看用户权限

  1. user_sys_privs:查询当前用户的系统权限
Oracle数据库学习第二天_第10张图片
user_sys_privs.png
  1. user_tab_privs:查询当前用户的对象权限
Oracle数据库学习第二天_第11张图片
user_tab_privs.png

5.3.4 回收权限

  1. 回收对象权限

    revoke 操作 on 对象 from 用户

Oracle数据库学习第二天_第12张图片
revokedelete.png
  1. 回收系统权限

    revoke create XXX from 用户

Oracle数据库学习第二天_第13张图片
revokecreate.png

5.4 修改用户密码

  1. 修改密码的语法: alter user 用户名 identified by 密码
Oracle数据库学习第二天_第14张图片
alteruser.png

5.5 删除用户的语法

  1. 语法:drop user 用户 [cascade];
    • 如果删除用户的时候,如果该用户下已经创建了对象,那么就需要指定cascade关键字把这些对象一起删除.
Oracle数据库学习第二天_第15张图片
dropuser.png

6.视图

6.1 视图的概念

  1. 视图是由一个或者是多个表组成的数据库对象.这些表也称之为视图的基表,如果要创建视图,就需要有create view的权限
  2. 限制对表中某些列的访问
  3. 简化select语句

6.2 创建视图

  1. 创建视图语法:

    create or replace view 视图名 as select 语句

     -- 需求:授予lyric用户访问emp表,但是限制lyric访问comm和sal
     create or replace view v_emp
     as 
     select empno,ename,job,hiredate,deptno from emp;
     -- 使用视图
     select * from v_emp
    

注意:视图本身是不保存数据的,视图的数据是从视图中的基表查询出来的.
对视图的操作实际上是对视图中基表的操作.

6.3 删除视图

  1. 语法格式: drop view 视图名称;

7.同义词

7.1 概念

  1. 同义词就是一个对象的别名.
  2. 使用别名的好处:
    • 简化对对象的访问
    • 把对象的名字隐藏起来

7.2 创建同义词(私有同义词)

  1. 语法格式:create synonym 同义词 for 对象

  2. 注意:如果要创建同义词,必须要具有create synonym权限.

     -- 创建一个表
     create table itbaima_crm_dept_user_data (
       id number(4) primary key,
       name nvarchar2(10) unique
     )
     
     -- 创建同义词(私有同义词)
     create synonym syn_aa for itbaima_crm_dept_user_data;
     
     -- 使用同义词
     insert into syn_aa values (1,'狗娃');
     select * from syn_aa
    

7.3 公有同义词

  1. 公有同义词是可以被public用户组的所有用户访问.共有同义词一般是由数据库管理员负责创建,通常使用公有同义词去代替一些普通的对象.

  2. 语法:

    • create public synonym 公有同义词 for 对象;
  3. 把公有同义词授权给public权限组

    grant select on 公有同义词 to public;

  4. 注意:使用公有同义词是不需要指定模式.

Oracle数据库学习第二天_第16张图片
createpublicsynonym.png

7.4 删除同义词

  1. 删除私有的同义词
`drop synonym 同义词`
  1. 删除公有的同义词

    drop public sysnonym 同义词

Oracle数据库学习第二天_第17张图片
dropsynonym.png
  1. 注意:只有同义词的创建者或者是管理员才可以删除同义词或者公有同义词

8.索引

8.1 索引概念

  1. 索引就是创建在某一列或者是多列上面的数据库对象.

  2. 作用:可以提高对表的查询效率.

  3. 原理:

    • 如果没有索引:Oracle数据库会从表的第1条数据一条一条往下查询,直到找到满足条件的记录为止.
    • 为什么对表的某一列创建索引之后会提高表的查询效率?
    • 如果对表的某一列创建了索引,那么查询表数据的时候,Oracle数据库就不会直接查询目标表了,而是先去查询索引(二叉树的算法).找到之后就根据该索引值的rowid直接定位到目标表的某一行.
  4. 索引缺点:索引会影响到数据的更新效率.

    • 因为创建了索引之后会对目标表的增删改操作都要对索引进行增删改操作.如果数据量越大,执行的效率就会越低.

8.2 创建索引

  1. 语法格式:create [unique] index 索引名 on 表(列..)

         -- 创建唯一索引
         create unique index idx_emp_ename on emp(ename)
    
  2. unique: 如果指定了unique关键字,那么这一列的数据就不允许重复.

  3. 注意:如果创建了索引之后,那么执行查询的时候,Oracle数据库就会先从索引表中查询,而不会直接查询目标表.

8.3 删除索引

  1. 语法格式: drop index 索引名字

         -- 删除索引
         drop index idx_emp_ename
    

8.4 使用索引的建议

  1. 如果执行查询比较少,但是更新比较多的时候,不建议创建索引;
  2. 对于不经常查询的列,也不适合创建索引.
  3. 有些数据类型不适合创建索引,比如:大文本类型,二进制类型;因为索引列不支持line关键字,'%关键字%'.

9.序列

9.1 概念

  1. 序列是一个用来生成唯一值的数据库对象,一般序列是用来做为主键的自增长
  2. 一个表对应着一个序列.

9.2 创建序列

  1. 语法:
  2.          create sequence 序列名 
             start n -- 开始值
             increment by n -- 步长
             maxvalue n | minvalue n -- 指定序列的最大值或者是最小值 
             nocycle | cycle -- 是否循环正常
             cache n; -- 预先会生成n个序列值保存在缓冲中,
    
    
         -- 创建一个序列
         create sequence seq_emp_empno04
         start with 1000 -- 开始值
         increment by 2 -- 步长
         maxvalue 9999 -- 最大值
         nocycle -- 不循环生成
         cache 10; 
    

9.3 使用序列

  1. nextval:生成并返回一个序列值
  2. currval:返回当前的序列值
  3. 注意:如果创建了序列之后没有调用nextval方法就调用了currval属性,就会引发错误.
  4. 注意:序列保证唯一性,但是不能保证序列的连续性.

9.4 修改序列

  1. 语法格式:
  2.          alter sequence 序列名
             increment by n -- 步长
             maxvalue n | minvalue n -- 指定序列的最大值或者是最小值 
             nocycle | cycle -- 是否循环正常
             cache n; -- 预先会生成n个序列值保存在缓冲中,
    
         -- 使用序列
     select seq_emp_empno.nextval from dual;
     select seq_emp_empno.currval from dual;
     
     -- 插入数据
     insert into emp (empno,ename)
     values (seq_emp_empno.nextval,'狗娃' || seq_emp_empno.currval);
    

9.5 删除序列

  1. 语法格式:

     drop sequence 序列名.
    
  2. 注意:序列是谁创建,谁就可以删除,管理员也可以删除.

     -- 删除序列
     drop sequence seq_emp_empno04;
    

总结今天学习内容

  1. 伪表和伪列
  2. 运算符
  3. 函数
  4. Oracle表空间
  5. 用户与权限(DDL)
  6. Oracle数据库对象:视图,同义词,索引,序列

你可能感兴趣的:(Oracle数据库学习第二天)