Angelo Lee's Blog
This is my kingdom .If i don't fight for it ,who will ?
 

第一讲

1、  Oracle默认为安装在最大的剩余磁盘空间

2、  Oracle_base

Oracle_home

都写入注册表

 

3、  Oracle卸载

1、  先停止服务,再卸载

2、  到注册表中删除:找到 Ora开头的项进行删除

3、  重启动

4、  把磁盘上的目录和文件删除

服务器的启动项

1、  OracleServiceSiD 只有这个服务启动了,Oracle才能用(开发时手工启动,不用时停下不占用内存)

2、  OracleListerner 只有这个服务启动了,客户端才能和服务器连接上

3、  Oraclesqlplus只有这个服务启动了,才能通过WEB 页,管理Oracle

4、  OracleDBCONsoleorcl

5、  OracleDBconsoleorcl

isqlpluslisterner同时开启时才能开始localhost:5560

控制台 C……/franktyd> sqlplus/nolog

Sql> connect Scott/tiger@orcl

           用户/密码@连接标志符

labs放在D:/oracle/product/10.2.0/db_1

连接 http://10.3.162.9:5560/isqlplus 启动sqlplus  使用它测试SQL 语句和管理

连接 http://10.3.162.9:5500/em  管理员身份登陆,企业管理

外置帐户: student  student  orcl

内置帐户:SYS: 系统管理员帐号  管理所有的数据字典  缺省的密码:chang_on_ install   切忌密码

          SYStem: 系统管理员帐号  系统管理者  缺省的密码:manager

         SYSman: 系统管理员帐号  资料库管理,几个库并发运行时,监控管理几个库    缺省的密码:oem_temp

Oracle 20多个系统内置帐户,用途查用手册

ExcelwordACCEL的表都用Oracle数据库管理

实体关系图:一句话话中关键的名词有可能是表

  11

  1对多

  多对多     多对多可转化为111对多

Sybase.PowerDesiner.v12.0:实体关系图设计工具:然后用实体关系图连接数据库

  Name: 汉字  

  Code: 不用汉字

  #:主键

  *:非空

SQL————————à 数据库————————〉数据库表

                      硬分析:语法

                              语义

                              字典查询

                              权限查询

                     软分析:分析计划

SQLDMLMerge合并语句

labs放在D:/oracle/product/10.2.0/db_1   Oraclehome的路径

                 /产品编号/版本/实例

用控制台方式启动sqlplus/nolog(稳定)  IE 启动isqlplus(不稳定,开发时可用)

SQLconnect sys/teacher@orcl as sysdba     sysdba有安装,卸载、开启、关闭和管理数据库的功能,级别很高

       用户/密码  @连接标志符  ..身份 数据库管理员

能够安装和进入就是管理员

SQLconnect @orcl as sysdba  以本地操作系统身份进入数据库,这种方式只限制本地服务器,远程则不可以

SQLshow  user

  User is “sys”

sQL> @%oracle_home%/labs/student.stl

执行 环境变量   文件夹  文件名

A用户------------------A模式

B用户------------------B模式   一个用户是一个模式    

模式:表

      视图

     

      过程

      序列

      同义词

      索引

A用户想看B用户的东西  只用B用户或者SDB给他做了授权才可以

数据结构存在数据字典里  数据则存在表里

Desc  tables  查看字典里的信息,即查看表的结构

变程好的风格:

Select --------

From--------

Where-----   (返回truefalse)从表的每一条记录都和主表的记录作对比,当为ture时显示出来

Order by--------    desc

给每一列改名不影响表,只影响这一次显示

Isqlplussqlplus先连接数据库

Isqlplus中保存脚本、加载脚本、取消操作

SQLedit

SQLsave  d:../test04.sql 

1SQLget  d:../test04.sql        2SQL@d:/     加载的两种方法

   SQLrun

Psql: 进入SQLwind   非开源的

SQL语句的规则:

别名是用“”  字符和日期用‘’

优化时要少用<>

Like 模糊查询 ‘S%’ S 开头的多条记录

In(set)在这里为true  不在这里为false

Where job_id  like ‘_/_%’  escape ‘/’   ‘/’可以拿任意的字符来转义

            通配符/下划线符号

Salary>1000 or hire_date<388 and  employees_name=’s% ’   and 连接的先执行 or连接的两端后执行

多表查询时

1、  笛卡尔乘积 Aa,b,c

               B: x,y       不设定条件或者没有正常查询条件时产生笛卡尔乘积 

         a  x

         a  y

         b  x

         b  y

         c  x

         c  y

2、  多表时 表名.列名

等值连接:主键与外键一一对应(不对应的筛掉)

用别名作前缀改善表的SQL 查询语句的长短

3、  非等值连接

左表都信息  右表没有值用空行不齐    where  a. employees_id=b. employees_id(+)   左外连接  左外连接+号放在=号的右边

    在查询所有员工的所有信息,使用外连接可以查到新员工和临时工的信息、

4自连接

   有时你需要连接一个表到它自己。为了找到每个雇员的经理的名字,你需要连接 EMPLOYEES 表到它自己,或执行一个自连接。

   SELECT worker.last_name || ' works for ' || manager.last_name

   FROM   employees worker, employees manager

   WHERE  worker.manager_id = manager.employee_id

4、  环境变量的使用

define empno=124  (定义变量到环境变量)

define (查看定义好的环境变量)

 

select last_name,salary   (交互式的通过环境变量查找信息)

from employees

where employee_id=&empno

 

      undefine empno  (删除环境变量)

 define         (查看结果)

 

6set echo on   set echo off    表示打开或者关闭查询的显示

   show echo    显示脚本状态

   set echo on,则显示出文件中的每条命令和该命令执行的结果,如果设为set echo off,则只显示命令执行的结果,而不显示出命令本身。

   set   feedback   on/off     是否现实     *   rows   selected  

   pagesize         页面大小设置

   set heading on/off   表示打开或者关闭标题

 

 COLUMN命令: 这个命令主要用途,是规范查询的结果的输出格式。输出格式包括了数字也可以指定显示的宽度。COLUMN设置后,一直保持有效。除非,你重新使用COLUMN设置该列或者用COLUMN <column name> CLEAR

   col salary format $99,999,00 

col salary format L99,999,00

col salary  clear  清除此列的格式

 

ttitle 'work salary report2008'  设置表头标题

btitle 'author: frank river'      设置尾标题

tti :显示ttitle的状态

tti off/on    开启和关闭表头

 

6、  控制台命令

    sqlplus/nolog

    connet student/student  本地连接不用标示符

/ run  执行SQL命令

List  查看最近一次执行的SQL语句

Edit(ed) 回车后,启动记事本,afiedt.buf 缓存文件,在内容中不能有;  ;符号表示结束   /表示语句结束位

Save  d:/aa.sql  保存  路径/文件名

Get  d:/aa.sql   加载  路径/文件名

 Run或者/

 

Save  d:/bb.sql  保存  路径/文件名

@ d:/bb.sql 把文件加载到内存中,自动执行,一些常见的命令写入脚本来执行

   

    spool  spool 文件名   把这之后的各种操作及执行结果假脱机即存盘到磁盘文件上,默认文件扩展名为.lst
spool
      显示当前的假脱机状态

spool off    停止输出         spool 是跟踪的命令,全部的命令都记录在spool 的转化的文本文件中  

 

SQL> show all --查看所有68个系统变量值

SQL> show user --显示当前连接用户

SQL> show error --显示错误

7、  isqlplus 在连接数据库时,需要监听服务,这些监听服务经常会丢失监听,但是此工具可视化

sqlplus 直接连接到数据库,不需要监听服务,所以比较稳定,建议使用此开发工具

pl/plus 不是开源的软件,在学习的时候可以用,开发时没有购买不要用

8、  net 服务管理:tcp/ip

              主机名:(一般时候要使用主机名,不要用ip,因为一个主机对应多个ip

然后重启动,监听服务和ISQLPLUS,刷新就行,再使用ISQLPLUS

Tnsnames.ora

Listener.ora    这两个文件在oracle.home文件里找进行配置

Windosxp 不稳定,测试环境用windows2003

几个有用的网站名

Metaliak.oracle.com     企业支持帐号(去找oracle补丁  bug

国内咨询网站:www.it_pub.net (技术网站支持和电子书籍)

www.csdn.net(中国人网站)

9、  自连接

SELECT worker.last_name || ' works for ' || manager.last_name

FROM   employees worker, employees manager

WHERE  worker.manager_id = manager.employee_id

 

两个表没有条件语句就是笛卡尔乘积

    SELECT e.last_name, e.department_id, d.department_name

FROM   employees e  departments d 

 

CROSS JOIN 交叉连接

SELECT e.last_name, e.department_id, d.department_name

FROM   employees e CROSS JOIN departments d

交叉连接和笛卡尔乘积会得到同样的结果

 

       两个表用 NATURAL  JOIN  连接是自然连接

           SELECT department_id, department_name, location_id, city

           FROM departments NATURAL JOIN locations

           等值连接

           SELECT department_id, department_name, departments.location_id, city

           FROM departments, locations

           WHERE departments.location_id = locations.location_id;

           自然连接和等值连接的结果是一样的

     

对于自然连接的连接条件,基本上是带有相同名字的所有列的等值连接

为了指定任意条件,或者指定要连接的列,可以使用ON 子句    on 相当于where,

       SELECT employee_id, city, department_name

       FROM   employees e

       JOIN   departments d

       ON     d.department_id = e.department_id

       JOIN   locations l

       ON     d.location_id = l.location_id;

 

      SELECT employee_id, city, department_name

      FROM employees, departments, locations

      WHERE employees.department_id = departments.department_id

      AND departments.location_id = locations.location_id;

 

      WHERE 子句的自然连接

      可以用 WHERE 子句实现在一个自然连接中添加约束。下面的例子限制部门号 department ID 等于 20 50 那些输出的行。

      SELECT department_id, department_name, location_id, city

      FROM departments NATURAL JOIN locations

      WHERE department_id IN (20, 50);

  

      SELECT department_id, department_name, l.location_id, city

      FROM departments d,  locations  l

      WHERE d.department_id IN (20, 50) and l.location_id=d.location_id;

 

 

如果一些列有相同的名字,但数据类型不匹配,NATURAL JOIN(名字和类型同)子句能够用USING(名字同类型可以不同) 子句修改以指定将被用于一个等值连接的列

当有多个列匹配时,用USING 子句匹配唯一的列

在引用列不要使用表名或者别名

NATURAL JOIN USING子句是相互排斥的

 

    SELECT e.employee_id, e.last_name, d.location_id

    FROM   employees e JOIN departments d

    USING (department_id) ;

   

    SELECT employee_id, last_name,

    employees.department_id, location_id

    FROM employees, departments

    WHERE employees.department_id = departments.department_id;

 

    左外连接

   SELECT e.last_name, e.department_id, d.department_name

   FROM   employees e  LEFT OUTER JOIN departments d

   ON   (e.department_id = d.department_id) ;

 

   SELECT e.last_name, e.department_id, d.department_name

   FROM employees e, departments d

   WHERE d.department_id (+) = e.department_id;

 

  全外连接:左右表所有记录都显示,没有的补空行

  SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id

  FROM   employees e JOIN departments d

  ON     (e.department_id = d.department_id)  AND  e.manager_id = 149 ;

 

10、              单行函数:一行输入,一行输出

     多行函数:多行输入,一行输出

一个函数的返回结果被另一个函数使用

Dual  表,用于用户测试

Select  subsrt(“helloworld”,1,5) from dual

Trunk

     

11、              alter  session set nls_language=’American ’ 把中文改为英文

alter  session set nls_language=’simplified chinese’  简体中文

alter session set nls_date_format=’YYYY-MM-DD HH24:MI:SS’

 

12、              隐式转换

oracle int--ànumber(包括精度类型,双精度,单精度,整数)   number(5,2)

Varchar-àvarchar2

在给数据库字段赋值时可以用,查询时可以转换用

做开发时不必要在程序里转换和计算,在SQL做更简单

嵌套的层数没有要求

Case decode 函数,都能实现多分枝功能

 

  13   

        select rownum , rowid, last_name

        from employees

        rownumrowid 系统自动生成   rownum显示序列,rowid文件的行块二进制序列值,查询的定位最高,直接找到文件的行块,但是二进制不易使用

        select rownum , rowid, last_name

        from employees

        where rownum=1     rownum=1或者rownum<=数值   但是rownum不等于大于1的数值

13、              avg 忽略空值  如果不忽略空值使用nvl函数

分组函数   

group by 放在where后面   聚合列和基本列不能冲突  group by 里的列可以出现在前面也可以不出现在选择列里面

Having一定在group by 之后,having 必须是聚合函数,在group by 查询之后,在having上不能使用别名,having是在分组之后的结果集中,在表中跟踪不到

Where 语法表达式要求到表中能搜索到,所以不要求有聚合函数,where 出现的列在表中能找到

14、              子查询

子查询先于主查询,把子查询的结果放在主查询里来用

子查询放在小括号中间,优先级高于主查询

子查询可以出现在条件运算符,也可以出现在having运算符当中

子查询可以出现在:where

                  Having

                  From

任何值和空值比较都得空值

Any: 任何一个

All: 所有的

Null: 属于空集,不属于表中任何有值的集合

15、              set verify off  关闭校验信息

set verify on   恢复校验信息

   第二讲

  Oracle10g   g: grid 网格管理

  Oracle8i------------------------oracle9i-------------------------oracle10g

          手工管理              自动化管理

                                Sql自动调整

   过程-------线程---------纤程

  SGA为系统内存区,PGA为程序内存区

 

  数据库名:数据库名是一个数据库的名称标识,如MyOracle;这个数据库处于网络中时,为标识该数据库的网络位置,需要用数据库名和网络位置组成其全局数据库名,如MyOracle.domain。即MyOracleMyOracle.domain都指同一个数据库,只是一个名字用在本机上指明,另一个名字用在网络上指明。

  连接标示符=SID = 实例名或例程名:SID是一个Oracle实例的唯一名称标识。Oracle实例(Instance)也称为Oracle服务器(Server),是用来访问数据库文件集的存储结构与后台程序的集合,用SID来标识。

  服务器名

一个数据库是Oracle用于保存数据的一系列物理结构和逻辑结构。简单地说,一个Oracle数据库是磁盘上的一堆文件;为了启动数据库即访问这堆文件,需要在内存中创建它的一个实例,然后由实例加载并打开数据库,实例就是内存中的一堆进程。用户连接数据库时,实际上是连接到实例,然后由实例负责与数据库通信,再将处理结果返回给用户。所以,Oracle中一个数据库至少有一个实例与之对应,但一个数据库可以对应多个实例,被多个实例访问。

 

这样理解,  

  1   数据库实列,就是内存上的各种缓冲区   SID就是它的标志  

  2   数据库,就是硬盘上的数据文件   它有个名字     XXXX     YYYY  

  3   数据库服务器:   ORACLE     DB2   MSSQL   MYSQL  

  4   监听服务器:   LISTERING    

     监听服务器     监听多个   数据库实列   ;数据库实列可以为多个数据库服务!

实例=例程:内存结构

           后台进程:由oracleservice启动的进程:PMON:监听连接进程

                                                SMON

                                                DBWR:监听读写进程

                                                LGWR:日志读写进程,重做日志文件写入日志文件中

                                                CKPT:检查文件是否有改动的数据,改动后是脏数据,事物数据没有来得及提交,负责清除表的临时数据

 

进程到数据库文件中去控制物理文件

用户进程————〉服务器进程:保留用户连接信息,为客户端进程创建会话,保持持久连接

                  PGA

数据库:存储文件的

数据库服务器:是数据库管理系统(可以创建多个oracle数据库实例)创建实例时,默认实例名和数据库名相同,一个数据库只对应一个实例

用户进程-----------------服务器进程--------------------------------数据库

                    监听进程     是否连接到    oracle物理服务          建立会话:

                                                                       实例

                                                                       进程打开

                                                                       打开数据库

 

多个用户要用共享服务器模式:SQL语句可以共享

系统管理员要用专用服务器模式:单独占用主机内存             打开服务命令:连接类型

 

三类文件:

   控制文件:包括进程、启动状态参数 是镜像的  备份在三个不同的磁盘上

   重做日志文件:系统不出问题,没有意义,占存储空间,不得不作

   数据库文件:参数文件:记事本编辑或二进制存储  启动参数和内存的大小

               口令文件: oracle的配置文件在/admin------/pfile  根据这个文件启动数据库

数据库的名字记录在:控制文件:二进制文件,无法手工改动

                    数据字典

                    Pfile

/Admin--------/database(配置文件,二进制)

Pfile: 文本文件

Sfile: 二进制文件       sfile文件优先级高于pfile文件

口令:以加密的形式存在,DBA也不知道普通用户的口令http://32d3739acf774c2:1158/em

                                                       本地主机名

                                                       本地IP

                                                       远程 IP

归档日志模式:非归档模式:NOARCHIVELOG(潜在危险)C存满再向A写时,清除A       内容

             归档模式:ARCHIVELOG(过去的一切信息都存在归档中)C存满再向A写时,A的内容向归档日志写

A:事物日志文件

B:事物日志文件

C:事物日志文件

数据库应用不合理要规划(设置归档日志模式)设置存储块大了归档频率低,小了频率高,要合理选择

LGWR:检查,当来一条SQL语句,进行硬分析,正确(行、列、名字等)要存入共享池,以后再来调用语句跳过硬分析,直接进入软分析,

DB buffer 数据库高速缓存:更改的数据块

                          脏数据块

                         被更改过的块     更改了变动的数据要写入重做日志缓冲区

把最近最少用的,清除写入日志文件

后台进程: oracleservice  开启了好多线程

 

表空间物理文件管理           物理组成                      逻辑组成

的存储结构                   操作系统文件    N      1  表空间(1N)段:                      

                             块(默认:512k 在格式          段: 数据段

                                  化中,右击属性)               索引段

                                                                 临时段

                             N:1  DB                       回滚段

                                                            区间:

                                                            DB:

                               表空间(1N)段:(1N)区间:(1NDB:

表空间为分组管理提出来的

DB-----多个表空间-----多个段-------多个区间------多个DB块(大小不可以改动,改动数据库                           

                                                      乱了)

                           DB数据库

1(每一行)

 

 

 

2

区间:(多个DB块)

 

 

3

 

 

 

4

 

 

 

   作为系统管理员只要把逻辑管理好了,不必知道具体存放物理地址就可以了

 

 

 

 

Oracle服务器---------------启动-------------------后台进程启动------------------------open数据库

(关闭什么都干不了)   nomount            mount               将各个表空间联机

                                                                使用表空间

                       分配内存            oracle打开数据库控制文件

                 参数配置文件:pfile        装载数据库:数据库名字

                               Spfile                表空间等信息

                                            检查数据参数及路径是否存在

                                            装载

通过命令行

Conn  / as sysdba(作为本地数据库,默认的)

Show user

Shutdown: 正常关闭,持久等待

Shutdown  abort(立即关闭,相当于断电关闭)

Startup  总启动

Startup nomound: 逐步启动

Show  sga: 查看分配内存结构

show parameter sga_  查看sga参数,sga是实例变量

show parameter control: 三个一样的控制文件,镜像一样

show dababase open: 打开数据库表空间联机

shutdown 1: transactional 安全的,等待会话结束

         2: immediate: 立即关闭,不会等待会话结束,只是把高速缓存写到日志中

         3 abort : 忽略一切,立即关闭,down掉了

         4 normal: 正常,最安全状态,等待事务结束,等待会话结束

           Shutdown 的默认状态就是 shutdown nomal

如果关闭不断数据库就到服务器手工关闭 oracleservice

安全等级:4>1>2>3

启动一个SQLplus,创建一个会话,可以作为多个用户进行登陆

set sqlprompt Tom 设置的提示符为Tom

insert deleteupdate 等都是在进行一个事务命令

commit : 提交事务命令

rollback:关闭事务命令

exit: 退出SQL环境进到操作系统得环境

 

select  TABLESPACE_NAME from dba_tablespaces  查看表空间

SYSTEM:系统表空间,字典、系统信息

UNDOTBS1:重做表空间

SYSAUX:辅助表空间

TEMP:临时表空间

USERS:用户表空间

EXAMPLE:创建的用户

 

//创建临时表空间

create temporary tablespace test_temp
tempfile 'E:/oracle/product/10.2.0/oradata/testserver/test_temp01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

//创建数据表空间
create tablespace test_data
logging
datafile 'E:/oracle/product/10.2.0/oradata/testserver/test_data01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

//创建用户并指定表空间
create user testserver_user identified by testserver_user
default tablespace test_data
temporary tablespace test_temp;

//给用户授予权限

grant connect,resource to testserver_user;

//以后以该用户登录,创建的任何数据库对象都属于test_temp test_data表空间,这就不用在每创建一个对象给其指定表空间了。

可以指定多个磁盘表空间文件

create tablespace erp1 datafile 'd:tonggang1.dbf'

 size 20m

quota  extend on next 10m maxsize 100mh

 

create tablespace  erp

 datafile 'd:tonggang1.dbf'size 20m,'f:tonggang1.dbf'size 20m;

DROP TABLESPACE ERP INCLUDING CONTENTS AND DATAFILES 删除表空间

 

对用户进行操作

对外                    对内

用户------------------------------模式=方案

数据库管理员最大的权限(关、开、修改、调用)

create user zhang identified by zhang

 default tablespace erp

 quota 10m on erp   用户zhang 能在erp空间上 操作10M

 quota  10m on erp1用户zhang 能在erp1空间上 操作10M

 quota 10 on users用户zhang 能在users空间上 操作10M

 

更改用户密码
alter  user zhang identified by zhang123

 

Revoke create session from zhang 撤销会话的权利

服务名:在客户端连接服务器的名子,可以新建,可以修改

数据库名:SID 不能改

实例名:不能改,一般创建数据库时,默认创建实例同名

 

 

 

从已经有的表中创建表

Create table AA  as select * from scott.emp

   新表                已经有的表

数据库中的表:用户表

              数据字典

Select  table_name from user_tables

DBA_  数据字典:DBA使用的数据字典

ALL_  数据字典:有些用户看另些用户

User_  数据字典:查看本用户

Varchar2(size)  变长,没有用的收回,节省空间

Char(size)      固定长,搜索速度快

Number(p,s)

有外键的无法修改表名

 

第三讲  数据操作

删除列:检查此列是否是外键,外键不许删除

如果此列为常用频繁列,也不许删除

为了安全,把不用的列放置为无用状态

删除数据用delete

删除对象用drop, drop对应create

Rename必须是对象的所有者

Truncate 不经事物,也不经事物日志,不可恢复,轻易不用truncate

 

三个数据字典

1、 被所有用户使用

User_tables  当前用户下的所有表

User_views  当前用户下的所有视图

User_sequences 当前用户下的所有的序列、          user_*s

User_contraints  当前用户下的所有约束      

2、查看我拥有和我被授权所看到的(可以看别人的)      all_*s    s代表复数

3DBA能看到很多,但是只有DBA使用                dba_*s

   User<all<dba  (在权限上)

Olap: 在线分析功能(数据挖掘)

Oltp:  在线事务处理功能:insert

                        Update

                        Detele

数据库白天设计为oltp功能,晚上设计为olap

insert into test(a,b,c) values(&avalue,&bvalue,&cvalue);  替换变量交换的插入值

update只能修改数据,不能修改结构信息   程序员一定要注意这些语句一下就是几十条

事务是完整性,永久性,隔离性

一个事务  commit 提交后事务结束

一个事务  rollback事务结束,所有语句回到起点状态

 

Insert  into test values(22,’sss’,sysdate)     新事务自动开启

Update test set b=’hao’;

Select * from test;

Commit              这四行命令是一个事物

一个事务没有结束,其它用户是看不到的

没有提交不写入数据库

为了避免长事务回滚,把长事务分段,放置时间点

select * from departments

insert into departments values(200,' ',null,null);

select * from departments

savepoint A

delete from departments where department_id=200;

select * from departments

rollback to A;    回滚到A以前的

create语句隐式提交事务,结束上一个事务

 

锁:为了防止多用户并发事务操作互不干扰

隐式锁定:自动锁定

两个用户对同一条记录同一时刻修改,而另一个用户进行删除操作,所以系统自动提供锁,等待一个用户释放了锁,另一用户才能用(操作那个数据锁定那个数据)当更新不同的数据自己锁自己的,更新同一个数据排他锁

行级锁:

Set sqlprompt A>                            set sqlprompt B>

A>   update student.departments set

 Department_name=’zhang’

 Where Department_id=200

                                       B>select * from student.departments

B>commit

                                       B> delete from departments

                                          where department_id=200                  

                                       B>select * from student.departments

where department_id=200 

                                          B一直不能执行,一直等待(因为A

                                            有提交,不能释放200的那一行)

A>   commit (提交,释放锁)

                                          B 获得锁,执行命令

A>   delete from deparments(没锁不能执行)

                                       B>rollback 释放锁

A获得锁,命令被执行

                                       B>select * from student.departments for

                                           Update wait 3 防止A死锁返回超时

--------------------------------------------------------------------------------------------------------------

排他所是锁定更新的行,不更新的行不锁定

在测试时,多个用户存在,如果不提交,只有一个用户能连上,其他的用户都被锁定

行级锁:update

        Delete

        Selete……for

表级锁:共享锁  两个用户同时锁定一张表

        排他锁

注意:回滚只能回滚到commitcommit 提交了的信息是不能回滚的。

 

Set sqlprompt A>                            set sqlprompt B>

A>lock table departments in share mode     B> lock table studnt.departments in share mode

A>   update departments set                   B>update student.departments set

department_name=’zhang’                   department_name=’zhang123’

A等待B解锁                               B等待A解锁

                      AB共享锁之间发生了死锁

   ---------------------------------------------------------------------------------------------------------------

   B> lock table student.departments in

                                          Share mode

A>insert into departments values(110,’ ’,null,null)

   不能成功的操作等待B解锁                  B>commit 解锁了

A>成功操作

Unique 不许重复,但许可出现空值

先建立表,再修改表添加主键

Alter table employees add constraint uk_name unique(employee_name)

军人没有身份证

在开发和测试时先禁用约束,在正式实施时,再启用约束

-----------------------------------------------------------------------------------------------------------------------范式设计

1范式:列的原子性

2范式:在第1范式的基础上,主键相关性。表中的每一列都和主键一一相关,和主键没有直接关系的独立出来,(例如,职工培训成绩信息表和职工基本信息的主键没有直接的关系,需要独立出来,建立第二张表;再把与第二章表无关的信息独立出来建立第三张表)

3范式:非主键之间的无关性。

          例如1

 

语文

数学

化学

总成绩

 

80

90

70

240

 

 

 

 

 

               总成绩依赖于语文,数学和化学,所以不要总成绩

          例如2:有了出生年月日,就不再要年龄了

-----------------------------------------------------------------------------------------------------------------------视图:是虚表,是表中的一部分:限制数据访问

                               提供数据独立性

                               是表的子集

                               提供表的独立性

视图创建和表一样的用   减少了表的设计,优化了表的结构方便了。

 create view view01 as select department_id, department_name

 from departments;

create or replace view view01 as select * from departments where department_id=80;

 

如果视图定义包括条件(譬如 WHERE 子句)并且其意图是确保任何引用该视图的 INSERT UPDATE 语句都应用 WHERE 子句,则必须使用 WITH CHECK OPTION 定义该视图。这个选项可以确保数据库中正在修改的数据的完整性。如果在 INSERT UPDATE 操作期间违反了条件,则返回 SQL 错误。

下面是一个使用了 WITH CHECK OPTION 的视图定义的示例。要确保总是检查条件,WITH CHECK OPTION 是必需的。在这种情况下,我们希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值(不能更改dept的值也不能插入其他的dept,必须要符合where语句中定义的条件)。当使用视图插入新值时,总是强制执行 WITH CHECK OPTION

CREATE VIEW EMP_VIEW2(EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
WHERE DEPT=10
WITH CHECK OPTION;

如果这个子句不存在,那么某个使用该视图的用户就有可能更新某条记录,使其不再属于该视图。例如,下列 SQL 语句可能会引起一些问题。
UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10;

这个语句的结果是该视图现在不包含任何记录,因为部门 10 不再有雇员了。 

----------------------------------------------------------------------------------------------------------------------创建序列:序列不依赖任何表  用途创建流水号

   是自动产生的唯一的数

   是可共享的对象

   典型的用途是创建一个主键值

   可以代替应用程序编号

   当使用高速缓存存储器时,访问序列值的效率提高

 

posted on 2008-10-09 09:41  Angelo Lee  阅读(153)  评论(0编辑  收藏  举报