oracle 操作基础知识

-- oracle 操作基础知识

--1、登陆oracle的四种方式
    a、cmd --> sqlplus  --> 输入用户名 、密码   
    b、oracle自带的 sql plus
    c、PL/SQL Develeper  -- 常用
    d、浏览器:访问前启动isqlplus服务,输入网址  http://主机:5560/isqlplus    -- 如果是本地,主机为 localhost 或者 127.0.0.1

--2、oracle的系统用户
  a、系统管理员:用户名 sys  密码是  xt
  b、系统操作员:用户名 system   密码是 xt
  c、scott 用户:用户名是 scott   密码是  tiger
            -- 数据库安装完毕,scott用户默认锁定  -- 去除scott用户锁: alter user scott account unlock;

-- 3、其他命令:
   a、清屏:clear;
   b、退出:exit;
   c、连接数据库:conn  用户名/密码   -- 例如:  conn  scott/tiger
   
-- 4、数据类型
   a、varchar2(n) 变长,长度是 1 - 4000
   b、char(n) 定长,长度是  1-2000
   c、number(m,n) 数值类型,m 代表 有效数字位数,n代表小数点后位数
   d、date 日期类型,默认是 dd-mon-yy
   e、boolean  值只能为true  false  null ,不能作为表列类型
   
-- 5、内置函数
   a、数值函数
         ABS(n)  返回数字n的绝对值
          -- select abs(-9) from dual;
         COS(n)  返回数字n的余弦值 (以弧度表示角) 
         -- select cos(180) from dual;
         ACOS(n)  返回数字n的反余弦值 
         -- select acos(0.8) from dual;
         SIN(n)返回数字n的正弦值(以弧度表示角) 
         -- select sin(30) from dual;
         ASIN(n)返回数字n的反正弦值
         -- select asin(0.5) from dual;                         
         TAN(n)返回数字n的正切值(以弧度表示角) 
         ATAN (n)返回数字n的反正切值
         FLOOR(n)  返回小于等于数字n的最大整数 
         -- select floor(2.3) from dual;
         CEIL(n)  返回大于等于数字n的最小整数 
         -- select ceil(2.3) from dual;
         MOD(m,n)  返回两个数字相除后的余数
         -- select mod(5,3) from dual;
         -- select mod(5,0) from dual;
         POWER(m,n)  返回数字m的n次幂 
         -- select power(5,6) from dual;
         ROUND(n,[m])   执行四舍五入运算,m为要保留的小数位数 
         -- select round(4.2) from dual;
         LOG(m,n)  返回数字m为底的数字n的对数 
         LN(n) 返回数字n的自然对数
         EXP(n) 返回e的n次幂
         
   b、字符函数
        ASCII(char)  返回字符串首字符的ASCII码值 
        -- select ASCII('1234') from dual;
        CHR(n)  将ASCII码值转为字符
        -- select chr(97) from dual; 
        CONCAT(char1, char2) 将两个字符串连接 
        -- select concat('王庭','你好') from dual;
        INITCAP(char) 将每个单词的第一个字母大写
        -- select initcap('hello word') from dual;
        INSTR(char1,char2[,n[,m]]) 寻找指定字符串在字符串中的位置
        --select instr('hello word','o') from dual;
        --select instr('hello word','o',6) from dual;
        LENGTH(char)  返回字符串的长度 
        -- select length('赵峰') from dual;
        LOWER(char)  将字符串转为小写 
        -- select lower('HELLO NI HAO') from dual;
        UPPER(char)  将字符串转为大写 
        -- select UPPER('hello ni hao') from dual;
        SUBSTR(char,m[,n]) 返回字符串中指定位置的子串 
        -- select substr('hello kitty',4) from dual;
        --  select substr('hello kitty',4,5) from dual;
        REPLACE(char,search[,replace]) 将字符串替换为指定的字符串
        -- select replace('hello word','o','u') from dual;
        -- select replace('hello word','o') from dual; -- 删除指定的字符串
        TRIM(char) 去除字符串前后的空格
        -- select trim('     hello     ')from dual;
        LTRIM(char) 去除字符串左的空格
        --  select ltrim('     hello     ')from dual;
        RTRIM(char) 去除字符串右的空格
        --select rtrim('     hello     ')from dual;
        
   c、日期和时间函数
        SYSDATE  返回系统当前日期 
        -- select sysdate from dual;
        CURRENT_DATE  返回当前会话时区所对应的日期时间
        -- select CURRENT_DATE from dual;
        EXTRACT  从日期时间值中取得特定数据 
        -- select extract(day from sysdate) from dual;
        ADD_MONTHS(d, n) 返回特定日期时间d加上n个月后的日期时间 
        -- select add_months(sysdate,1) from dual;
        NEXT_DAY(d, char) 返回指定日期后的第一个指定工作日所对应的日期 
        -- select next_day(sysdate,'星期二') from dual;
        LAST_DAY(d)  返回特定日期所在月份最后一天 
        -- select last_day(sysdate) from dual;
           
    d、转换函数
        TO_CHAR(char) 将NCHAR,NVARCHAR2等转换成数据库字符集数据 ,当为NCHAR,NVARCHAR2 等数据类型时,前面加n
        --  select to_char(n'hello word') from dual;
        TO_CHAR (date, fmt)  将日期按指定的日期时间格式转换成字符串 (fmt日期格式)
        -- select to_char(sysdate,'yyyy:mm:dd') from dual;
        TO_DATE (char, fmt)  将字符串按指定的格式转换成日期时间数据
        -- select to_date('2012:11:22','yyyy-mm-dd') from dual;

    e、聚合函数
        AVG ([ALL|DISTINCT])  计算平均值 
        -- 查询平均工资     select avg(sal) from emp;
        COUNT ([ALL|DISTINCT])计算记录的总计行数 
         -- 查询有多少名员工  select count(*) from emp;
         -- 查询有多少个职位  select count(distinct job) from emp;
        MAX ([ALL|DISTINCT])  取得列或表达式的最大值 
         -- 查询员工的最高工资  select max(sal) from emp;
        MIN ([ALL|DISTINCT])  取得列或表达式的最小值
         -- 查询员工的最低工资  select min(sal) from emp;
        SUM ([ALL|DISTINCT])  取得列或表达式的总和
         -- 查询公司的每月总工资  select sum(sal) from emp;
         
    f、其他函数 
        NVL (expr1,expr2):将空转换为实际值。
        -- 查询员工姓名和实际工资,用 0 代替 奖金的空值 
        -- select ename,sal+nvl(comm,0) as 实际工资 from emp;

   查看表的结构: desc  表名
   
   
      
   序列:
      创建序列:
      CREATE SEQUENCE empseq            --自定义的序列名
      INCREMENT BY 1                   -- 每次加几个,即递增的间隔
      START WITH 1                     -- 从1开始计数 
      NOMAXVALUE                    -- 不设置最大值 
      NOCYCLE                      -- 一直累加,不循环 
      CACHE 10;                                --每次取10个数放入缓存

      示例:
        create sequence seq1
        increment by 1
        start with 1
        nomaxvalue  
        nocycle
        cache 10;
               
      序列的使用:
      -- insert into emp values(seq1.nextval,'文博','CLERK',7902,sysdate,800,20,20);
      -- select seq1.nextval from dual;
      -- select seq1.nextval from dual;
      
      CURRVAL:返回 sequence的当前值 
      NEXTVAL:增加sequence的值,然后返回 sequence 值 
      
      修改序列号:
      ALTER SEQUENCE empseq   -- empseq 修改的序列号名
      INCREMENT BY 10         -- 每次增长量
      MAXVALUE 10000          -- 最大值
      CYCLE                  -- 循环,到10000后从头开始 
      NOCACHE ;               -- 不缓存
       
       删除序列
       drop sequence seq1;    -- 删除序列号

    同义词:

         创建同义词
         create [public] synonym 同义词名 for  object  --- 定义同义词的基本格式
         
         -- 创建同义词之前,登陆sys用户,给scott 用户赋予创建同义词的权限
         conn sys/xt;
         grant create any synonym to scott;
         
         -- 给emp创建私有的同义词 e
         create synonym  e for  emp;
         
         -- 使用同义词
         select * from e;
         
         -- 删除同义词
         drop synonym e;

        
完整性约束

        主键约束(PRIMARY KEY)
        外键约束(FOREIGN KEY)
        唯一约束(UNIQUE)
        检查约束(CHECK)
        默认约束(DEFAULT)
        非空约束(NOT NULL)
        
        --创建班级表
        create table class
        (cid number(4) primary key,  -- 主键约束
        cname varchar2(10) unique not null,  -- 非空唯一约束
        cnumber number(2) );
        
        -- 创建学生表
        create table student
        (sid number(4) primary key,   -- 主键约束
        sname varchar2(10) not null,  -- 非空约束
        ssex char(2) default '男',    -- 默认约束
        sage number(3) check (sage>10 and sage<120),        -- 检查约束
        cid number(4),
        constraint con_cid foreign key (cid)                -- 外键约束
        references class(cid));
            
        --创建学生表 方法二
        create table student
        (sid number(4) primary key,
        sname varchar2(10) not null,
        ssex char(2) default '男',
        sage number(3) check (sage>10 and sage<120),
        cid number(4) references class(cid));       -- 外键约束

创建表空间
          
            -- 创建永久表空间
            create tablespace tablespacenew  -- tablespacenew表空间名字
              datafile 'd:/tablestpac.dbf' size 20m  -- 表空间地址及大小
            --示例
            create tablespace testspace
            datafile 'd:/testspace.dbf' size 50m;
            
            -- 创建临时表空间
            create temporary  tablespace tablespacenew -- tablespacenew表空间名字
              tempfile 'd:/tablestpac.dbf' size 20m  -- 表空间地址及大小
            
创建用户:
          -- 基本格式
          create user  用户名
          [Identified by  密码]         -- 用于指定用户的密码
          [default  tablespace 表空间]         --  指定用户默认表空间
          [temporary tablespace  临时表空间]      --  指定临时表空间
          [quota 使用空间大小 on 表空间]  -- 指定用户在特定表空间上的配额
          [password expire]     -- 设置账户初始状态口令为过期
          [account  lock/unlock]     -- 设置账号的初始状态为锁定/非锁定

           -- 示例
            create user xiaoxiao
            identified by xiaoxiao
            default tablespace testspace
            temporary tablespace temptestspace
            quota 40m on testspace
            password expire
            account  unlock;
            
            -- 刚刚创建的用户没有任何权限,只有sys赋予其会话权限,才能登陆
            -- 赋予回话权限
            grant create session to xiaoxiao
            
            -- 修该用户
            alter user 用户名  更改的项
            
            -- 修改xiaohei 的秘密为 minglu
            alter user xiaohei identified by minglu
            
            -- 删除用户
            drop user  用户名
            -- 删除用户  如果用户已经拥有对象,需要追加 cascade ,同时释放表空间
            drop user 用户名 cascade 
            
            -- 显示当前用户
             show user;
            -- Oracle查看当前的数据库名称 ,必须登录 sys用户
            select name from V$database;
            
            -- Oracle显示sql语句的运行时间:
            set timing on

权限:
            -- 系统权限
            -- 授予不限使用表空间的权限
            grant  unlimited tablespace to 用户 
            
            -- 授予系统权限
            grant 系统权限列表(多个权限用“,”分隔)  to  用户
            --授予liubo 不限使用的表空间和创建表、会话的权限
           grant unlimited tablespace,create table,create session to liubo
           -- 授予系统权限,同时准许继续向下传递 -- 如果删除用户 wangting  ,lihu 不受影响
           grant create session to wangting with admin option;
            
            -- 回收系统权限
            revoke 系统权限列表 from 用户
            -- 回收刘博的会话权限
             revoke create session from liubo;
            
            -- 查看系统权限
            -- 显示当前用户权限(user_sys_privs)
            select   *  from user_sys_privs
            
            -- 显示当前会话权限(session_privs)
            select   *  from session_privs
            
            -- 对象权限
            -- 授予对象权限
            grant  对象权限 on 对象名  to  用户
            -- 授予liubo 查看emp表的权限
            grant  select on emp to liubo
            -- 用 账户 liubo 登录,查看emp 表 
            select * from scott.emp;
            -- 授予用户权限,同时准许继续向下传递
           grant select  on  emp  to wangting with grant option;
            
            -- 回收对象权限  
            revoke  对象权限  on 对象名  from 用户

角色:
            -- 角色的创建
            create role 角色名
            -- 创建角色 zhangya
            create role zhangya;
            
            -- 给角色授权
            grant 权限列表 to 角色
            -- 给角色zhangya 授权
            grant create session to zhangya;
            
            -- 用角色给用户授权
            grant  角色  同  用户 
            -- 用角色zhangya给 gaopeng授权
             grant zhangya to gaopeng;
            
            -- 删除 角色  -- 删除角色,用这个角色所赋予的权限消失
            drop role 角色名
            drop role zhangya;
            
            -- 查看当前用户所具有的角色
            select  *  from  user_role_privs

数据字典:
           静态数据字典
           user_users描述当前用户的信息,包括用户名、帐户id、帐户状态、表空间名、创建时间等 
           user_tables描述当前用户拥有的所有表的信息,主要包括表名、表空间名、簇名等 
           user_objects当前用户拥有的所有对象的信息,包括表、视图、存储过程、触发器、索引等 
           user_tab_privs 存储当前账户下对所有表的权限信息
           
           动态数据字典
           V$access 显示数据库中锁定的数据库对象以及访问这些对象的会话对象
           V$session  显示当前会话的详细信息


sql语句的使用:
          --基本查询
          -- 查询表的结构
          desc 表名
          -- 查询 emp 表的结构
          desc emp;
          
          -- 查询所有列
           select * from emp;
           
           -- 查询指定列
           select 列名,列名  from  表名
           -- 查询员工的姓名和薪水
           select ename,sal from emp;
           
           -- 使用算术表达式
           -- 查询每个员工年薪
            select ename, sal*12 from emp;
           -- 查询每个员工的实际工资
            select ename,sal+nvl(comm,0) from emp; 
           
           -- 使用别名
           -- 查询每个员工年薪 ,更改列名
           select ename as 姓名,sal*12 as 年薪 from emp;
           select ename  姓名,sal*12  年薪 from emp;
           
           -- 处理空值 -- 通过 nvl
            
           -- 去除重复行
           -- 查询员工的职位,去除重复行
           select distinct job from emp;

           -- 通过 where 子句进行查询
           -- 通过比较运算符  >  >=   <  <=  =   !=  <>
           -- 查询工资大于2000 并且小于4000的员工信息
           select * from emp where sal>2000 and sal<4000;
           
           -- 范围查询 between .. and      not between .. and
           -- 查询工资在2000 到 4000 之间的员工信息
           select  * from emp where sal between 2000 and 4000;
           
           -- 模糊查询  like     统配符 % 统配0个或多个字符      _  统配一个字符
           -- 查询姓名中有陈 的员工信息
           select * from emp where ename like '%陈%';
           -- 查询姓名只有两个字,第一个字是陈的员工信息
           select * from emp where ename like '陈_';
           
           -- 集合查询  in    not in
           -- 查询 部门编号是  10  或者30 的员工信息
           select * from emp where deptno in(10,30);
           
           -- 非空查询   is  null     is not null
           -- 查询没有奖金的员工信息
            select * from emp where comm is null;
            
            -- 逻辑运算符号  or   and   not 
            -- 查询工资大于4000 并且  20 号部门的员工信息
            select * from emp where sal>4000 and deptno=20;\

            -- 排序查询    order by  asc 升序,默认值    desc  降序
            -- 单属性值排序
            -- 查询员工的姓名和工资,按照工资降序排列
            select ename,sal from emp  order by sal desc;
            -- 多属性值排序
            -- 查询员工的姓名、部门编号、工资,先按照部门编号升序排列,然后按照工资降序排列 
            select ename,deptno,sal from emp order by deptno ,sal desc;
            
数据处理 
            -- 插入数据
            -- 向所有的列插入数据
            -- 要求:1、列数和表中的列数必须相同    2、插入的值顺序必须和表中的顺序一致
            insert into emp values (8888,'刘博','CLERK',7782,sysdate,100,10,10);
            
            -- 向表中插入部分信息
            insert into 表名 (列名) values (列值)  -- 列名和列值的 个数和顺序必须相同
            insert into emp (empno,ename,mgr,hiredate,deptno) values (7777,'金楠',7566,sysdate,20);
            
            -- 修改数据
            -- 修改全部数据
            -- 给每个员工的奖金更改为500 元
            update emp set comm=500 ;
            
            -- 给指定员工更改奖金
            update emp set comm=1400 where ename='WARD';
            
            -- 删除数据
            -- 删除所有数据
            delete from emp;
            -- 删除指定数据
            delete from emp where ename='金楠';
         
事物处理
            -- 提交事务commit :执行该命令,确认事务变化,结束事务,删除保存点,释放锁。
            -- 回滚事务 rollback:执行该命令,退回事务变化,结束事务,删除保存点,释放锁
            
            注意:a、事务提交后不能再回滚
                    b、执行DDL语句成功,自动提交事务
                    c、执行DCL语句(Grant,revoke),自动提交事务
                    d、退出SQL*Plus 自动提交事务

高级查询
分组查询
            -- avg 求平均值
            -- 查询所有员工的平均工资  -- 如果没有 group by,就是对表中的所有信息进行 统计
            select avg(sal) from emp;
            -- 查询各个部门的平均工资  -- 先按照 部门编号分组,然后求平均工资
            select deptno,avg(sal) from emp group by deptno;
             
            -- count 求记录条数 
            -- 求该公司的员工数
            select count(*) from emp;
            -- 求每个部门的员工数
            select deptno,count(*) from emp group by deptno;
            
            -- max  min  求最大值和最小值
            -- 求最高的员工工资
            select max(sal) from emp;
            -- 求每个部门最高的员工工资
            select deptno,max(sal) from emp group by deptno;
            
            -- sum 求和 
            -- 所有每个月工资总和
            select sum(sal) from emp;
            -- 查询 每个部门的员工工资总和
             select deptno,sum(sal) from emp group by deptno;
             
             -- 分组查询的要求
             -- 查询时聚合函数都会忽略null
             --查询所有的员工人数
             select count(comm) from emp;
             --查询所有员工的奖金
             select sum(comm) from emp;
             
             -- 查询时如果一个列出现在了选择列表中,那么他必须出现在group by 子句中
             
             -- 使用分组函数时可以使用 all  或者 distinct 选项,默认为all
             -- 查询每个部门的职位个数
             select deptno,count(distinct job) from emp group by deptno;
             
             -- 使用having 子句对查询结果进行筛选
             -- having 只能作为group by的子句,不能单独出现
             -- 分组函数只能出现在选择列表、having子句和group  by 子句中
             -- 如果查询语句中同时包含group  by子句,having子句和order  by 子句,则order  by 放在最后面
             
             -- 查询各个部门的平均工资,按工资降序排列
             select deptno,avg(sal) from emp group by deptno order by avg(sal) desc;
             -- 查询各个部门的平均工资,显示平均工资大于2000的部门
              select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;




连接查询:
              -- 连接查询是指基于两个或两个以上的基表或视图的查询
              注意事项:
              -- 使用连接查询,from子句后必须指定两个或者两个以上的表
              -- 使用连接查询,应当在列名前加表名作为前缀,如果不同表的列名不同,可以省略前缀。
              -- 使用连接查询,必须在where后指定连接条件
              -- 可以使用别名进行连接查询
              
              连接查询分类:
              -- 等值查询
              -- 查询各个员工所在的部门名称
              select ename,dname from emp,dept where emp.deptno=dept.deptno;
              select ename,dname from emp  e,dept  d where e.deptno=d.deptno;
              
              不等值连接:
              自连接:-- 使用同一个数据表或者视图,自己连接自己
              -- 查询每个员工的姓名及其上司的姓名
              select e.ename,m.ename from emp e,emp m where e.mgr=m.empno;
              -- 注意事项:
              1、必须给表起两个别名,把一个表看做两个表
              2、查询列的时候必须加表名作为前缀


连接查询:
              -- 连接查询是指基于两个或两个以上的基表或视图的查询
              注意事项:
              -- 使用连接查询,from子句后必须指定两个或者两个以上的表
              -- 使用连接查询,应当在列名前加表名作为前缀,如果不同表的列名不同,可以省略前缀。
              -- 使用连接查询,必须在where后指定连接条件
              -- 可以使用别名进行连接查询
              
              连接查询分类:
              -- 等值查询
              -- 查询各个员工所在的部门名称
              select ename,dname from emp,dept where emp.deptno=dept.deptno;
              select ename,dname from emp  e,dept  d where e.deptno=d.deptno;
              
              不等值连接:
              自连接:-- 使用同一个数据表或者视图,自己连接自己
              -- 查询每个员工的姓名及其上司的姓名
              select e.ename,m.ename from emp e,emp m where e.mgr=m.empno;
              -- 注意事项:
              1、必须给表起两个别名,把一个表看做两个表
              2、查询列的时候必须加表名作为前缀
              
              内连接:inner join
              -- 查询各个员工所在的部门名称
              select ename,dname from emp inner join dept on emp.deptno=dept.deptno;
              --结果集是符合条件的所有结果
              
外连接 [outer]放在join和(left、right、full)之间
              -- 左连接  left  join
              -- 查询各个员工所在的部门名称 ,包含没有分配部门的员工
               select ename,dname from emp left join dept on emp.deptno=dept.deptno;
               -- 左连接的结果集是符合条件的所有内容,和不符合条件的左面表的所有内容
              
              -- 右连接  right join
              -- 查询各个员工所在的部门名称 ,包含没有员工的部门
              select ename,dname from emp right join dept on emp.deptno=dept.deptno;
               -- 右连接的结果集是符合条件的所有内容,和不符合条件的右面表的所有内容
               
              -- 全连接  full join
              -- 查询各个员工所在的部门名称 ,包含没有员工的部门和没有部门的员工
              select ename,dname from emp full join dept on emp.deptno=dept.deptno;
              -- 全连接的结果集是符合条件的所有内容,和不符合条件的所有内容



子查询:
              -- 在一个查询语句中嵌套另一个查询语句,也叫嵌套查询
              子查询分类:
           单行子查询  -- 子查询返回的结果是一行
                  -- 内层子查询只返回一行数据的子查询语句,外层查询的WHERE子句中可以使用单行比较运算符(<> 、= 、>=、 <=、 >、 < )
                  -- 查询和scott 同一个部门的员工信息
                  select * from emp where deptno=(select deptno from emp where ename='SCOTT');
                                    
          多行子查询    -- 子查询返回的结果集是多行
                  -- 返回多行数据的子查询语句,外层查询的WHERE子句中必须使用多行比较符(IN、ALL、ANY )
                  -- 查询和编号为10的部门工作相同的员工信息
                  select * from emp where job in(select job from emp where deptno=10);
                  -- 查询比 30 号部门所有员工工资高的员工信息
                  select * from emp where sal>all(select sal from emp where deptno=30);
                         -- 大于所有 ,即是大于最大的,大于任何一个,即是大于最小的
                         -- 小于
                   
           多列子查询 -- 返回多列数据子查询语句
                  -- 查询和scott 同一个部门,并且同一个工作的员工信息
                  select * from emp where (job,deptno)=(select job,deptno from emp where ename='SCOTT');
                  
           其他子查询
                  -- exists -- 子查询相当于一个开关语句,如果子查询有结果集,那么显示查询的所有内容,如果子查询没有 结果集,那么查询结果不显示
                  -- 查询所有的员工信息,如果有员工的编号为1000,那么现实所有信息,否则不显示
                  select * from emp where exists (select * from emp where empno=1000);
                  
                  -- 在insert 语句中使用
                  -- 增加一名员工的信息,他的姓名和薪水和 scott 相同
                  insert  into  emp ( empno,ename,sal ) select empno+1,ename,sal from emp where ename='SCOTT';
                  
                  -- 在update 语句中使用
                  -- 更改苏旭晨 的信息,使他的薪水和 black 的相同
                 update emp set sal=(select sal from emp where ename='BLACK') where ename='苏旭晨';
                  
                  -- 在delete 语句中使用
                  -- 删除 和Ford 工资相同的员工
                  delete from emp where sal=(select sal from emp where ename='FORD')
集合查询:
           -- 概念:将两个或多个分结果集进行集合操作得到新的结果集。
           -- 分类
           -- UNION(并集,结果总集删除重复记录)
           -- 查询工资大于3000 或者 工作是 销售的员工信息
           select * from emp where job='SALESMAN'
           union
           select * from emp where sal>3000;
           
           UNIION ALL(并集,结果不删除重复记录)
           -- 查询奖金不为空 或者 工资大于2000的 员工信息
            select * from emp where comm is not null
            union all
            select * from emp where sal >2000;
           
           INTERSECT(交集)
           -- 查询奖金不为空并且工资大于2000的员工信息
           select * from emp where comm is not null
           intersect
           select * from emp where sal>2000;
           
           MINUS(差集) 
           -- 查询工资大于2000 的员工信息,去除 领导阶层的
           select * from emp where sal>2000
           minus
           select * from emp where job='PRESIDENT';
           
其他查询:
          -- case的使用
          -- 对雇员表雇员工资进行查询分级
          -- 对于工资在3000以上的定为最高级(第三级)工资,
          -- 对于工资大于200且小于等于3000的员工工资定为第二级,
          -- 对于其它情况为第一级。
          -- 查询输出员工名称、员工工资及工资级别。
          select ename,sal,
          case when sal>3000 then 3
          when sal>200 then 2
          else 1 end grade
          from emp;


索引:
      -- 概念
      -- 是一种可选的与表相关的数 据库对象,用于提高数据库的查询效率
      -- 索引是建立在表列上的数据库对象,但不依赖于表
      -- 在一个表上创建索引,不会 影响表的使用方式,只会影响表中数据的查询效率 
      
      -- 分类:
      -- 唯一索引和非唯一索引(根据索引值是否唯一)
      -- 平衡树索引和位图索引(根据索引的组织结构)
          -- a、平衡树又称B树索引,在数的子节点中保存索引值和rowid,Oracle默认创建的是平衡树索引。它占用空间多,适合索引值基数高,重复率低的应用
          -- b、位图索引是为每一个索引值建立一个位图,在位图中使用一个位元对应一个rowid。它占用空间小,适合索引值基数少,重复率高的应用
      -- 单列索引和复合索引(根据索引引用的列数)
      -- 函数索引(包含列的函数或表达式创建的索引 )
      
      -- 创建索引:
      -- 基本格式:
      create [unique][bitmap]  index  索引名   -- unique 唯一索引,bitmap位图索引
      on  表名(列名[asc/desc],列名…)    
      [reverse]        -- 反转索引
      
      --为 users 表的usid列创建索引
       create index index_u on users(usid);

      -- 创建唯一/非唯一索引
      create unique index ind3 on emp(empno) ;

      -- 创建位图索引
      create bitmap index bindx on emp(sex) ;

      -- 创建函数索引
      create index findx  on emp(lower(ename)) ;
      
      -- 一般情况下,满足一下条件,删除索引
      a、该索引不再使用
      b、该索引很少或几乎不使用
      c、索引中包含损坏的数据或者过多的存储碎片,需要删除重建
      d、移动了表数据,导致索引失效
      
      -- 删除方法
      drop  index 索引名
      -- 删除索引
      drop index index_u;
      
      --在SQL中有很多陷阱会使一些索引无法使用。
      使用( <>、!= )操作符会限制索引的使用
      is Null  和 not  is null 会限制索引的使用
      对索引的列使用函数时,会忽略索引
      比较不匹配的数据类型,索引失效

      -- 查看索引信息
      dba_indexes、all_indexes、user_indexes包含索引的基本描述信息和统计信息
      dba_ind_columns、all_ind_columns、user_ind_columns包含索引列的描述信息
      dba_ind_expressions、all_ind_expressions、user_ind_expressions  包含函数索引的描述信息

簇
      -- 概念
      -- 簇是存储表数据的一种可选结构,它由一组共享相同数据块的表组成。并且这些表都具有共同的簇键列
      -- 建立索引簇
       create cluster dept_emp_cluster(deptno number(3));
      --创建簇
      create cluster clu_cla_stu(cid number(4));
      
      -- 建立簇表
     create table dept (        -- 建立部门表
            deptno number(3) primary key,
            Dname  varchar2(14),
            Loc     varchar2(13),
            Address varchar2(30)
            )cluster  dept_emp_cluster(deptno);    -- 指定使用索引簇的列
            
            create table emp(        -- 建立 员工表
                   Empno number(4)  primary key,
                   Ename varchar2(10),
                   deptno number(3) constraint fk_deptno references dept(deptno)
                   ) cluster  dept_emp_cluster(deptno);    -- 指定使用索引簇的列
                   
      -- 注意:簇表是放在簇段中的,所以不需要表空间配额,为了将表组织到簇中,必须在建表时指定cluster

    -- 建立簇索引
    create index dept_emp_idx on cluster dept_emp_cluster
    -- 使用索引簇
    select dname,ename,sal from dept where dept.deptno=10 and dept.deptno=emp.deptno
    -- 当主从表组织到索引簇之后,如果执行两表连接查询,可以大大降低I/O次数,从而提高查询的速度

    -- 删除簇
    -- 删除不带表的簇
    drop cluster dept_emp_cluster ;
    -- 删除带表的簇
    drop cluster dept_emp_cluster including tables;
    -- 删除带表的簇(先删除簇表)
    drop table dept ;
    drop table emp ;
    drop cluster  dept_emp_cluster

创建视图
        --基本格式
        create [ or replace ]  view  视图名(别名列表)
        as  select   子查询语句
            
        -- 创建简单的视图
        create view 视图名 as 子查询语句
        -- 给emp表创建视图 ,只存储员工的姓名和 工资
        create view emp_view as select ename,sal from emp;
        
        -- 创建别名列表的视图
        create view 视图名(别名列表)  as 子查询语句
        -- 创建视图 起别名
         create view view_sal(姓名,工资) as select ename,sal from emp;
         select * from 视图名;
        -- 创建复杂的视图
        create view 视图名(别名列表)  as 连接查询
        create view view_dept_emp(姓名,部门) as select ename,dname from emp,dept where emp.deptno=dept.deptno;
        
        -- 删除视图
        DROP VIEW  视图名
        drop view view_dept_emp;

 

posted @ 2017-03-31 11:40  码农兜兜  阅读(399)  评论(0编辑  收藏  举报