启动SQL*PLUS工具
Cmd ->sqlplus /nolog
Conn system/manager
Desc 表名 查看表结构
Column 列名 for 9999 格式化列
Column 列名 for a99 格式化
List查看缓存区的指令;
Del 清除缓存区最后一行
Run 或者/查看运行缓存区指令。
Set line 120 设置整个命令行宽度为120个字符
SET PAGESIZE 20 设置每页显示20行
Save d:\select _emp.sql 保存脚本文件
@ d:\select _emp.sql 运行脚本文件
Edit d:\select _emp.sql 编辑脚本文件
get d:\select _emp.sql 查看脚本文件
spool d:\d.sql
spool spool off 把命令输出指定的文件中
Structured Query Language
分类
1. 数据查询
2. 数据操作 DML
3. 数据定义 DDL
CREATE ALTER DROP RENAME TRUNCATE
4. 事务控制 COMMIT ROLLBACK
5. 数据控制 DCL grant revoke
CASE 表达式用于逻辑判断
DECODE 函数跟CASE表达式具有相同的功能
SQL>SELECT ename,job,sal, DECODE(JOB,’SALESMAN’,1.20*sal,
‘MANAGER’,1.30*sal,
‘ANALYST’,1.40*sal,
sal
)
LAST_Salary
FROM emp
ORDER BY job;
SQL字符型单行函数
LOWER() 把字符变为小写
Upper()大写转换
INITCAP 把首个字母大写
CONCAT 连接字符串
INSTR(‘MY NAME IAS NS’,’MY’) 搜索字符的位置
LPAD() RPAD() 查询结构后用字符补充
Substr(‘my nasdf is sdfsdf’,12) 截取字符串
Length()字符串的长度
Replace() 替换函数
TRIM()
Round() 四舍五入的规则
Mod() 求余数
日期函数
ALTER SESSION SET NLS_date_lanauage=’amercan’;
Sysdate函数
MONTHS_BETWEEN()
ADD_MONTHS
NEXT_DAY(date,string)
LAST_DAY(date)
AVG,SUM,MAX, MIN ,count ,distinct
NVL(COL,0)
NVL2(EXPR1,EXPR2,EXP3)
内存:内存是否满足Oracle实例SGA的要求
磁盘分配对数据文件控制文件和重做日志文件的大小评估
数据库文件分布 对于存在竞争的数据文件放在不同的磁盘上,以免I、O竞争,如重做日志文件和归档日志文件就不应该放在同一个磁盘对于控制文件要进行多路复用Oracle要求将多个控制文件放在不通的磁盘设备上
创建数据库 DBCA
Sqlplus /nolog
Conn /as sysdba
startup
Create database 指令
在安装数据库软件的时候创建
第六章管理和维护表
Varchar2(size) 存储变长的字符数据,大小不固定的
Nvarchar2() 不同之处在于支持全球化数据类型支持定长和变长的字符集
Char(size) 定长字符类型
Rowid()前6位 AAAQ +h表示数据对象号
接着3位 AAE表示相对文件号
接着6位AAAAAO为块号
最后3位为行号
SQL>select owner ,table_name,tablespace_name
From dba_tables
Where owner=’SCOTT’
创建临时表
Create global temporary table Emp_temporary On commit preserve rows As Select * from emp Where job=’MANAGER’;
|
临时表别的用户是无法访问的。
维护列
SQL>ALTER TABLE SCOTT.EMPLOYEES ADD ( DEGREE VARCHAR2(10) ); |
修改列
SQL>ALTER TABLE scott.employees Modify( Degree varchar2(10) not null ); |
删除列
SQL>ALTER TABLE scott.employees drop column degree; |
删除表
SQL> TRUNCATE TABLE TEST;
表被截断。 SQL> drop table test 2 ; 表已删除。 |
对于一个很大的表而言,每次搜索时对全表扫描很耗时间,Oracle允许对一个表进行分区。把达标分解为更容易管理的区分块。按照不通的规则将表分布在不同的磁盘上。
1. 范围分区 range partitioning
SQL> conn system/manager 已连接。 SQL> create table Sales_range( 2 Salesman_id number(5), 3 Salesman_name varchar2(30), 4 Sales_amount number(10), 5 Sales_date date) 6 partition by Range(Sales_date)( 7 partition sales_jan2008 values less than(to_date('02/01/2008','MM/DD/YY')),
8 partition sales_feb2008 values less than(to_date('03/01/2008','MM/DD/YY')),
9 partition sales_mar2008 values less than(to_date('04/01/2008','MM/DD/YYYY') ), 10 partition sales_apr2008 values less than(to_date('05/01/2008','MM/DD/YYYY') )) 11 ;
表已创建。 |
按照Sales_date字段分区。 Values less than指定什么样的数据放在什么样的分区中。
2.列表分区
显示的把数据行映射到各个分区,这些分区的定义中指定了一个由分区键离散值的列表。
SQL> create table sales_list( 2 Salesman_id number(5), 3 Salesman_name varchar2(30), 4 Sales_state varchar2(20), 5 Sales_amount number(10), 6 Sales_date date) 7 partition by list(sales_state)( 8 partition sales_west values('California','Hawaii'), 9 partition sales_east values('New Yor','Virginia','Florida'), 10 partition sales_centralt values('Texas','Tllinois'), 11 partition sales_other values(default) 12 ) 13 ;
表已创建。 |
该分区表有4个分区块,键值sales_state用来把不通的数据行映射到相应的分区表中。
静态动态数据字典表
查询数据库的名字和创建时间 SQL> select name ,created from v$database;
NAME CREATED --------- -------------- ORCL 20-6月 -12 |
查询主机名和实例名
SQL> col host_name for a20; SQL> run; 1* select host_name,instance_name,version from v$instance
HOST_NAME INSTANCE_NAME VERSION -------------------- ---------------- ----------------- CSSTSTEP-ZHOU orcl 11.1.0.6.0 |
查看控制文件的配置
SQL> run; 1* select status,name from v$controlfile
STATUS NAME ---------- -------------------------------------------------- D:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL D:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL02.CTL D:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL03.CTL |
查询重做日志配置
SQL> select group#,members,status,archived from v$log;
GROUP# MEMBERS STATUS ARC ---------- ---------- ---------- --- 1 1 INACTIVE NO 2 1 CURRENT NO 3 1 INACTIVE NO |
查询数据文件
SQL> run; 1* select file_id,file_name,tablespace_name from dba_data_files
FILE_ID FILE_NAME TABLESPACE ---------- -------------------------------------------------- ---------- 4 D:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF USERS 3 D:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1 2 D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF SYSAUX 1 D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF SYSTEM 5 D:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLE |
查询表空间信息
SQL> select tablespace_name,block_size,contents from dba_tablespaces;
TABLESPACE BLOCK_SIZE CONTENTS ---------- ---------- --------- SYSTEM 8192 PERMANENT SYSAUX 8192 PERMANENT UNDOTBS1 8192 UNDO TEMP 8192 TEMPORARY USERS 8192 PERMANENT EXAMPLE 8192 PERMANENT
已选择6行。 |
SQL> conn /as sysdba; 已连接。 SQL> grant create view to scott; SQL> run; 1 create view accounting_view as 2 select e.ename "employee_name",e.job "job",e.hiredate "hiredate", 3 e.sal "salary" ,d.dname "dep_name" 4 from dept d,emp e 5 where e.deptno=d.deptno 6 and 7* d.deptno<20
视图已创建。 |
查询视图信息
SQL> select view_name from user_views;
VIEW_NAME ------------------------------ ACCOUNTING_VIEW
SQL> select text from user_views where view_name='ACCOUNTING_VIEW';
TEXT ------------------------------------------------------------------------------
select e.ename "employee_name",e.job "job",e.hiredate "hiredate", e.sal "salary" |
WITH READ ONLY 子句
设置只读视图不能修改和增加视图数据
WITH CHECK OPTION
插入数据的视图约束
事务
事务是一个逻辑工作单元。ACID特性
COMMIT显示事务控制
ROLLBACK实现事务控制
异常退出对事务的影响
AUTOCOMMIT实现自动提交
SQL> set autocommit on; SQL> set autocommit off; |
SQL> run; 1 select ename ||'的雇佣日期是:' || hiredate 2* from emp
ENAME||'的雇佣日期是:'||HIREDATE -------------------------------------- SMITH的雇佣日期是:17-12月-80 ALLEN的雇佣日期是:20-2月 -81 WARD的雇佣日期是:22-2月 -81 JONES的雇佣日期是:02-4月 -81 MARTIN的雇佣日期是:28-9月 -81 BLAKE的雇佣日期是:01-5月 -81 CLARK的雇佣日期是:09-6月 -81 SCOTT的雇佣日期是:19-4月 -87 KING的雇佣日期是:17-11月-81 TURNER的雇佣日期是:08-9月 -81 ADAMS的雇佣日期是:23-5月 -87 JAMES的雇佣日期是:03-12月-81 FORD的雇佣日期是:03-12月-81 MILLER的雇佣日期是:23-1月 -82 |
查询加别名
SQL> run; 1 select ename ||'的雇佣日期是:' || hiredate "员工雇佣日期查询" 2* from emp
员工雇佣日期查询 -------------------------------------- SMITH的雇佣日期是:17-12月-80 ALLEN的雇佣日期是:20-2月 -81 WARD的雇佣日期是:22-2月 -81 JONES的雇佣日期是:02-4月 -81 MARTIN的雇佣日期是:28-9月 -81 BLAKE的雇佣日期是:01-5月 -81 CLARK的雇佣日期是:09-6月 -81 SCOTT的雇佣日期是:19-4月 -87 KING的雇佣日期是:17-11月-81 TURNER的雇佣日期是:08-9月 -81 ADAMS的雇佣日期是:23-5月 -87 JAMES的雇佣日期是:03-12月-81 FORD的雇佣日期是:03-12月-81 MILLER的雇佣日期是:23-1月 -82
已选择14行。 |
DISTINCT 该列的输入是唯一的。
连接查询
乘机连接
相等连接
自连接
不等连接
外连接
子查询
Where 条件语句
HAVING子句单行子查询
用来限制分组函数
SQL> run; 1 select job,min(sal),avg(sal),max(sal) 2 from emp 3 group by job 4* having avg(sal)>2000
JOB MIN(SAL) AVG(SAL) MAX(SAL) --------- ---------- ---------- ---------- PRESIDENT 5000 5000 5000 MANAGER 2450 2758.33333 2975 ANALYST 3000 3000 3000 |
ALL子查询
SQL> run; 1 select ename,job,sal 2 from emp 3 where sal >=all( 4 select avg(sal) 5 from emp 6 group by job 7 ) 8*
ENAME JOB SAL ---------- --------- ---------- KING PRESIDENT 5000 |
Any子查询
SQL> select ename ,job,sal 2 from emp 3 where sal >any( 4 select avg(sal) 5 from emp 6 group by job 7 );
ENAME JOB SAL ---------- --------- ---------- KING PRESIDENT 5000 FORD ANALYST 3000 SCOTT ANALYST 3000 JONES MANAGER 2975 BLAKE MANAGER 2850 CLARK MANAGER 2450 ALLEN SALESMAN 1600 TURNER SALESMAN 1500 MILLER CLERK 1300 WARD SALESMAN 1250 MARTIN SALESMAN 1250 ADAMS CLERK 1100
已选择12行。 |
建立索引不用全表扫描,可以适当的减少磁盘I/O
对于具有只读特性或者较少的插入,更新或者删除操作的大表通常可以提高查询速度
可以对表的一列或者多列建立索引
建立索引的数量没有限制
索引需要磁盘存储。由Oracel自动维护
索引对用户透明
创建索引的语法:
CREATE [UNIQUE|BITMAP] INDEX [SCHEMA.] INDEX_NAME –UNIQUE 说明该索引是唯一的索引 BITMAP:创建位图索引
ON [SCHEMA.] TABLE_NAME
(COLUMN_NAME [DESC]ASC[,COLUMN_NAME[DESC]ASC])….) --说明创建的索引为降序或者升序排序
[REVERSE] –REVERSE 说明创建反向键索引
[TABLESPACE TABLESPACE_NAME] 说明要创建的索引所存储的表空间
[PCTFREE N]—索引块中预先保留的空间比例
[INITRANS N]—每一个索引块分配的事务数
[MAXTRANS N]---每一个索引块分配的最多事务数
[INSTORAGE STATE]—说明索引中区段EXTENT如何分配
[LOGGING|NOLOGGING] –说明要记录|不记录索引相关的操作,并保存联机重做日志中
[NOSORT] 不需要在创建索引时再按键值进行排序
创建索引 INDEX exp:
SQL> create index emp_enam_idx 2 on emp(ename) 3 ;
索引已创建。 |
查询索引
SQL> select index_name,index_type,tablespace_name from user_indexes
SQL> ;
INDEX_NAME INDEX_TYPE TABLESPACE_NAME -------------------- ---------- -------------------- PK_EMP NORMAL USERS EMP_ENAM_IDX NORMAL USERS PK_DEPT NORMAL USERS |
用户必须建立单独的表空间来存储索引
SQL> create tablespace index_tbs 2 datafile 'd:/index_tbs' 3 size 100m 4 autoextend on ;
SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME -------------------- SYSTEM SYSAUX UNDOTBS1 TEMP USERS EXAMPLE INDEX_TBS
已选择7行。 |
创建符合索引(多列索引)
SQL> run; 1 create index emp_ename_sal_idx 2 on scott.emp(ename,sal) 3 tablespace index_tbs 4*
索引已创建。
SQL> select index_name ,table_name,tablespace_name from user_indexes 2 where index_name like 'EM%' 3 ;
INDEX_NAME TABLE_NAME TABLESPACE_NAME -------------------- ------------------------------ -------------------- EMP_ENAME_SAL_IDX EMP INDEX_TBS |
查询列上的索引信息 user_ind_columns
SQL> run; 1 select index_name,table_name,column_name 2 from user_ind_columns 3* where index_name like 'EMP%'
INDEX_NAME TABLE_NAME COLUMN_NAME -------------------- ---------- -------------------- EMP_ENAME_SAL_IDX EMP ENAME EMP_ENAME_SAL_IDX EMP SAL |
B树索引
创建位图索引
SQL> create bitmap index emp_job_bitmap_idx 2 on emp(job); SQL> select index_name,index_type,table_name,status from user_indexes;
INDEX_NAME INDEX_TYPE TABLE_NAME STATUS -------------------- --------------------------- ---------- -------- PK_EMP NORMAL EMP VALID EMP_ENAM_IDX NORMAL EMP VALID EMP_JOB_BITMAP_IDX BITMAP EMP VALID PK_DEPT NORMAL DEPT VALID |
反向键索引
SQL> create index emp_sal_reverse_index 2 on emp(sal) 3 reverse;
索引已创建。 SQL> select index_name,index_type,table_name from user_indexes;
INDEX_NAME INDEX_TYPE TABLE_NAME -------------------- --------------------------- ---------- PK_EMP NORMAL EMP EMP_ENAM_IDX NORMAL EMP EMP_JOB_BITMAP_IDX BITMAP EMP EMP_SAL_REVERSE_INDE NORMAL/REV EMP X
PK_DEPT NORMAL DEPT |
创建UPPER函数索引
SQL> create index dept_dname_idx 2 on dept(upper(dname)) 3 ;
索引已创建。 |
对索引的监控
SQL> alter index EMP_JOB_BITMAP_IDX 2 monitoring usage; --启动监控
SQL> select job from emp; --查询使用到了索引
JOB --------- ANALYST ANALYST CLERK CLERK CLERK CLERK
SQL> alter index EMP_JOB_BITMAP_IDX --关闭监控 2 nomonitoring usage;
索引已更改。
SQL> select index_name ,table_name,monitoring,used from v$object_usage;
INDEX_NAME TABLE_NAME MON USE -------------------- ---------- --- --- EMP_ENAM_IDX EMP YES NO EMP_JOB_BITMAP_IDX EMP NO YES --说明索引有使用到 |
重建索引
SQL> alter index emp_enam_idx 2 rebuild 3 ;
索引已更改。 |
重建并迁移其表空间
SQL> alter index emp_enam_idx 2 rebuild 3 tablespace index_tbs1; |
索引的维护
通过rebuild修改索引参数
SQL>alter index emp_job_bitmap_idx Rebuild Pctfree 30 Storage (next 100k) ;
|
手工增加磁盘空间
SQL>alter index emp_job_bitmap_idx Allocate extent; |
合并索引碎片
SQL>alter index emp_job_bitmap_idx coalesce; |
删除索引
SQL> drop index emp_enam_idx;
索引已删除。 |