第一范式:有主键,列不可分
第二范式:不存在部分依赖(当一张表中有多个字段作为主键时,非主键字段不能依赖于部分主键,必须依赖组合主键)
第三范式:不存在传递依赖(所有非主键必须依赖于主键) (eplid,dptid,dptname)其中的dptname属于传递依赖
最主要的原则:表关联查询越少越好,先按第三范式设计,然后加上冗余字段解决多表关联查询效率问题
linux下oracle启动的过程
lsnrctl start
//sqlplus sys/oracle as sysdba (10G用句代替下面两句)
sqlplus /nolog
conn sys/oracle as sysdba
startup
windows下oracle启动过程 (一般会在服务中启动)
lsnrctl start/stop 启动监听程序
oradim -startup -sid orcl (net start/stop oracleserviceoral) 启动Oracle服务,其中orcl为数据库的服务名或者SID
忘記sys用户的密碼的两种解決方法:
在运行中輸入:sqlplus /nolog
在CMD窗口中输入:conn / as sysdba
接著輸入:alter user sys identified by "111111"; //用于修改用户的密码
在本机CMD下输入 SQLPLUS SYS AS Sysdba
然后要求输密码时按Enter即可,进入后自行改密码
ORACLE数据库的三种验证机制
操作系统验证 在“计算机管理---本地用户和组---组---ora_dba---属性---成员”
密码文件验证 F:\oracle\product\10.2.0\db_1\database\PWDorcl.ora
数据库验证 普通用户用这种方式
拥有sysoper与sysdba角色的用户采用的是操作系统验证(默认)和密码文件验证
先接到监听再连到数据库
在CMD中连接进入数据库
sqlplus sys/oracle as sysdba 可省略密码写成 sqlplus / as sysdba
sqlplus scott/111111 sqlplus scott/111111@orcl 指定连到哪个实例
在CMD中已经连接进入数据库后更换用户
conn scott/111111
disconn 断开连接
show user;查看当前用户
修改自己的密码:passw
alter user scott account lock/unlock;用户加锁、解锁
alter user scott password expire;让用户口令即刻失效
drop user scott [cascade] 删除指定用户【级联删除该用户的所有对象】
创建用户
create user userName identified by userPW
授权系统权限
grant create session to userName [with admin option] [系统权限传递]
grant create table to userName
grant unlimited tablespace to userName
把create session的权限授于所有用户,public 代表所有用户
grant create session to public
收回权限
revoke create table from userName
查看当前用户拥有哪些系统权限
select * from user_sys_privs;
对象权限:用户对其它用户的数据对象的操作权限,由拥有该对象的用户把权限授予其它用户
grant select on tableName to anotherUser [with grant option] [对象权限传递]
grant all on tableName to anotherUser;
查看当前用户拥有哪些对象权限
select * from user_tab_privs;
其中对象权限可以控制到列,注意:查询和删除不能控制到列
grant update(name) on table to anotherUser;
grant insert(name) on table to anotherUser;
查看当前用户控制到列的对象权限
select * from user_col_privs;
角色是一些权限的集合
create role myrole;
grant create session to myrole;
drop role myrole;
将角色授于用户
grant myrole to userName
注意:有些系统权限无法直接赋于角色,如unlimited tablespace。
此外,表是属于某个用户的,而角色不属于任何用户(不管由谁创建)。
对一些权限的理解:
系统中有create table权限,但没有alter table,drop table,delete table 权限;
系统中有create any table 权限,同时也有alter any table,drop any table,delete any table 权限。
“any”指我们可以对其它用户下的表进行对应操作。
权限传递:A授权给B,B再把A的权限授给C,A收回B的权限,则C的也被收回
set linesize 400 //将一个行的宽度设大一些,默认80
set pagesize 20//设置每页数量,默认14
select sys_context('userenv','db_name') from dual; //查看当前数据库名
show error; --显示错误信息
Alter session set nls_date_format='yyyy-mm-dd'; //改变当前Session 的日期格式
Last_day(sysdate);
Spool 将sql/plus输出屏幕上的内容输出到指定文件中,输出后要用spool off关闭
Create table 表名[(列名1,列名2,…)] as select语句
不允许在Where子句中使用分组函数,用Having子句过滤分组条件,分组函数最多可以嵌套两层
表包括:用户表,数据字典表(属于Sys用户,由Oracle Server维护)
逻辑存储结构:表空间 > 段 > 区 > 块
多表连接时,在列名前加表名,提高查询效率,用Join 写关联关系,Where写过滤条件
SQL写法思路:分多部分写再整合
事务起始于一条DML语句(update,delete,insert,merge)select 语句不会触发事务
事务结束:rollback(非正常断开),commit(正常断开),DDL,DCL
主键和唯一约束会默认建索引,索引:查询快,修改慢,占空间
视图维护麻烦,因为表改,视图也得改,简化查询,屏蔽数据
Where sal > any/all(多值)
Where a.dptno(+)=b.dptno 右连接(b表全部出来)
Savepoit sp; 保存点,实现部分回滚 rollback to sp;
对于日期类型可以直接用 +/- 数字
字符串和日期用单引号括起来,
字符串大小写敏感,日期格式敏感(不能用字符与日期进行比较,必须先用to_date()转成日期类型)
别名用双引号可强制大小写和特殊字符,可以省略 as ,可以不用双引号
Like '\_%' escape '\' 把 \ 当转义字符,可以是任意字符
:= 赋值 || 连字符号
对于update,delelte有:new与:old两个状态的值
sequenceName.nextval获取下个值,sequenceName.currentval获取当前值
Distinct关键字的作用范围是后面所有列字段的组合
算数表达式中出现空值,则整个表达式结果为空,连接表达式中空值被当作一个空的字符串(长度为0)
NVL(exp1,exp2)如果exp1值为NULL,返回exp2
NVL2(E1, E2, E3)的功能为:如果E1为NULL,则函数返回E3,否则返回E2
NULLIF(exp1,exp2)如果两个值相等返回NULL,否则返回Exp1
Coalesce(expl,exp2,…)函数返回众多表达式中第一个非NULL 表达式的值
Case deptno when 10 then '财务部'
when 20 then '技术部'
Else '行政部'
End
与下面的等价
Decode(deptno,10,'财务部',
20, '技术部',
'行政部')
Rownum加在本次select查询结果中伪列,从1开始,只能与< 、<= 一起用,因为取出的第一条记录为1
Select * from (select rownum r,t.* from (select * from emp order by sal desc) t) where r>6 and r<10
PL/SQL 1、提高性能(预编译)2、减少网络传输3、模块化编程4、安全 5、移植性差
PL/SQL程序的基本单元是块(BLOCK),块就是实现一定功能的逻辑模块,块中的可执行语句、SQL语句和END结束标识都要以分号结束
[DECLARE]
--declaration statements
BEGIN
--executable statements
[EXCEPTION]
--exception statements
END;
变量定义的方法是:
变量名 [CONSTANT] 类型标识符 [NOT NULL][:=值|DEFAULT 值];
例如:v_name varchar2(20) not null default 'james';
变量名 表名.字段名%TYPE; 或 变量名1 变量名%TYPE;
例如:v_name emp.ename@type; v_name1 v_name%type;
使用%type属性,可以使变量的声明根据表字段的类型自动变换,而且%type属性,可以用于变量身上
变量名 表名%ROWTYPE;或 游标名%ROWTYPE;或 Record类型%ROWTYPE;
Table 变量类型,相当于数组,但下标可以是负数, //v_empnos(-1) := 9999;
TYPE 类型名 IS TABLE OF 数据类型[NOT NULL] INDEX BY BINARY_INTEGER;
declare
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
v_empnos type_table_emp_empno;
begin
v_empnos(0) := 7345;
v_empnos(-1) := 9999;
dbms_output.put_line(v_empnos(-1));
end;
Record变量类型
TYPE 类型名 IS Record();
declare
type type_record_dept is record(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type);
v_dept type_record_dept;
begin
v_dept.deptno := 1;
v_dept.dname := 'james';
dbms_output.put_line(v_dept.deptno);
end;
游标变量(REF CURSOR游标) ,与游标类似,游标变量指向多行查询的结果集的当前行。但是,游标与游标变量是不同的,就像常量和变量的关系一样。游标是静态的,游标变量是动态的,因为它不与特定的查询绑定在一起
TYPE 类型名 IS REF CURSOR [return emp%font-weight: normal;
评论