第一讲
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
在isqlplus和listerner同时开启时才能开始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多个系统内置帐户,用途查用手册
用Excel、word、ACCEL的表都用Oracle数据库管理
实体关系图:一句话话中关键的名词有可能是表
1对1
1对多
多对多 多对多可转化为1对1,1对多
Sybase.PowerDesiner.v12.0:实体关系图设计工具:然后用实体关系图连接数据库
Name: 汉字
Code: 不用汉字
#:主键
*:非空
SQL————————à 数据库————————〉数据库表
硬分析:语法
语义
字典查询
权限查询
软分析:分析计划
SQL:DML:Merge合并语句
把labs放在D:/oracle/product/10.2.0/db_1 Oraclehome的路径
/产品编号/版本/实例
用控制台方式启动sqlplus/nolog(稳定) IE 启动isqlplus(不稳定,开发时可用)
SQL〉connect sys/teacher@orcl as sysdba sysdba有安装,卸载、开启、关闭和管理数据库的功能,级别很高
用户/密码 @连接标志符 以..身份 数据库管理员
能够安装和进入就是管理员
SQL〉connect @orcl as sysdba 以本地操作系统身份进入数据库,这种方式只限制本地服务器,远程则不可以
SQL〉show user
User is “sys”
sQL> @%oracle_home%/labs/student.stl
执行 环境变量 文件夹 文件名
A用户------------------A模式
B用户------------------B模式 一个用户是一个模式
模式:表
视图
包
过程
序列
同义词
索引
A用户想看B用户的东西 只用B用户或者SDB给他做了授权才可以
数据结构存在数据字典里 数据则存在表里
Desc tables 查看字典里的信息,即查看表的结构
变程好的风格:
Select --------
From--------
Where----- (返回true或false)从表的每一条记录都和主表的记录作对比,当为ture时显示出来
Order by-------- desc
给每一列改名不影响表,只影响这一次显示
Isqlplus和sqlplus先连接数据库
在Isqlplus中保存脚本、加载脚本、取消操作
SQL〉edit
SQL〉save d:../test04.sql
1、SQL〉get d:../test04.sql 2、SQL〉@d:/ 加载的两种方法
SQL〉run
Psql: 进入SQLwind 非开源的
SQL语句的规则:
别名是用“” 字符和日期用‘’
优化时要少用<>
Like 模糊查询 ‘S%’ 以S 开头的多条记录
In(set)在这里为true 不在这里为false
Where job_id like ‘_/_%’ escape ‘/’ ‘/’可以拿任意的字符来转义
通配符/下划线符号
Salary>1000 or hire_date<3月88 and employees_name=’s% ’ and 连接的先执行 or连接的两端后执行
多表查询时
1、 笛卡尔乘积 A:a,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 (查看结果)
6、set 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
rownum和rowid 系统自动生成 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。即MyOracle和MyOracle.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 表空间(1:N)段:
块(默认:512k 在格式 段: 数据段
化中,右击属性) 索引段
临时段
块N:1 DB块 回滚段
区间:
DB块:
表空间(1:N)段:(1:N)区间:(1:N)DB块:
表空间为分组管理提出来的
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、 delete、update 等都是在进行一个事务命令
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代表复数
3、DBA能看到很多,但是只有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
表级锁:共享锁 两个用户同时锁定一张表
排他锁
注意:回滚只能回滚到commit,commit 提交了的信息是不能回滚的。
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解锁
A和B共享锁之间发生了死锁
---------------------------------------------------------------------------------------------------------------
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 不再有雇员了。
----------------------------------------------------------------------------------------------------------------------创建序列:序列不依赖任何表 用途创建流水号
是自动产生的唯一的数
是可共享的对象
典型的用途是创建一个主键值
可以代替应用程序编号
当使用高速缓存存储器时,访问序列值的效率提高