第一章 ORALCE常识 及 SQL 基本语法
1,ORACLE安装完成后的初始口令?
internal/oracle
sys/change_on_install
system/manager
scott/tiger scott是Oracle的核心开发人员之一,tiger是他家的一只猫的名字
sysman/oem_temp
例:conn scott/tiger@jspdev;
conn system/manager@jspdev as sysdba;
2,IBM的Codd (Edgar Frank Codd)博士提出《大型共享数据库数据的关系模型》
3,ORACLE 9i 中的 i (internet)是因特网的意思
4,ORACLE的数据库的物理结构:数据文件、日志文件、控制文件
5,ORACLE的数据库的逻辑结构:表空间——表——段——区间——块
表空间 类似于SQLSERVER中数据库的概念
6,SYSDATE 返回当前系统日期(说明:当函数没有参数时可以省略括号)
7,在SQL PLUS中 执行缓冲区中的SQL命令的方式:
SQL> run
SQL> r
SQL> /
8,在SQL PLUS中 修改当前会话的日期显示格式
SQL> alter session set nls_date_format = 'YYYY-MM-DD'
9,使用临时变量,提高输入效率
SQL> insert into emp(empno,ename,sal) values(&employeeno,'&employeename',&employeesal);
10,从其他表中复制数据并写入表
SQL> insert into managers(id,name,salary,hiredate)
SQL> select empno,ename,sal,hiredate
SQL> from emp
SQL> where job = 'MANAGER';
11,修改表中的记录
SQL> update table set column = value [,column = value,……] [where condition];
12,删除表中的记录
SQL> delete [from] table [where condition];
13,数据库事务,事务是数据库一组逻辑操作的集合
一个事务可能是:
多个DML语句
单个DDL语句
单个DCL语句
14,事务控制使用 savepoint,rollback,commit 关键字
SQL> savepoint aaa;
SQL> rollback to aaa;
SQL> commit;
15,查询表中的数据
select * from table_name;
select column_list from table_name;
16,Number and Date 可以用于算术运算
因为 Date 类型 其实存储为 Number 类型
17,用运算表达式产生新列
SQL> select ename,sal,sal+3000 from emp;
SQL> select ename,sal,12*sal+100 from emp;
18,算术表达式中NULL值错误的处理
因为任何数与NULL运算无意义,所以为避免错误,需要用其他值替换NULL值
例如:
SQL> select ename "姓名",12*sal+comm "年薪" from emp where ename = 'KING';
姓名 薪水
---------- ----------
KING
因为comm(提成工资)列为NULL值,结果也出现了NULL值,所以需要用0来替换NULL
注意函数nvl的使用 NVL(原值,新值)
SQL> select ename "姓名",12*sal+NVL(comm,0) "年薪" from emp where ename = 'KING';
员工姓名 员工薪水
---------- ----------
KING 60000
——————————————
19,使用友好的列名,有下面三种形式
SQL> select ename as 姓名, sal 月薪, sal*12 "年薪" from emp
20,过滤重复行,使用关键字 distinct
SQL> select distinct * from emp;
21,SQL PLUS访问ORACLE数据库的原理
SQL*Plus —> Buffer —> Server —> Query Result
22,where 子句中 字符型 是区分大小写的,最好都转成大写
因为在ORACLE库中,字符会转换成大写来保存
23,比较运算符:等于"=",不等于有两种"<>"或者"!="
24,复杂的比较运算符:
between …… and ……
in (……value list……)
like (% 代表匹配至多个任意字符,_ 代表单个任意字符)
null (与NULL进行比较时,需要使用 is null 或者 is not null)
25,逻辑运算符,按优先级从高到低排列
Not , And , Or
26,Order by 子句 中 ( asc 表示 升序,desc 表示降序)
27,ORACLE 函数,分为
单行函数:每条记录返回一个结果值
多行函数:多条记录返回一个结果值
28,字符函数——转换函数
LOWER:转为小写
UPPER:转为大写
INITCAP:将每个单词的首字母大写,其他字母小写
29,字符函数——操纵函数(注意:ORACLE以UNICODE存储字符)
CONCAT:连接两个字符串,与并置运算符“||”类似
SUBSTR:substr(string,position,length) 从string中的position开始取length个字符
LENGTH:返回字符串的长度
INSTR: instr(string,value) 返回 value 在 string 的起始位置
LPAD: lpad(string,number,value) 若string不够number位,从左起用vlaue字符串填充(不支持中文)
30,四舍五入函数 round(数值,小数位)
SQL> SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1) FROM DUAL;
ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)
--------------- --------------- ----------------
45.92 46 50
31,数值截取函数 trunct
SQL> SELECT TRUNC(45.923,2),TRUNC(45.923,0),TRUNC(45.923,-1) FROM DUAL;
TRUNC(45.923,2) TRUNC(45.923,0) TRUNC(45.923,-1)
--------------- --------------- ----------------
45.92 45 40
32,求模函数 MOD(a,b) 返回a被b整除后的余数
33,Oracle内部默认的日期格式: DD-MON-YY (24-9月 -06)
34,DUAL :哑元系统表,是名义表,只能范围唯一值
35,Date类型的算术运算,以天为单位
例如:部门编号为10的员工分别工作了多少年
SQL> select ename,(sysdate-hiredate)/365 as years from emp where deptno = 10;
ENAME YEARS
---------- ----------
CLARK 25.3108341
KING 24.8697382
MILLER 24.6861766
36,日期函数
MONTHS_BETWEEN 返回两个日期之间相差多少个月
ADD_MONTHS 在日期上加上月份数
NEXT_DAY 下一个日子 select next_day(sysdate,'星期一') from dual;
LAST_DAY 该月的最后一天
ROUND 四舍五入日期 round(sysdate,'year') 或者 round(sysdate,'month')
TRUNC 截取日期 trunc(sysdate,'year') 或者 trunc(sysdate,'month')
37,数据类型转换 —— Oracle 可隐式转换的情况有:
From To
varchar2 or char —— number (当字符串是数字字符时)
varchar2 or char —— date
number —— varchar2
date —— varchar2
38,数据类型转换 —— Oracle 数据类型转换函数
to_char
to_number
to_date
39,日期格式模型字符
YYYY 代表完整的年份
YEAR 年份
MM 两位数的月份
MONTH 月份的完整名称
DY 每星期中天的三个字符缩写
DAY 表示星期日——星期六
另外还有 D,DD,DDD 等。。。
40,NVL(value,substitute)
value:是可能有null的列,substitute是缺省值
这个函数的作用就是当出现null值的时候,后缺省值替换null
41,Coalesce(exp_name1,exp_name2……exp_n)
42,Decode 函数: Decode(exp,testvalue1,resultvalue1,testvalue2,resultvalue2)
例如,根据国家名称显示相应的国家代码:
1>创建国家表
create table countrys
(
vCountryName varchar2(50)
);
2>写入几行,分别为中国、日本、韩国
insert into countrys values ('&name');
3>用DECODE函数,进行匹配和显示
select vCountryName as "国家名称",
DECODE(vCountryName,'中国','086','日本','116') as "国家编号" from countrys;
国家名称 国家编号
-------------------------------------------------- ---
中国 086
日本 116
韩国
结果,在DECODE中存在且成功匹配的值将会被显示,否则显示为NULL
43,SQL PLUS 的一些命令
SQL> SAVE 'D:\EMPSQL.TXT' --把当前缓存的SQL命令保存到文件
SQL> GET 'D:\EMPSQL.TXT' --从文件读取SQL命令到缓存
SQL> RUN --运行SQL命令
SQL> @'D:\EMPSQL.TXT' --从文件读入SQL命令到缓存,并执行
SQL> CONNECT SYSTEM/MANAGER@JSPDEV --连接到某个指定数据库
SQL> CONNECT SYSTEM/MANAGER
--连接到本机ORACLE数据库,是上一个命令简化
SQL> CONN SYSTEM/MANAGER --CONNECT命令的缩写
SQL> SHOW USER -显示当前用户的用户名
SQL> SET SQLPROMPT HELLO> --修改命令提示符
SQL> SET WRAP OFF --不换行
SQL> SET SERVEROUTPUT ON> --打开服务器回显
SQL> LIST --列出当前缓冲区的内容
SQL> L --同上,列出当前缓冲区的内容
44,ORACLE数据库中 锁 的概念
锁是数据库的一种机制,它用来管理对一个共享资源的并行访问
共享资源:不仅指数据库记录,而且也指其他的资源(如表)
当多个用户同时访问数据库中的同一资源时,就会产生对同一资源的访问的冲突
为了防止资源被破坏,数据库采取了解决访问冲突的机制,称之为 锁
45,行级锁
行被排他锁锁定时,其他用户不能修改此行,用COMMIT,ROLLBACK结束事务时,锁将释放,其他用户将得到权限
获取行级锁:当使用DML语句操作行时,自动行级排他锁
SELECT …… FOR UPDATE [WAIT number_second] 可以在一行或多行上行级排他锁
例:
创建表
CREATE TABLE TEST AS SELECT EMPNO,ENAME FROM EMP
查询时,不允许 其他用户修改,以保证查询到的是最新的数据
SELECT * FROM TEST FOR UPDATE
等待30秒
SELECT * FROM TEST FOR UPDATE WAIT 30
46,表级锁
在多个用户同时访问数据时确保数据的完整性,可以设置(共享锁,共享更新锁,排他锁)
47,手工锁表——共享锁
LOCK TABLE
lock table test in share mode;
48,手工锁表——共享更新锁
LOCK TABLE
lock table test in share update mode;
49,手工锁表——排他锁
LOCK TABLE
lock table test in exclusive mode;
lock table test in exclusive mode nowait;
50,ORACLE 数据库存储数据的方式
规则表、分区表、索引组织表、簇
51,ORACLE 数据类型简表
数据类型 描述
VARCHAR2(size) 可变长字符数据类型(1-4000)
CHAR(size) 固定长度字符类型(1-2000)
NUMBER(p,s) 数值型(p:有效数据位数,s小数位)
DATE 日期数据类型
LONG 可变长的字符型 最大2G
CLOB 单字节的大型字符对象 最大 4G(常用于保存大文本)
BLOB 二进制大型对象 最大 4G (常用于保存媒体文件)
RAW(size) 原始的二进制数据 最大2000
LONG RAW 可变长的原始二进制数据 最大2G
BFILE 存储在外部文件中的二进制数据 最大 4G(数据库中实际上只存了指针)
52,ROWID 与 ROWNUM
ROWID 是十六进制字符串,表示行的唯一地址
ROWNUM是行相对于表中其他行的位置序列(常用于查询顶部N条记录或者分页显示时)
SQL> SELECT ROWID,ROWNUM,EMPNO,ENAME FROM EMP;
ROWID ROWNUM EMPNO ENAME
------------------ ---------- ---------- ----------
AAAH14AABAAAO+HAAA 1 7369 SMITH
AAAH14AABAAAO+HAAB 2 7499 ALLEN
AAAH14AABAAAO+HAAC 3 7521 WARD
AAAH14AABAAAO+HAAD 4 7566 JONES
AAAH14AABAAAO+HAAE 5 7654 MARTIN
AAAH14AABAAAO+HAAF 6 7698 BLAKE
AAAH14AABAAAO+HAAG 7 7782 CLARK
AAAH14AABAAAO+HAAH 8 7788 SCOTT
AAAH14AABAAAO+HAAI 9 7839 KING
AAAH14AABAAAO+HAAJ 10 7844 TURNER
AAAH14AABAAAO+HAAK 11 7876 ADAMS
53,创建表,注意数据类型的默认转换存储
SQL> create table student
2 (
3 stuno int,
4 stuname varchar(10) not null,
5 stuBirth date default to_date('1980-01-01','YYYY-MM-DD')
6 );
SQL> DESC STUDENT;
名称 是否为空? 类型
----------------------------------------- -------- -------------
STUNO NUMBER(38)
STUNAME NOT NULL VARCHAR2(10)
STUBIRTH DATE
我们发现 int 型 被保存为了 NUMBER(38) , varchar(10) 被保存为了 VARCHAR2(10)
54,添加字段
SQL> alter table student add(stuPhone varchar(18));
55,修改字段
SQL> alter table student modify(stuName varchar(12));
56,设置某列为无用状态(一般在删除列之前,先把该列设置为无用)
SQL> alter table student set unused column stuname;
再次查看表结构,发现该列已经找不到了
SQL> desc student;
名称 是否为空? 类型
----------------------------------------- -------- --------------
STUNO NUMBER(38)
STUBIRTH DATE
STUPHONE VARCHAR2(18)
57,删除无用的列(一次可以删除全部无用的列)
SQL> alter table student drop unused columns;
58,添加约束
SQL> alter table student add constraint pk_stuno primary key(stuno);
59,撤消约束
SQL> alter table student drop constraint pk_stuno;
60,表分区
ORALE允许用户对表进一步的规划,即对表进一步拆分,将表分成若干个逻辑分区,每个部分称其为表分区。
分区的优点:
?增强可用性。单个分区出现故障,不影响其他分区
?均衡的I/O。不同的分区可以映射到不同的磁盘
?改善性能
61,表分区——范围分区法(range)
这种分区方法是根据表中列值的范围对表进行分区
分区时,首先依据列中的值可能的范围进行划分
例:某省对参加4,6级考试的成绩进行整理并保存至数据库,我们可以对于分数段进行划分
SQL> create table student
2 (
3 studentId integer not null,
4 studentName varchar2(20),
5 score integer
6 )
7 Partition by range(score)
8 (
9 Partition p1 values less than(60),
10 Partition p2 values less than(75),
11 Partition p3 values less than(85),
12 Partition p4 values less than(maxvalue)
13 );
表已创建。
插入一些值
SQL> insert into student values (&stuno,'&name',&score);
可以分别查看每个分区中的记录
SQL> select * from student partition(p1);
SQL> select * from student partition(p2);
SQL> select * from student partition(p3);
SQL> select * from student partition(p4);
注意:maxvalue 是 >= 85 到 最大值的分区,null 值也将包括在这一分区内
range 的字段 可以是 数值 或 日期 类型
62,表分区——散列分区法(hash)
散列分区法提供了一种通过指定分区编号来均匀地分布数据的方法
它通过HASH函数将数据映身到相应的分区上
它可使得数据均匀的分布到各分区上,各分区大小趋向一致
SQL> Create table department
2 (
3 DeptNo int,
4 DeptName varchar2(14)
5 )
6 Partition By hash(deptno)
7 (
8 Partition p1,
9 Partition p2
10 );
63,表分区——复合分区法
复合分区先对数据进行范围分区,然后在每个子分区又进行散列分区的一种分区方法
64,表分区——列表分区法
列表分区允许用户明确地控制行到分区的映射
不同于范围分区或散列分区,它允许按自然方式对无序和不相关的数据集进行分组和组织
例如:在客户表中记录着客户的国别信息。它们是中国、美国、英国、加拿大
在创建表时,我们可以对表进行列表分区。
注:假设有一个新的国家,在列表值中不存在,该条记录将无法写入
create table customer
(
custNo int,
custName varchar(20),
custState varchar(20)
)
Partition by list(custState)
(
Partition Asia values ('中国','韩国','新加坡'),
Partition Europe values('英国','法国','德国'),
Partition Ameria values ('美国','加拿大','墨西哥')
)
65,添加表分区
SQL> alter table student add partition p5 values less than(20);
66,撤消表分区
SQL> alter table student drop partition p4;
67,截短表分区
SQL> alter table student truncate partition p5;
68,合并表分区
SQL> alter table student merge partitions p3,p4 into partition p6;
69,涉及表分区的数据字典 user_tab_partitions user_ind_partitions
70,同义词——数据库对象的替换名称
同义词的优点:
?简化SQL语句
?隐藏对象的名称或所有者
?为分布式数据库的远程对象提供位置透明性
?提供对对象的公共访问
71,同义词类型:
私有同义词(普通用户创建的),
公有同义词(DBA创建的)
72,创建同义词:
create synonym syn_emp for scott.emp;
create public synonym employee for scott.emp;
73,撤消同义词
drop synonym syn_emp;
74,序列:是能够自动产生连续唯一值的数据库共享对象(序列用于为主键提供值)
75,创建序列
CREATE SEQUENCE sequence
increment by n
start with n
[maxvalue n|nomaxvalue]
[minvalue n|nominvalue]
[cycle|nocycle]
[cache n|nocache] ;
76,创建视图
create or replace view v_name 用于创建视图
create or replace force view v_name 用于创建带错误的视图
——(当表不存在、列不存在、或无权限)
SQL> CREATE OR REPLACE FORCE VIEW V_SS AS SELECT * FROM TT;
警告: 创建的视图带有编译错误。
SQL> SHOW ERROR;
没有错误。
77,联接视图——通过联接多个表来创建视图
78,键保留视图——联接视图中的表,其主键列显示在联接视图中
79,分区视图——数据存储在单独的表分区中
在运行期间,使用 union all 将这些表分区联合起来
SQL> create table temp1 as select * from emp where deptno = 10;
表已创建。
SQL> create table temp2 as select * from emp where deptno = 20;
表已创建。
SQL> create or replace view view_temp
2 as
3 select * from temp1
4 union all
5 select * from temp2;
视图已建立。
SQL> select * from view_temp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
已选择8行。
80,撤消视图 DROP VIEW v_name;
81,Oracle中视图相关的数据字典 user_views
82,重新编译视图 alter view v_name compile;
83,查询视图中的信息与查询表基本一致 select * from v_name;
第二章:索引
1,索引
与表关联的可选结构
加快SQL语句的执行
减少磁盘I/O
CREATE INDEX 语句用于创建索引
在逻辑上和物理上独立于表中的数据
ORCALE自动维护索引
2,唯一索引
确保在定义索引的列中没有重复的值
ORACLE自动为主键列和唯一键列创建唯一索引
CREATE UNIQUE INDEX 语句用于创建唯一索引
//创建唯一索引的语法 CREATE UNIQUE INDEX index_name on table_name(column_name);
//例:
SQL> create unique index idx_stuId on student(studentid);
3:组合索引
在表的多个列上创建的索引
也称为“连接索引”
组合索引中的列可以按任意顺序排列
对于在WHERE子句中包含多个列的查询,可以提高数据访问速度
//创建组合索引的语法 CREATE INDEX index_name on table_name(cloumns_list);
//例:
SQL> create index idx_empNoAndDeptNo on emp(empNo,deptNo);
//在WHERE子句中同时已这两列为条件时,将引用到这个索引
SQL> select * from emp where empNo=7899 and deptNo=10;
4:反向键索引
适合于只做添加不做修改的列
反转索引列中的没一个字节(如:001,002 分别反转为 100,200)
将数据插入操作分布在整个索引上
在创建索引时使用REVERSE关键字
//创建反向键索引的语法 CREATE INDEX index_name on table_name(column_name) REVERSE;
//例:
SQL> create index idx_studentId on student(studentId) REVERSE;
5,位图索引
适合于有大量重复数据的列,(例如员工表的部门编号列,部门编号大量重复)
为低基数列创建
BITMAP INDEX 语句用于创建位图索引
优点:减少响应时间,降低空间占用
//创建位图索引的语法 CREATE BITMAP INDEX index_name on table_name(column_name);
//例:
SQL> create bitmap index idx_deptNo on emp(deptNo);
6,索引组织表
表的数据存储在与其关联的索引中
对于数据的修改只会导致对索引的更新
基于主键进行搜索(所以表中必须要定义主键列)
//创建索引组织表的语法
CREATE TABLE table_name
(
colName colDataType,
……
CONSTRAINT pk_id PRIMARY KEY (table_pkcolumn)
) ORGANIZATION INDEX;
//例:
SQL> create table citys
2 (
3 nCityCode number(10),
4 vCityName varchar2(50),
5 constraint pk_citycode primary key (nCityCode)
6 ) organization index;
7,普通表与索引组织表的对比
普通表 索引组织表
ROWID唯一地标识行 主键唯一的标识行
有隐式的ROWID列 没有隐式的ROWID列
基于ROWID的访问 基于主键的访问
顺序扫描返回所有的行 完全索引扫描返回所有行,并按主键顺序排列
普通表可以存储在簇中 索引组织表不能存储在簇中
支持分发、复制、分区 不支持分发、复制、分区
8,基于函数的索引
基于一个或多个列上的函数或表达式创建的索引
表达式中不能包含聚合函数(SUM、COUNT、AVG、MIN、MAX)
不能在LOB、REF或潜逃表列上创建
//例:创建基于函数的索引
SQL> conn system/manager; //不清楚为什么scott帐户没有权限创建基于函数的索引
SQL> create index idx_cityName on scott.citys(lower(vCityName));
//在今后的SELECT语句WHERE子句中 使用lower(vCityName) 条件时,就自动引用了上面的索引
9,键压缩索引
将索引键拆分为前缀项和后缀项
在一个索引块中,通过后缀项共享前缀项即可达到压缩的目的
节省磁盘空间
//创建键压缩索引的语法 CREATE INDEX index_name table_name(前缀项列,后缀项列) COMPRESS 压缩的列序号;
//例: job(职位)列中有大量重复数据,则压缩job(职位)列,即第1列
SQL> create index idx_emp on emp(job,ename) compress 1;
10,分区索引
索引存储在不同的分区中
分区索引的类型
本地前缀索引
本地无前缀索引
全局索引
全局前缀索引
全局无前缀索引