Oracle总结

oracle SQL
  SQL(strunctured query language) (结构化查询语言)

  DDL(data definition language) 数据定义语言
  1.create(创建表)
     有两中方法
     方法一:create table 表名(column列 数据类型 宽度 约束)
   如:
     create table user(id number(2),name char(20));
     方法二(表的复制):create table 表名
                    as
                    select * from 存在的表名

  2.alter(修改表)
     增加列(在表的最后一列增加)       格式:alter table 表名 add(列名 数据类型)
    
   exists 存在 not exists 不存在
     exists只要找到一条符合条件的记录立即返回,主表的记录进入结果集,所有的记录多不符合条件返回,主表的记录被过滤.
     not exists只要找到一条符合条件的记录立即返回,主表的记录被过滤.所有的记录都不符合where之后的条件,说明not exists成立,主表的记录进入结果集.
                                  例如:alter table user add(password varchar2(20));

     删除列  drop column           格式:alter table 表名 drop column 字段名;
                                  例如:alter table user drop column password;

     更改数据类型 (modify关键字)     格式:alter table 表名 modify(更改的字段名 想要该的类型)
                                  例如:alter table user modify(id char(20));     
    
  3.drop(删除表和结构)
    drop table 表名
 
  4.truncate(清空表数据,保留表结构)
    1) truncate 保留表结构 , 删除表中所有数据
    2) truncate 操作不需提交(commit),没有回退(rollback)的机会
    3) 语法结构: truncate table 表名 ;
    4) truncate与delete的区别:
        truncate 在功能上等同于:delete + commit
        delete 操作将删除数据存储到临时空间中,不直接删除,可以回退。
        truncate 操作直接删除,不占用临时空间,不能回退。


  DML(data maniplulation language) 数据操作语言
   1.insert 插入数据
      格式一: insert into 表名 (列名1,.....) values (值1,......);
         如: insert into user (id,name) values (1,huanghai);
      格式二: insert into 表名 values(值1,.......)  (这里要明确知道表列名的类型和顺序)
         如: insert into user values(1,huanghai);
      格式三: insert into 表名 (select * from 存在的表) (这里可以实现插入多条数据)
 
   2.update 修改数据
       格式:update table(这个可以缺省) 表名 set 类名=设置的值 where 条件
       例如:update table user set id=23 where id=1;
     注意: 更新( update )数据表时  , 注意条件 , 如果不加条件 , 修改的是全部表记录

   3.delete 删除数据
       格式:delete from(这个可以缺省) 表名 where(如果没有这个条件,删除全部数据) 条件
       例如:delete from user where id=1;

   注意:
    drop table 会删除表结构和数据.
    truncate 删除表数据,保留表结构。Drop和truncate都不可以回退。
    delete 仅删除数据 , 可以回退

   Transaction(事务)
     1) 事务是一组 DML 操作的逻辑单元 , 用来保证数据的一致性。
     2) 在一个事务内, 组成事务的这组DML操作,或者一起成功提交,或者一起被撤销。
     3) 事务控制语言TCL( Transaction Control Language )
        commit        事务提交 将所有的数据改动提交
        rollback      事务回滚 回退到事务之初,数据的状态和事务开始之前完全一致
        savepoint     事务保存点(较不常用)

   事务的开始和终止(事务边界)
    1) 事务开始
       事务开始于上一个事务的终止或者第一条DML语句
    2) 事务终止
     事务终止于 commit/rollback 显式操作( 即控制台输入 commit/rollback )
     如果连接关闭 , 事务( Transaction )将隐式提交
     DDL 操作( 比如 create ) , 事务将隐式提交
     如果出现异常 , 事务将隐式回滚。
  
   事务中的数据状态
     如果多个会话操作同一张表的数据
     当用户与服务器建立连接成功后 ,服务器端 Oracle 将与客户端建立一个会话( Session )。
     客户端与 Oracle 的交互都是在这个会话环境中进行的。
    1) 事务内部的数据改变只有在自己的会话中能够看到
    2) 事务会对操作的数据加锁 , 不允许其它事务操作
    3) 如果提交(commit)后,数据的改变被确认,则
       所有的会话都能看到被改变的结果;
       数据上的锁被释放;
       保存数据的临时空间被释放
    4) 如果回滚(rollback) , 则
       数据的改变被取消 ;
       数据上的锁被释放 ;
       临时空间被释放

   TCL(transaction control language) 事务控制语言
    1.commit(提交)          将所有的数据改动提交
    2.rollback(事务回滚)     回退到事务之初,数据的状态和事务开始之前完全一致
    3.savepoint(事务保存点)  较不常用
  
   DCL(data control language) 数据控制语言
    1.grant(授权)
    2.revoke(回收权限)

   DML、DDL、DCL 语句都是 sql 语句

   rename关键字,重命名表
   格式: rename 表名 to 新表名
   如: rename  user to user_table;

   rowid 关键字 删除重复数据( 较简单 , 性能高 )
    1)  rowid 是 Oracle 数据库的伪列 , 可以看作是一条数据在数据库中的物理位置
    2)  rowid 是 Oracle 数据库独有的
   注意:每一条记录的 rowid 在数据库中都是唯一的
    如:
      delete from emp_bak1
      where rowid not in (select max(rowid) from emp_bak1
                       group by empno , ename , salary ) ;
======================================================================================
执行数据库脚步文件(.sql)
 Windows操作系统
  步骤 1
   在指定路径新建一个.sql为后缀名的文件(如:d:\aaaa \test.sql)
  步骤 2
   编辑,如:
   create table user(id number(2),name varchar2(20));
   insert into user (id,name) values(01,'huanghai'):
   commit;
  步骤 3
   在服务器端运行执行.sql脚本(脚本文件和sqlplus在同一台机器上)
   SQL> @ d:\aaaa \test.sql(@执行)

 Linux 操作系统
  步骤 1:创建一个 ning.sql 文本文件:
      %提示符下输入vi+文件名,在编辑区输入内容如下:
      create table user(id number(2),name varchar2(20));             
      insert into user (id,name) values(01,'huanghai'):
      commit;
     并在命令模式下输入:x保存退出
  步骤 2:查看该文件的路径
      pwd ning.sql (假设路径为:/user/ning.sql)
  步骤 3:
    在sqlplus中执行此文件:
    格式: 在%后面 sqlplus 用户名/密码 @ /user/ning.sql

  如:
 SQL> exit;
 从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
 With the Partitioning, OLAP and Data Mining options 断开
 -bash-3.2$ vi text.sql;
 -bash-3.2$ vi student.sql;
 -bash-3.2$ pwd student.sql;
 /home/soft
 -bash-3.2$ sqlplus huanghaibin28/huanghaibin28 @/home/soft/student.sql

 SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 8月 12 15:27:11 201
 Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 连接到:
 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
 With the Partitioning, OLAP and Data Mining options
 表已创建。
 已创建 1 行。
 提交完成。
 SQL>
======================================================================================
  常用
  select(投影操作)
   select子句后面可以跟 列名 或表达式 或函数 或算术表达式 或字符表达式
   如: select id from user;

  distinct 去除重复的值(必须跟在select之后)

  between and 必区间 范围 >=and<=

  in(集合)<==>any(跟集合里的任意一个值相等)<==> = or =
  not in<==> <>any(跟集合里的任意一个值都不相等)<==> <> and <>

  模糊查询:
   like 像..字符
   通配符 % 0或多个字符    _任意一个字符
   如: like '%name%'  like 's%' like 's_'  (select * from user like '%id';)
   '_%'的含义 一个代表通配符%,另一个代表它本省
   not like 不像..字符

  关于null的讨论
   判断一个列的取值是否为空,用is null
   insert 包含null,没值,算术表达式中包含null值,结果一定为null.null可以按无穷大理解.
   distinct bonus,bonus包含多个null值,结果集包含一个null值.
   null = null 不成立 1 <> null 不成立 null <> null 不成立
   对于in来说,集合里面是否包含null值,对结果集没影响
   对于not in来说,集合里面包含null值,结果集一定是no rows selected.(没有任何记录)
=========================================================================================
函数 function
 
  单行函数
     1.数值函数
        round():round( 数字 , 小数点后的位数 )用于数字的四舍五入
        如:
             round(34.45434,2)-->34.45  round(32.353)-->32 round(23.345,2)-->23.35

        trunc():trunc( 数字 , 小数点后的位数 )用于截取,不进行四舍五入,如果没有第二个参数 , 默认是0
        如:
           trunc(34.45434,2)-->34.45   trunc(32.353)-->32  trunc(23.345,2)-->23.34
    
     2.日期函数
        sysdate
        获取系统当前时间:  select sysdate from dual(虚表);

        add_months(sysdate,+-1) 月份加一个月或少一个月
        如:查询上一个月份  select add_months(sysdate,-1) from dual;

        months_between(sysdate,hiredate) 相差了多少个月
        如:查询员工工作了多少个月 select months_between(sysdate,hiredate) from employee(员工表);

        last_day(sysdate) 某月的最后一天
        如:这个月的最后一天是几号 select last_day(sysdate) from dual;

        日期数据相减 ,得到两个日期之间的天数差
        如:员工工作了多少天: select (sysdate-hiredate) as days from dual;
    
      3.转换函数
        缺省日期格式 DD-MON-RR
        to_date()和to_char()是时间处理的函数

        to_date(插入的字符日期,格式) 将字符串数据 按指定格式 转换为 日期函数
        如:插入一条日期 insert into employee values(to_date('2012-08-08','yyyy-mm-dd'));

        to_char(输出列,格式)  将日期数据 按指定格式 转换为 字符串数据
        如:输出日期按指定格式  select to_char(sysdate,'yyyy-mm-dd') from dual;

        to_number() 将字符转换为数字
        如:  select to_number('$3,23,23.23','$9,99,99.99') from dual; ---> 32323.23

     4.字符函数
        1) upper    转换为大写
        2) lower    转换为小写
        3) initcap  转换为首字母大写
        4) length   取长度
        5) lpad     左补丁
        6) rpad     右补丁
        7) replace  字符替换
        8) trim     去除前后的空格

        upper() 将指定内容转换为大写
        如: select upper('abcd') from dual;--->ABCD
 
        lower() 将指定内容转换为小写
        如:  select lower('ABCD') from dual;--->abcd

     5.一般函数
        nvl(p1,p2) 如果p1为空,则返回p2,否则返回p1

        coalesce(参数列表) 作用: 返回参数列表中第一个非空参数,参数列表中最后一个元素通常为常数
        如:
              1)  如果 bonus 不是 null , 发年终奖金额为 bonus
              2)  如果 bonus 是 null , 发年终奖金额为 salary * 0.5
              3)  如果 bonus 和 salary 都是 null, 发 100 元安慰一下
          SQL> select ename , bonus , salary ,
                      coalesce( bonus , salary*0.5 , 100 ) bonus from employee;
 
        case语句 是数据中的分支语句 , 相当于 Java 中的 switch-case 语句。
        如:
              1)  如果职位是 Analyst:加薪 10%
              2)  如果职位是 Programmer :加薪 5%
              3)  如果职位是 clerk :加薪 2%
              4)  其他职位:薪水丌变
            SQL> select ename , salary , job ,
                  case job when 'Analyst'      then salary * 1.1      --注意这里没有“ , ”
                           when ' Programmer'  then salary * 1.05
                           when 'clerk'        then salary * 1.02
                           else salary                                --else相当于Java中 case语句的default
                   end new_salary(别名)   from employee                --end是case语句的结束标识

        decode函数
          decode()函数是Oracle中等价于 case when 语句的函数 , 作用同 case 语句相同。
          decode 函数语法如下:
          decode(判断条件 , 匹配 1 , 值 1 , 匹配 2 , 值 2 , … , 默认值)
           表达的意思是:如果判断条件 = 匹配 1 ,则迒回值 1
                         判断条件 = 匹配 2 ,则迒回值 2
          如:SQL> select ename , salary , job ,
                 decode( job , 'Analyst' , salary * 1.1 ,'Programmer' , salary * 1.05 ,'clerk' , salary * 1.02 ,salary)
                 new_salary
                 from emp_xxx ;
         
      多行函数(组函数)
       avg()    平均值  数值
       sum()    求和    数值
       count()  计数 数值 字符 日期
       min()    最小值 数值 字符 日期
       max()    最大值 数值 字符 日期
       avg(all ) avg(distinct )
       组函数:count / avg / sum / max / min 如果函数中写列名 , 默认忽略空值


       组函数处理的是所有的非空值,count(*)返回记录数,空值不影响
       与单行函数如 round()、to_date()、to_char()、coalesce()等不同 , 单行函数是每行数据迒回一行
       结果 , 组函数是多行数据迒回一行结果

 
       group by(分组)
        在没有group by的情况下,select后面只要有一个组函数,其他的必须是组函数
        如: select name,avg(salary) from employee;会报错:
        ORA-00937: not a single-group group function不是组函数 因为name返回多条记录,而avg返回的是一条记录

        在有group by的情况下,select后面可以跟组标识(group by 后面),组函数
        如: select deptno from employee
            group by deptno;
        having(对分组的内容进行过滤) 跟在group by 后面
        having过滤的是分组,可以跟组标识,可以跟组函数,不能跟单行函数
        如:求每个部门平均工资在3000以上的人
         select max(ename) from employee group by deptno having avg(salary)>3000;
      
        排序(order by)
        order by 是最后一个子句,order by 在select 之后执行
        格式:
        order by 列名 asc(升序,缺省) desc(降序)
        如:
        select * from user order by user_id desc;
        order by 后面跟列名,列别名(重新命名),表达式(函数),
        字符,数值,日期都可以排序

        执行顺序
         from->where->group by->having->select->order by
        排序语句放在查询语句的最后
     
        where 是对表中数据的过滤 ;
        having 是对分组得到的结果数据进一步过滤
==========================================================================================
 数据字典
   1) user_tables       用户所有的数据表
   2) user_constraints  用户所有的约束条件
   3) user_objects      用户所有的对象( 表、视图、索引等 )
   4) all_tables        用户能访问的数据表 包括自己的和别的用户允许自己访问的                                     
   5) all_constraints   用户能访问的约束条件
   6) all_objects       用户能访问的对象( 表、视图、索引等 )
   7) 数据字典的格式如:
        User_XXX:  用户自己的对象
         All_XXX: 用户能访问的对象
         Dba_XXX: 数据库所有的对象

   user_tables(只读,不能改)(所有创建的表)
   字段是 table_name 表名
   如: select table_name from user_tables;

   user_objects(表创建的时间)
   字段是 created  表的创建时间
   如: select table_name , created from user_tables,user_objects;
==========================================================================================
 sql*plus命令
 
   show user;(查看当前用户账户)
   show user 和 select user from dual 语句作用相同
==========================================================================================
子查询: 当一个查询是另一个查询的条件时,称之为子查询
 
   1.非关联子查询
    子查询是独立的sql语句,不依赖主查询,这种方式叫非关联子查询
    如:
     select ename
     from employee
     where deptno=(select deptno from dept where dname='develop');
   2.关联子查询
   子查询中不再是独立的Sql语句,需要依赖主查询传来的参数,这种方式叫关联子查询
   如:
    select ename, salary, deptno
    from emp_xxx a
    where salary < ( select avg(nvl(salary,0))
                     from emp_xxx
                     where deptno = a.deptno) ;


   单行比较运算符和 All(所有)、Any(任意)、in
     根据子查询返回的结果的行数选择使用:
      返回一行   > < >= <= = <>
      返回多行   >ALL >ANY <ALL <ANY in
   子查询的条件是单列还是多列没关系,关键是要分清返回的是单行还是多行
   如果是单行 , 用单行比较运算符 , = , >, < 这些
   如果是多行 , 用 in, >all, >any, <all, <any 这些
 
   子查询可以出现在having短语中

   Exists关键字
     exists 关键字判断子查询有没有数据返回 , 有则为 ture , 没有则为 false
     exists 不关心子查询的结果 , 所以子查询中 select 后面写什么都可以
   如:
    select ename from emp_xxx a
    where exists (select 1  from emp_xxx
                  where mgr = a .empno) ;
  
  exists 存在   not exists 不存在
  exists    只要找到一条符合条件的记录立即返回,主表的记录进入结果集,所有的记录多不符合条件返回,主表的记录被过滤.
  not exists只要找到一条符合条件的记录立即返回,主表的记录被过滤.所有的记录都不符合where之后的条件,说明not exists成立,主表的记录进入结果集.
========================================================================================
表间关联查询
   
     1.内连接
      语法:表1 join 表2 on 条件
      1) 表1 叫做驱动表, 表2 叫做匹配表
      2) 等值连接方式下,驱动表和匹配表位置可以互换 ,不影响结果集
       如:
       select ename , dname , location
       from dept_xxx t1 join emp_xxx
       on t1.deptno = t2.deptno ;
      3) 执行方式:不论谁做驱动表 , 都会遍历驱动表 , 在匹配表中查找匹配数据
     两张表的任意一条记录要想出现在结果集中,必须在另一张表中根据on条件找到匹配的记录(只有匹配的数据才会返回,不匹配的数据过滤)

     2.外连接
      1) 左外连接语法结构: 表1 left   outer join    表2  on 条件
      2) 右外连接语法结构: 表1 right  outer join    表2  on 条件
      3) 外连接的特征:
            left  outer join 以左边的表为驱动表
            right outer join 以右边的表为驱动表

           如果驱动表在匹配表中找不到匹配记录 , 则匹配一行空行
     
           外连接的结果集 = 内连接的结果集 + 驱动表在匹配表中匹配不上的记录和空值
       
           外连接的本质是驱动表中的数据一个都不能少

     3.全外连接 full outer join
      1) 全外连接可以把两个表中的记录全部查出来
      2) 全外连接的结果集 = 内连接的结果集 +
                   驱动表中在匹配表中找不到匹配记录的数据和null值
                   +
                   匹配表中在驱动表中找不到匹配记录的数据和null值
      3) 驱动表和匹配表可以互换

      
     总结:
        内连接在等值连接方式下,驱动表和匹配表位置可以互换 ,不影响结果集
        外连接驱动表和匹配表位置互换,会影响结果集,注意谁做驱动表,还是匹配表
        全外连接驱动表和匹配表可以互换,可以把两个表中的记录全部查出来
         
========================================================================================
结果集操作
     数据库中的查询语句的结果集(ResultSet)
     1) 两个结果集必须结构相同
           当列的个数、列的顺序、列的数据类型一致时 , 我们称这两个结果集结构相同
           只有结构相同的结果集才能做集合操作
       
     2) 合集    
           union 和 union all
           union 和 union all 的区别
               union 去掉重复记录 , union all 不去重
               union 排序 , union all 不排序
           在满足功能的前提下 , 优选 union all
        如:
          select ename , salary from emp_xxx
          where deptno = 10
          union(去重复)
          select ename , salary from emp_xxx
          where salary > 6000 ;

  
     3) 交集    
          intersect
         如:
           select ename , salary from emp_xxx
           where deptno = 10
           intersect
           select ename , salary from emp_xxx
           where salary > 6000 ;


     4) 差集     minus( 两个集合做减法 )
         如:
           select ename , salary from emp_xxx
           where deptno = 10
           minus
           select ename , salary from emp_xxx
           where salary > 6000 ;

    注意:只有结构相同的结果集才能做集合操作

==================================================================================
constraint 约束

 1.primary key 主键 (表中只有一个主键,不能为空且唯一) 目的是保证表里不会出现两条完全一样的值
  1) 主键约束( primary key ) = 不能重复 + 不能为 null
  2) 主键约束可以用两种方式定义:列级约束和表级约束
  
  列级约束
  如:
     create table dept_ning1(
      deptno number(2)  primary key, --列级约束条件
      dname  varchar2(20),
      location varchar2(40)
     );
  
  表级约束
  如:
    create table dept_ning2(
      deptno number(2) ,
      dname varchar2(20) ,
      location varchar2(40) ,
      constraint dept_ning2_deptno_pk primary key (deptno)
    );
  建议约束命名规则:表名_列名_约束条件的类型
  因为约束条件建立在列级时可读性不好 , 而且不方便定义约束条件名字,一般建议定义在表级。

 2.非空约束(not null,简称NN)
   注意:非空约束只能定义在列级
   如:
     create table student_ning(
     id number(4) primary key,
     name varchar2(10) not null,
     age number(2)
     );
   给非空约束命名
   如:
     create table student_ning(
     id number(4) primary key,
     name varchar2(10) constraint student_name_nn not null,
     age number(2)
     );
 
  3.唯一约束(Unique,简称 UK )
   1)列级约束
   如:
     create table student_ning1(
      id number(4) primary key,
      name varchar2(10) not null,
      email varchar2(30) unique,  --列级约束
      age number(2)
    );
   2)表级约束
   如:
     create table student_ning2(
     id number(4),
     name varchar2(10) not null,
     email varchar2(30),
     age number(2),
     constraint s tudent_ning2_id_pk primary key(id),
     constraint s tudent_ning2_email_uk unique(email)
   );
 
  4.检查约束(Check ,简称CK)
   1)列级约束
    如:
        create table student_ning3(
        id number(4) primary key,
        name varchar2(10) not null,
        email varchar2(30) unique,
        age number(2) check(age > 10),
       );
    2)表级约束
    如:
     create table student_ning3(
      id number(4),
      name varchar2(10) not null,
      email varchar2(30),
      age number(2),
      constraint s tudent_ning3_id_pk primary key(id),
      constraint s tudent_ning3_email_uk unique(email),
      constraint s tudent_ning3_age_ck check(age > 10),
     );

 
 primary key 和 unique的区别
 1.pk不允许为空,uk可以为空
 2.一张表中只有一个pk,可以有多个uk
 pk,uk都要求唯一
===================================================================================
 2.foreign key 外键
    之前讲的几个约束条件都是用来约束单个表中的列,而外键约束定义在两个表的两个字段上(或者一个表的两个字段上),用亍保证相关两个字段的关系。

  外建的定义形式:
  形式一:c2 number(3) constraint chile_c2_fk references parent(c1)
  形式二:c2 number(3) constraint chile_c2_fk references parent(c1) on delete cascade
  形式三:c2 number(3) constraint chile_c2_fk references parent(c1) on delete set null

  在child table的某列定义外建,它的取值要引用parent table的某列,该列要求唯一特性(pk/uk);

 2.1 先create parent table,在create child table
 2.2 先insert into parent table,在 insert into child table
 2.3 先delete from child table,在 delete from parent table
 2.4 先drop child table,在 drop parent table
 
 create table parent(
   c1 number(3) constraint parent_c1_pk primary key);

列级约束
 create table child(
   c1 number(2) constraint child_c1_pk primary key,
   c2 number(3) constraint chile_c2_fk references parent(c1));
           
注意: 插入数据时,一定要先在parent表插入,child表才能插入数据,否则会报错
     删除数据时,一定要先删除child表中的数据,parent表的数据才可以删除,否则会报错
     删除表时,一定要先删除child表,parent表才能删除,否则会报错

删除表方法一:
注意:通过这条语句,可以不知道表之间的关系就可以删除parent
    drop table parent cascade(级联) constraint;
 先将child表上的外建约束drop,断绝父子关系

删除表方法二:
on delete cascade 级联删除

create table child1(
   c1 number(2) constraint child_c1_pk primary key,
   c2 number(3) constraint chile_c2_fk references parent(c1) on delete cascade);
 
on delete cascade(级联删除) 影响对parent表的delete操作,系统先delete from child,在delete from parent

删除表方法三:
create table child1(
   c1 number(2) constraint child_c1_pk primary key,
   c2 number(3) constraint chile_c2_fk references parent(c1) on delete set null);

on delete set null(删除之前设置为空) 影响对parent表的delete
 先将child 表中的c1=值 update成null,在delete from parent中c1=1的记录

表级约束
c2 number(3),
constraint chile_c2_fk foreign key(c2) references parent(c1)
====================================================================================                
 联合主键的定义
  如: 表 c1,c2,c3, c1,c2做成联合主键(c1,c2不能为空)
  create table test(
      c1 number,
      c2 number,
      constraint test_c1_c2_pk primary key(c1,c2),
      c3 varchar2(3));
 
 练习
  表 c1,c2,c3,c4,c5  c1,c2,c3 要求唯一且非空, c4,c5为联合唯一
  create table test(
   c1 number constraint test_c1_pk primary key,
   c2 number not null constraint test_c2_uk unique;
   c3 number not null constraint test_c3_uk unique;
   c4 number,
   c5 number,
   constraint test_c4_c5 unique(c4,c5)):

create table child(
   c1 number(2) constraint child_c1_pk primary key,
   c2 number(3) constraint chile_c2_fk
               references parent(c1));
             references parent(c1));
===========================================================================
数据库中的主要对象
1) 表Table
      表是数据库存储的基本单元,在关系型数据库中,表是一个二维结构 ,由行(Row)和列(Record)组成
2) 视图 View
      视图也被称为虚表(虚拟的表),视图对应亍一条 Select 语句,这条查询语句得到的结果集
      被赋予一个名字 , 即视图的名字 , 此后可以像操作表一样操作这个视图。
      使用视图的主要目的是简化复杂查询。
3) 索引Index
      索引是用来在数据库中加速表查询的数据库对象 , 通过快速路径访问方式快速定位数
      据,可有效较少磁盘 I/O 操作 , 提高访问性能。
4) 序列Sequence
      序列(Sequence)是一种用来生成唯一数字值的数据库对象。序列的值由Oracle程序按
      递增或递减顺序自动生成,通常用来自劢生成表的主键值 , 是一种高效率获得唯一键值的途径。

 

视图的作用
1.简化查询
2.确保安全,限制用户查看的数据,定义view ,grant view给用户,而不是table

视图分类
简单view select from 一张表,没有运算
复杂view

1) 视图的使用和表相同
2) 视图的好处:简化查询 ;隐藏数据表的列
3) 视图不包含任何数据。是基表数据的投影
 

sequence
序列号,产生唯一值
s1.nextval 返回一个新的唯一值
s1.currval 返回一个当前session的取值是多少,必须先执行s1.nextval,s1.currval才能返回值
drop sequence squencename

序列的特性:产生连续的不同的数字值用来作为数据表的主键。
  序列是数据库中的独立对象
  表可以用序列产生的值作为主键 , 也可以不用
  序列可以为一个或多个表产生主键 , 也可以不用
  建议:一个序列为一个表产生主键
  序列这种对象在 Oracle、db2 等数据库中有 , 在 mys ql、sql server 中没有。

如:
     -- 产生从 1 开始的数字值 , 步迚是 1
SQL> create sequence myseq_ning ;
     -- 查看序列产生的值
SQL> select myseq_ning.nextval from dual ;
     -- 使用序列产生的值作为表的主键值
SQL> insert into student_ning7(id,name)
      values(myseq_ning.nextval , 'amy') ;
SQL> select * from sutdent_ning7 ;
     -- 显示结果为 2 amy
     -- 注意: 每调用一次 myseq_ning.nextval 就会获得 1 个递

 

索引
index
记录存储在数据块(data block)中,data block是I/O的基本单位
HWM hign water mark ,高水位线,曾经插入过记录的最大数据块的位置
FTS full table scan,全表扫描,把HWM以下的所有data block全部读一遍

index :用来提高查询效率的机制
     全表扫描方式( Full Table Scan ):查询效率极低
     索引查询:比全表扫描快
     索引的结构:数据+地址( 如:张三+Room203 )
     注意:对于数据变更频繁(DML操作频繁)的表 , 索引会影响查询性能
     自动创建索引:
     如果数据表有 PK/Unique 两种约束 , 索引自劢创建 , 除此以外 , 索引必须手劢创建
     自定义索引语法:
     create index 索引名 on 表名(列名) ;


================================================
函数
create or replace function f_avgsal
(p_deptno number)
return number
is
 v_avgsal employee.salary%type;
begin
 select round(avg(salary)) into v_avasal
 from employee
 where deptno=p_deptno;
 return v_avgsal;
end;
/
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值