zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    在mybatis中调用存储过程的时候,不能加工语句
    mybatis sql注入
    关于mybatis缓存配置讲解
    execution(* com.sample.service.impl..*.*(..))
    mybatis中if test 可以使用== != null '' and or 和括号()
    java中可以对时间进行加减处理,有时候不用在sql语句中处理
    【Guava】RateLimiter类
    maven编译报错 -source 1.5 中不支持 lambda 表达式
    easyui打开dialog后给弹出框内输入框赋值问题
    HttpClient 基于连接池的使用
  • 原文地址:https://www.cnblogs.com/dgsh/p/6650532.html
Copyright © 2011-2022 走看看