oracle数据库初研究

来源:互联网 发布:公司电脑网络部署方案 编辑:程序博客网 时间:2024/04/28 22:21

●基本介绍
·体系结构
  Oracle 服务器由两大部分组成, Oracle 数据库 和 Oracle 实例。
  Oracle 数据库: 位于硬盘上实际存放数据的文件, 这些文件组织在一起, 成为一个逻辑整体, 即为 Oracle 数据库.
         因此在 Oracle 看来, “数据库” 是指硬盘上文件的逻辑集合, 必须要与内存里实例合作, 才能对外提供数据管理服务。
  Oracle 实例: 位于物理内存里的数据结构. 它由一个共享的内存池和多个后台进程所组成, 共享的内存池可以被所有进程访问.
         用户如果要存取数据库(也就是硬盘上的文件) 里的数据, 必须通过实例才能实现, 不能直接读取硬盘上的文件。
  当用户建立会话提交后,首先存入实例的PGA区域,然后统一提交到SGA区域,由SGA于数据库进行交互
·集群BAC
  一个数据库可以对应多个实例,即多个实例都可以操作数据库。
  集群的好处是
  1.高可靠性 HA(high avaiablity)
  2.负载均衡 Load Balance
·database的基本概念
  1.表空间  物理概念
  2.数据文件 逻辑概念 多个数据文件属于一个表空间
  3.段、区、块:从逻辑角度将技术局库的划分

·DBA时间开销:安装6、配置12、存档6、维护6、管理55.

·linux安装oracle
  内存1G  SWAP1.5G /TMP400MB  见文档

·服务 oracleservlce服务改手动 否则占内存

·客户机:
  优点:性能高
  安装:PPT
·sql和sqlplus、isqlplus
  sql是语言
  sqlplus是oralcle提供的环境
  isqlplus也是环境,web的,是http协议的工具,明文的,非常不安全。
●基本操作和概念
·显示有哪些表和视图
  select * from tab;
·查看表结构
  desc emp;
·保存操作记录
  spool c:\1.txt
  spool off
·设置行宽
  set linesize 120
·设置列宽
  col sal for 9999
·设置每页显示记录数
  set pagesize 20
·去掉“已选择14行”回馈信息
  set feedback off
·show user;
  查询用户
·C命令修改错误语句
  加入错误在第二行
  输入 2 回车
  c /form/from
  即可将输入错误的的from修改
·ed修改
  输入ed即可弹出文本
  然后保存退出后输入/即可执行sql
·对上一条语句追加命令 a命令
  注意a后是两个空格
  a  order by sal;
·注释
  /* */ 和 --
·连接符 || 用来合成列
  select ename||'的工资是’||sal from emp;
  显示的记录格式为   XXX的工资是xxx
·dual表
  oracle表提供的伪表,只是用来做测试
  select 3+2 from dual;
  select ysydate from dual;
·日期和字符串只能在单引号中出现,每行显示一次
·登录方式
  sqlplus / as sysdba 主机认证模式
  sqlplus scott/tiger
·切换用户
  conn scott/tiger;
·账户解锁
  alter user scott account unlock;
·修改密码
  alter user scott identified by xxxxx;
·查询系统配置 格式
  select * from v$nls_parameters;
·打开sql执行开关
  set timing up
●基本select语句
·显示有哪些表和视图
  select * from tab;
·查询员工表的所有信息
  select * from emp;
·查询指定列
  效率比*好 因为解析*要耗费资源,但是在oracle9i之后两者一样
  select empno,ename,job,mgr from emp;
·列的算术及别名 支持数据运算
  select sal*12 年薪 from emp;
·列的别名
  三种    1字段 别名     2字段 as "别名"    3字段 "别名"
  带引号和不带引号的区别 带引号引号中的别名可以加空格
·滤空sql中的空值问题(为什么奖金为0 年薪也不显示)
  select sal*12+comm 年薪 from emp;
  1.如果表达式中有空值则整个表达式也为空
    解决:使用滤空函数 nvl和nvl2 即可将空变成0
    select sal*12+nvl(comm,0) 年薪 from emp;
  2.null!=null 例如查询奖金等于空的员工
    select * from emp where comm=null;查不出结果
    select * from emp where comm is null;即可查出
·查询中的重复行处理
  默认有重复记录,使用distinct去掉
  select distinct deptno job from emp;
  distinct作用多列只有所有的列全部相同才是重复记录。
●过滤和排序
·where and or
  1.查询10号部门的员工信息
    select 8 from emp where deptno=10
  2.查询10号部门并且工资大于2000
    select * from emp where deptno=10 and sal>2000
  3.查询10号和20号部门信息
    select * from emp where deptno=10 or deptno=20
·关于时间日期的查询
  1.查询入职日期为17-12月-80的员工信息
    select * from emp where hiredate='17-12月-80'
    '17-12月-80'符合系统默认的日期格式,可以查出。
  2.查询系统默认日期格式
    查询系统时间 select sysdate from dual;
    查询系统配置 select * from v$nls_parameters;
    默认是DD-MON-RR
    修改会话的系统时间格式alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
    修改系统的系统时间格式alter global set NLS_DATE_FORMAT='yyyy-mm-dd';
·比较运算符号和逻辑运算符号
  1.= > < ...注意是=不是==
  2.between and  包含边界 注意小值在前打值在后
  3.in  和 not in
  4.like 模糊查询 占位符百分号代表一位或多位 占位符下划线代表一位
    当模糊查询中需要查询下划线和百分号时需要用\转译(\_)然后声明 escape '\'
  5.is null  is not null
  6.优先级 符合数学算术优先级
  查询工资位于1000到2000之间的员工
    select * from emp where sal >=1000 and sal<=2000
    select * from emp where sal between 1000 and 2000
  也可以作用于日期
    select * from emp where hiredate between '20-2月 -81'and '09-9月 -81'
  查询部门号为10 20的员工信息
    select * from emp where deptno=10 or deptno=28;
    select * from emp where deptno in(10,20);
    select * from emp where deptno not in(10,20);
  查询名字以S开头的员工信息
    select * from emp where ename like 's%';
  查询名字长度为4的员工信息
    select * from emp where ename like '____';
  查询名字中含有下划线的员工
    select * from emp where ename like '%\_%' escape '\';
·order by 默认升序 asc升 和 desc降
  1.order by 后面能跟 列名 别名(表达式) 列的序号
    select * from emp order by comm desc;
    select ename,sal,sal*12 年薪 order by 2 desc;
  2.将null排到最后 降序默认null排到最前面
    select * from emp order by comm desc nulls last;
  3.order by 作用于多列时 先按照第一列排如果第一列相同则按照第二列排以此类推
  4.order by 作用于多列降序时 需要在每列加desc
    select * from emp order by deptno desc ,sal desc
●单行函数
·简介、分类 ppt
  单行函数:
  函数并不起过滤作用,而是将返回的结果进行运算后打印。所以单行函数不影响查询出的记录数。
  操作数据对象
  接受参数返回一个结果
  只对一行进行变换
  每行返回一个结果
  可以转换数据类型
  可以嵌套
  参数可以是一列或一个值 参数为一个列名时 会对查询出来的每条记录的该列进行函数运算然后显示的是运算结果

·字符函数
  lower小写
  upper大写
  initcap每个单词首字母大写
    select lower('HelLo WorLD!'), upper('HelLo WorLD!'), initcap('HelLo worLD!')  from dual;
  concat字符拼加
    select concat('hello',' world!') from dual;
  substr截取子串 从第二个参数开始截取到三个参数
    select substr('Hello World',2) from dual;
    select substr('Hello World',2,3) from dual;
  length/lengthb  求字符数/字节数(英文字母来说两者相等,中文字符数是字节数的两倍)
    select length('中国') 字符数, lengthb('中国') from dual;
  instr 在母串中查找子串返回的是从1开始的位置
    select instr('Hello World!','llo') from dual;
  lpad/rpad 左右填充 将abcd用*填充到10位
    select lpad('abcd',10,'*') 左填充, rpad('abcd',10,'*') 右填充 from dual;
  trim 去掉首位某字符
    select trim('a' from 'abcda') from dual;
  replace 替换某字符 将l替换为*
    select replace('Hello World!','l','*') from dual;
·数字函数
  round 四舍五入
  trunc截断
  mod 求余
    select round(45.926,2) 四舍五入, trunc(45.926,2) 截断, mod(1600,300) 求于 from dual;
·日期函数
  to_char修改日期格式
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
  日期的加减(日期与日期只能相减 不能相加)
    select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual;
  months_between 两个日期相差的月数
    select (sysdate-hiredate)/30 方式一, months_between(sysdate,hiredate) 方式二 from emp;
  add_months 向指定日期加若干月
    select add_months(sysdate,1) 一个月后, add_months(sysdate,467) 若干个月后 from dual;
  next_day 指定下一个星期几的日期
    select next_day(sysdate,'星期三') from dual;
  last_day 本月最后一天
    select last_day(sysdate) from dual;
  trunc 时间截断
  round 时间四舍五入
    select round(sysdate,'MONTH'), round(sysdate,'YEAR') from dual;
·转换函数(日期 数字)
  1.隐性
    如果做隐式转换,那么字符串必须是符合转换条件(日期格式)的。
    number通过to_char转换成char char通过to_number转换成number
    date通过to_char转换成char char通过to_date转换成date
  2.显性 性能高
    to_date将字符串转换为日期
      select to_date('1988-01-01','yyyy-mm-dd') from dual;
    to_char将日期转换为格式的字符串
      select to_char(sysdate,'yyyy-mm-dd') from dual;
  3.日期的格式
    YYYY 数字的年如2011
    YEAR 英文的年如twenty eleven
    select to_char(sysdate,'year-mm-dd') from dual; 显示为twenty eleven-07-15
    MM 数字的月
    MONTH 英文的月
    DY 星期的全称
    DAY 星期的全称
    select to_char(sysdate,'day') from dual; 显示为星期五
    DD 该月第几日
  4.时间格式
    HH24:MI:SS AM
    输出为 15:45:32 PM
    在日期中可以使用双引号加字符串
    DD "OF" MONTH
    输出为12 OF OCTOBER
  5.to_char可以对数字进行格式化
    select ename, to_char(sal,'L9,999.99') from emp; 显示为ALLEN               ¥1,600.00        
·通用函数 转换空值 等
  NVL 将空值返回为指定的值
  NVL2 表达式不为空返回参数2 为空返回参数3
    select ename, sal*12+nvl(comm,0), sal*12+nvl2(comm,comm,0) from emp;
  NULLIF 比较两个表达式相等就返回NULL 不相等就返回1
    select nullif('abc','abc'), nullif('abc','abcd') from dual;
  COALESCE 返回若干表达式中第一个不为空的值
    select ename, coalesce(comm,sal) from emp;
·条件表达式(if else)
  1.CASE表达式
    CASE 表达式(字段) WHEN 条件1 THEN 返回值1 WHEN 条件2 THEN 返回值2 。。。 ELSE 返回值 END
    select ename,job,sal 涨前工资, case job when 'PRESIDENT' then sal+1000
                                            when 'MANAGER'   then sal+800
                                            else sal+600
                                   end 涨后工资
    from emp;
  2.DECODE函数 
    decode(表达式,'条件1',结果1 ,'条件2','结果2')
    select ename,job,sal 涨前工资, decode(job,'PRESIDENT',sal+1000,
                                              'MANAGER',  sal+800,
                                                          sal+600) 涨后工资
    from emp;
  3.PLSQL
   后面讲

●组函数
·简介、理解
  分组函数作用于一组数据,并对一组数据返回一个值(一条记录)。
  当使用group by分组后 有几组就显示几个值(几条记录)。所以分组函数会对记录数造成影响。
·count 计算该组该字段记录数的个数
  select count(*) 员工人数 from emp;
·max min avg 计算该组该字段的最大值 最小值 平均值
  select max(sal) 最高工资, min(sal) 最低工资, avg(sal) 平均工资 from emp;
·sum 计算该组该字段的总和
  select sum(sal) from emp;

·特别注意:组函数的空值问题
  组函数会自动滤空 也就是说按某字段算记录数时会滤调该字段为空的记录
  可以在内部套一层nvl函数解决该问题
·分组数据
  1.group by
    使用group by子句可以对记录依据特定的字段(一个或多个)进行分组,
     分组后的记录数为该字段不同值的个数。所以分组会对记录数造成影响。
      select deptno,avg(sal) from emp group by deptno;
    在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中。
      select deptno,job,avg(sal) from emp group by deptno,job
    使用group by子句按照多列分组时,分组的组数为这几列组合后不重复值的个数。
  2.having对分组的结果再进行过滤
    having子句可以通过限制分组后的一个或多个字段而对分组的结果进行过滤
    select deptno,avg(sal)
     from emp group by deptno having avg(sal)>2500
  3.不能在 WHERE 子句中使用组函数(注意)。
    可以在 HAVING 子句中使用组函数。
·group by增强(做报表)
  group by增强类型是oracle特有的子查询
  group by的增强:
  group by rollup(a,b) == group by a,b + group by a + group by null
    select deptno,job,sum(sal)
    from emp
    group by rollup(deptno,job);

DEPTNO JOB         SUM(SAL)                                                                                        
---------- --------- ----------                                                                                        
        10 CLERK           1300                                                                                        
        10 MANAGER         2450                                                                                        
        10 PRESIDENT       5000                                                                                        
        10                 8750                                                                                        
        20 CLERK           1900                                                                                        
        20 ANALYST         6000                                                                                        
        20 MANAGER         2975                                                                                        
        20                10875                                                                                        
        30 CLERK            950                                                                                        
        30 MANAGER         2850                                                                                        
        30 SALESMAN        5600                                                                                        

    DEPTNO JOB         SUM(SAL)                                                                                        
---------- --------- ----------                                                                                        
        30                 9400                                                                                        
                          29025                                                                                        

已选择13行。


●多表查询
·理解:
  多表查询就是从多个表组成的笛卡尔积中首先过滤掉错误的数据再查询出有用的数据
  使用where子句可以限制在 同一条 记录中各字段满足某些关系的字段是正确的字段从而过滤掉错误的字段
·使用等值连接消除笛卡尔积
  select e.ename 姓名, e.sal 薪水, d.dname 部门名称
  from emp e, dept d
  where e.deptno=d.deptno;
·使用不等值连接消除笛卡尔积 如查询出员工的工资级别
  select e.ename 姓名,e.sal 薪水,s.grade 级别
    from emp e,salgrade s
    where e.sal>=s.losal and e.sal<=s.hisal
  select e.ename 姓名,e.sal 薪水,s.grade 级别
    from emp e,salgrade s
    where e.sal between s.losal and s.hisal;
  select d.deptno 部门号,d.dname 部门名称, count(e.empno) 人数
    from dept d,emp e
    where d.deptno=e.deptno
    group by d.deptno,d.dname;
·使用外连接消除笛卡尔积
  外连接:当where条件不成立时,任然希望结果中包含某些记录
  左外连接:希望等号左边的显示,写法:where d.deptno=e.deptno(+)
   select d.deptno 部门号,d.dname 部门名称, count(e.empno) 人数
    from dept d,emp e
    where d.deptno=e.deptno(+)
    group by d.deptno,d.dname;
  右外连接: 希望等号右边的显示, 写法:where d.deptno(+)=e.deptno
·自连接  给同一个表起别名看成两张表进行查询
  查询员工和员工的老板的信息,按照格式显示: ***的老板是***
   select e.ename||'的老板是'||b.ename
     from emp e, emp b
     where e.mgr=b.empno;
  自连接是否存在性能问题?
  自连接的笛卡尔积数为字段数的平方  所以当字段数过多时会有性能问题
  解决:层次查询,伪列level,是同一张表的前后两条记录做连接操作,
        首先找level为1的所有记录,然后以该记录为条件找level为2的所有记录依次类推
        oracle内部对这种查询做了性能优化 所以不影响性能。
        start with 以哪条记录作为level为1的开始查询点
        connect by 规定条件条件 即以前一条记录的什么字段匹配后(或者其他关系)
                   一条记录的什么字段作为寻找下一个level的条件
  select level,empno,ename,mgr
     from emp
     connect by prior empno=mgr
     start with empno=7839
     order by level;
●子查询
·理解
  子查询:在一个查询内部包含另一个查询,就是select的嵌套
  子查询 (内查询) 在主查询之前一次执行完成。子查询的结果被主查询使用 (外查询)。
  子查询和主查询可以不是一张表,只要子查询的结果,主查询可以使用即可
·使用场景
1.select后面跟子查询
  select (select dname from dept where deptno=10), ename from emp;
2.from后面
  select * from (select empno,ename,sal from emp where sal>2000) d;
 
·注意事项
1.将子查询放入括号中
2.采用缩进,子查询往右放
3.可以在select where from having后面放子查询  多个where均可以用
4.不可用在group by 后面不能跟子查询
5.子查询和主查询可以不是同一张表,只要子查询的结果主查询可以使用即可。
6.一般在子查询中不使用order by 因为没有意义但是在top-n分析中必须使用order by
7.from后面使用子查询,通常是将子查询的结果视为一张表

·非法使用子查询
SQL> select (select dname from dept), ename
  2  from emp;
select (select dname from dept), ename
        *
第 1 行出现错误:
ORA-01427: 单行子查询返回多个行
·子查询中的空值问题
  理解  子查询类似表达式:如果子查询中含有null,则整个子查询为null
  select *
  2  from emp
  3  where empno not in (select mgr from emp);
  未选定行
  解决 子查询中使用where过滤
  select *
  2  from emp
  3  where empno not in (select mgr
  4                      from emp
  5*                     where mgr is not null)
·多行子查询
·any (子查询)
  理解 和子查询中的任意一个值比较 随便一个满足就满足
  select *
  2  from emp
  3  where sal < any (select sal from emp where deptno=10);
·all(子查询)
  理解 和子查询中的所有值比较 必须全部满足才行
  select *
  2  from emp
  3  where sal < all (select sal from emp where deptno=10);
·行号 rownum 伪列
  每个表都有
  一旦生成就不变
  只能使用<=不能使用>=
  select rownum,ename,sal from emp;
  分页待补全------------------------
●集合运算(结果集合)
·注意事项
  1.参与运算的各个集合必须列数相同且列数一致
  SQL> select deptno,job,sum(sal) from emp group by deptno,job
  2  union
  3  select deptno,sum(sal) from emp group by deptno
  4  union
  5  select sum(sal) from emp;
  select deptno,sum(sal) from emp group by deptno
  *
  第 3 行出现错误:
  ORA-01789: 查询块具有不正确的结果列数
  2.最后的表头采用第一个select的表头
  3.尽量别用 大表非常影响性能
  4.如果要排序 必须在每个查询后加order by
  5.可以使用括号改变集合执行顺序
·并集
  UNION 重复部分取1次
  select * from emp where deptno=10
  2  union
  3  select * from emp where deptno=20;
  UNION ALL重复部分取2次
·交集 intersect
  返回同时属于两个集合的记录
  select * from emp where sal between 1000 and 2000
  2  intersect
  3  select * from emp where sal between 1500 and 2500;
·差集minus
  返回数以第一个集合但不属于第二个集合的记录
  ({aaaaaa}[xxxxx)bbbbbb]
  小括号为a 中括号为b minus返回为{aaaaa}
  select * from emp where sal between 1000 and 2000
  2  minus
  3  select * from emp where sal between 1500 and 2500;

●处理数据
  DML:Data Manipulation Languate 数据操作语言: 包括增删改查
  DDL:Data Defination Languate 数据定义语言:建表建视图
  DCL:Data Control Languate 数据控制语言:提交 回滚
·insert语句
  1.显示插入 直接插入
    insert into emp(empno,ename,job,hiredate,sal,comm,deptno) values(1234,'Tom','IT',sysdate,1000,100,10);
  2.如果值涵盖了所有列,列名可以省略
    insert into emp  values(1234,'Tom','IT',sysdate,1000,100,10);
  3.空值插入
    insert into emp(empno,ename,job) values(1255,'bbb',null);显式插入
    insert into emp(empno,ename) values(1244,'aaa');隐式插入
  4.地址符的使用
    执行完语句后命令行会等待用户输入值 然后付给变量 执行插入
    insert into emp(empno,ename) values(&empno,'&ename');
    输入 empno 的值:  1111
    输入 ename 的值:  abc
    原值    1: insert into emp(empno,ename) values(&empno,'&ename')
    新值    1: insert into emp(empno,ename) values(1111,'abc')
  5.insert中的子查询用来从其他表拷贝数据
    不必书写 VALUES 子句。
    子查询中的值列表应与 INSERT 子句中的列名对应
    INSERT INTO sales_reps(id, name, salary, commission_pct)
    SELECT employee_id, last_name, salary, commission_pct
    FROM   employees
    WHERE  job_id LIKE '%REP%';
·更新
  1.语法格式
   update emp set sal=sal+100
   where deptno=10;
  2.一次更新多条数据
   update emp set sal=sal+100
   where deptno=10;
  3.省去where全更新
   update emp set sal=sal+100
  4.update的子查询
   UPDATE   employees
   SET      job_id  = (SELECT  job_id
                    FROM    employees
                    WHERE   employee_id = 205),
   salary  = (SELECT  salary
                    FROM    employees
                    WHERE   employee_id = 205)
   WHERE    employee_id    =  114;
  5.关于更新时的约束
   外键能否为null?
   1. 当该列上没有指定not null约束,可以为null
   2. 当该列上指定not null约束,该列的值必须为父表中的某个主键
  update emp set deptno=77 where deptno=10;
  update emp set deptno=77 where deptno=10
  *
  第 1 行出现错误:
  ORA-02291: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 未找到父项关键字

·删除
  delete from emp where deptno=10;
  和trucate比较
  1. delete一条条删除;trucate摧毁表,再重建;
  2. delete可以rollback; truncate不可以
  3. delete可能产生碎片;truncate不会
  4. delete不会释放空间;truncate释放空间 
  truncate table TESTDELETE;
·oracle中的事物 oracle默认开启事物
  1.起始标志DML
  2.结束标志 a.显示提交 commit
               隐式提交 DDL DCL
             b.显示回滚 rollback
               隐式回滚 掉电 宕机
  3.保存点的概念
  就是存个档 回滚时回滚到这
 
  SQL> savepoint a;

  保存点已创建。

●使用DDL创建表管理表
·命名规则
  必须以字母开头
  必须在 1–30 个字符之间
  必须只能包含 A–Z, a–z, 0–9, _, $, 和 #
  必须不能和用户定义的其他对象重名
  必须不能是Oracle 的保留字
  Oracle默认存储是都存为大写
  数据库名只能是1~8位,datalink可以是128位,和其他一些特殊字符

·创建表的前提
  必须具备:
    CREATE TABLE权限
      存储空间
    必须指定:
      表名
      列名, 数据类型, 数据类型的大小
·查询其他用户的表
  SELECT *
  FROM userB.employees
·default值
  执行insert操作时,可以为其指定默认值
  值、表达式和SQL语句都可以作为默认值
  其他的列名或者是伪列都是非法的
  默认值的类型必须和该列的类型一致

·创建表
  CREATE TABLE hire_dates        (id          NUMBER(8),
  hire_date DATE DEFAULT SYSDATE);
·数据类型

·子查询创建表
  CREATE TABLE  dept80
  AS SELECT  employee_id, last_name,
            salary*12 ANNSAL,
            hire_date     FROM    employees     WHERE   department_id = 80;
·修改表
   1.加一列
    alter table emp20 add img blob;
   2.修改列
    alter table emp20 modify ename varchar(20);
   3.重命名列
    alter table emp20 rename column sal to salary;
·删除表
    删除了数据和结构,相关事务被提交,相关索引被删除,不能回滚,可以闪回。
    drop table emp20;
    回收站的使用
    show recyclebin;
    --清空回收站
    purge recyclebin;
·改变表名
  RENAME dept TO detail_dept;

·清空表
  TRUNCATE TABLE detail_dept;

·约束
  约束是表一级的限制
  如果存在依赖关系,约束可以防止错误的删除数据
  约束的类型:
  NOT NULL
  UNIQUE
  PRIMARY KEY
  FOREIGN KEY
  CHECK
 
  用户可以自定义约束,也可以使用Oracle Server的sys_cn格式命名约束
  约束创建的时机:
  创建表的时候,同时创建约束
  表结构创建完成后
  约束可以定义在列一级,或者是表一级
  通过数据字典查看约束

 create table person
  2  ( pid varchar(20) constraint personPK primary key,
  3    name varchar(10) constraint personName not null,
  4    age  number      constraint personAge check(age>0),
  5    gender varchar(4) constraint personGender check(gender in('男','女')),
  6    email varchar(40) constraint personEmail unique,
  7    deptno number     constraint fk references dept(deptno));
 

●其他数据库对象
·视图
  1.优点
  限制数据访问
  简化复杂查询
  提供数据的相互独立
  同样的数据,可以有不同的显示方式
但视图不能提高性能
  2.概念
  视图是一种虚表.
  视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
  向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.
  视图向用户提供基表数据的另一种表现形式
  3.授权

  4.创建
  CREATE VIEW  empvu80
   AS SELECT  employee_id, last_name, salary
    FROM    employees
    WHERE   department_id = 80;

  5.修改
  CREATE OR REPLACE VIEW empvu80
  (id_number, name, sal, department_id)
  AS SELECT  employee_id, first_name || ' ' || last_name,
  FROM    employees
  WHERE   department_id = 80;

  6.视图使用dml的规则  和屏蔽DML操作
    可以在简单视图中执行 DML 操作 但是最好别这么干
    可以使用 WITH READ ONLY 选项屏蔽对视图的DML 操作
  7.删除视图
    drop view viewname;
·序列
  1.什么是序列
  序列: 可供多个用户用来产生唯一数值的数据库对象
  自动提供唯一的数值
  共享对象
  主要用于提供主键值
  将序列值装入内存可以提高访问效率

  2.创建序列
   参数
   CREATE SEQUENCE sequence
       [INCREMENT BY n]
       [START WITH n]
       [{MAXVALUE n | NOMAXVALUE}]
       [{MINVALUE n | NOMINVALUE}]
       [{CYCLE | NOCYCLE}]
       [{CACHE n | NOCACHE}];
   全是用默认
   create sequence myseq;
  3.使用序列
  create table testseq
     (tid number primary key,
      tname varchar(20));
  4.修改序列注意事项
  必须是序列的拥有者或对序列有 ALTER 权限
  只有将来的序列值会被改变
  改变序列的初始值只能通过删除序列之后重建序列的方法实现


  5.删除序列
  DROP SEQUENCE dept_deptid_seq;

·索引
  1.什么是索引 有什么用

  2.创建索引

  3.删除索引

·同义词
  1.什么是同义词

  2.创建同义词
 
  3.使用同义词

 
●plsql 
  set serveroutput on 将结果打印在屏幕
  dbms_out.put_line('这里的信息会显示到屏幕' || ' 这里的信息也会显示到屏幕')
·环境
  sqldeveloper
·概念

·比较
  sql的优点ppt5
  plsql的优点 ppt5
·整体程序结构
  ppt6
·plsql特有的数据类型
  引用型变量
    my_name  emp.ename%type  my_name的类型和emp表的ename的类型一样
  记录型变量
    emp_rec  emp%rwotype  emp_rec的类型和emp表的一条记录的各字段类型分别相同 就是一个类型组

·if语句


·cursor光标 (其实就是结果集)
  定义语法 定义完没有值
 
 
  打开光标 相当于执行定义语法 光标就有值了

  关闭光标
  不关闭会出 Too manay cursor is opended;(oracle能打开12个)
  

  
  带参光标
  根据部门号查询员工信息
 

·例外
1.概念

2.常用例外

3.例子

4.自定义例外
  定义

  使用

  处理
·赋值语句