1. 常用增删查改等操作
类型 | 方式 |
数据库 | 创建数据库: create database database_name 删除数据库: drop database database_name |
表 | 创建新表: create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有表创建新表: Create table table_new like table_old; Create table table_new as select col1, col2 ... from table_old definition only; 注:definition only表示只定义无数据 删除表: drop table table_name; |
列 | 增加列: alter table table_name add column col type; 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 改变列属性: alter table table_name modify col type; |
主键 | 添加主键: Alter table table_name add primary key(col); 删除主键: Alter table table_name drop primary key(col); |
索引 | 创建索引: Create [unique] index index_name on table_name[col1, col2 ...]; 删除索引: Drop index index_name; 注: 索引的优点:加快数据检索速度;“唯一性索引”可保证数据记录唯一性;加快表的连接速度。 索引的缺点:本身占用空间;增删改数据时需要动态维护索引。 |
视图 | 创建视图: Create view view_name as select statement; 删除视图: Drop view view_name; |
基本sql | 选择: select * from table1 where 范围 插入: insert into table1(field1,field2) values(value1,value2) 删除: delete from table1 where 范围 更新: update table1 set field1=value1 where 范围 查找: select * from table1 where field1 like ’%value1%’--like的语法很精妙,查资料! 排序: select * from table1 order by field1,field2 [desc] 总数: select count(field1) as totalcount from table1 求和: select sum(field1) as sumvalue from table1 平均: select avg(field1) as avgvalue from table1 最大: select max(field1) as maxvalue from table1 最小: select min(field1) as minvalue from table1 |
外连接 | Left (outer) join: Select table_a.*, table_b.* from table_a left join table_b on table_a.col=table_b.col; Right (outer) join: Select table_a.*, table_b.* from table_a right join table_b on table_a.col=table_b.col; Full (outer) join: Select table_a.*, table_b.* from table_a full join table_b on table_a.col=table_b.col; Inner join: Select table_a.*, table_b.* from table_a inner join table_b on table_a.col=table_b.col; 注: 1. 外连接是相对内连接,其outer可以省略; 2. 内连接的inner可以省略用逗号表示,这时就是普通的双表联合查询; |
几个高级查询运算词 | UNION: Select col1, col2 ... from table1 union [all] Select col1, col2 ... from table2; INTERSECT: Select col1, col2 ... from table1 intersect Select col1, col2 ... from table2; EXCEPT: (oracle中用minus) Select col1, col2 ... from table1 except [all] Select col1, col2 ... from table2; 共同要求: 连接的两个结果集必须有相同的列数和列顺序,同时列的数据类型必须兼容。 |
Group by | SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name |
Between | Select * from table1 where col [not] between value1 and value2; |
In | Select * from table1 where col [not] in (value1, value2 ...); |
分页查询 | SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 注意,oracle的select语句中不能设置ROWNUM下限,即>=,因为oracle查询是从第一条开始根据结果递增,如果下限大于1则无法继续 |
2. oracle对误删表的恢复
1、从FLASHBACK TABLE里查询被删除的表
SELECT * FROM RECYCLEBIN ORDER BY DROPTIME DESC;
2.执行表的恢复
FLASHBACK TABLE TABLE_NAME TO BEFORE DROP;
或者FLASHBACK TABLE SCOTT.TEST TO TIMESTAMP TO_TIMESTAMP('2009-12-11 20:47:30','yyyy-mm-dd hh24:mi:ss');
看已删除表的历史情况:
SELECT * FROM FLASHBACK_TRANSACTION_QUERY WHERE TABLE_NAME='TEST';
看是否有数据:
SELECT * FROM SCOTT.TEST AS OF TIMESTAMP TO_TIMESTAMP('2009-12-11 20:53:57','yyyy-mm-dd hh24:mi:ss');
3. oracle死锁
类型 | 方法 | 说明 |
发现死锁 | select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object) | 如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明: Username:死锁语句所用的数据库用户; Lockwait:死锁的状态,如果有内容表示被死锁。 Status: 状态,active表示被死锁 Machine: 死锁语句所在的机器。 Program: 产生死锁的语句主要来自哪个应用程序。 |
查看死锁 | select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in (select session_id from v$locked_object)) | |
查找死锁的进程 | SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#, l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID; | |
kill掉这个死锁的进程 | alter system kill session ‘sid,serial#’; | 其中sid为上面的session_id |
如果还不能解决 | select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr; | 其中sid用死锁的sid替换: exit; ps -ef|grep spid 其中spid是这个进程的进程号,kill掉这个Oracle进程 |
4. 实例、用户、表空间、数据文件、临时数据文件、表
安装Oracle后会有默认的实例ORCL,可以不用再创建新的实例;
用户、表空间属于实例的逻辑概念,一个实例下的用户和表空间独立于其它实例。用户主要是权限上的考虑,表空间主要是数据文件存储上的考虑。
用户被授权于表空间,表空间在逻辑上整理了数据文件,数据文件只能属于某个表空间。
表可能分布在不同的数据文件中,表逻辑上归属于用户(同一表空间下不同用户可以有相同的表名),与表空间无关,所以当我们登录数据库的时候需要指定用户而不是表空间。
5. Oracle数据库优化
物理优化:
1). Oracle的运行环境(网络,硬件等)
2). 使用合适的优化器
3). 合理配置oracle实例参数
4). 建立合适的索引(减少IO)
根据记录量,索引也是很占空间的;删除标的部分记录时不会删除索引,只有记录全部删除才会删除索引。
5). 将索引数据和表数据分开在不同的表空间上(降低IO冲突)
6). 建立表分区,将数据分别存储在不同的分区上(以空间换取时间,减少IO)。表分区方式:记录字段的范围、时间、枚举取值、散列等方式分区。表分区应用场景:表大小超过2G;表中含历史数据、新数据增加到新的分区中。
逻辑优化:
1). 表拆分。可以对表进行逻辑分割,如中国移动用户表,可以根据手机尾数分成10个表,这样对性能会有一定的作用。
2). 绑定变量。Sql语句使用占位符语句,并且开发时候必须按照规定编写sql语句(如全部大写,全部小写等)oracle解析语句后会放置到共享池中。
如: select * from Emp where name=? 这个语句只会在共享池中有一条,而如果是字符串的话,那就根据不同名字存在不同的语句,所以占位符效率较好。
3). 存储过程。数据库不仅仅是一个存储数据的地方,同样是一个编程的地方,一些耗时的操作,可以通过存储过程等在用户较少的情况下执行,从而错开系统使用的高峰时间,提高数据库性能。
4). sql写法。尽量不使用*号,如select * from Emp,因为要转化为具体的列名是要查数据字典,比较耗时;使用Exits Not Exits 替代 In Not in ;
6). 事务处理。合理使用事务,合理设置事务隔离性。数据库的数据操作比较消耗数据库资源的,尽量使用批量处理,以降低事务操作次数。
重要说明:
数据库的垂直拆分和水平拆分。垂直拆分、是解决表之间IO的问题,将数据量太大的表放到单独的server上;水平拆分、是解决单表IO的问题,对数据量太大的单表根据字段特征进行拆分成多个表。
绑定变量的必要性:oracle的sql执行过程为:1.语法检查,判断sql拼写是否符合语法;2. 语义检查,判断合法权限下相关对象是否存在;3.语句解析,利用内部算法生成解析树及执行计划;4.执行sql,返回结果。其中第三步比较耗时,是根据内部算法看当前sql是否已在library cache中,如果在的话则省略了优化器的相关工作,这个在大量查询时很重要。
6. oracle几个自定义结构变量
类型 | 语法 | 描述 |
record | Type recordName is record( V1 data_ype [not null] [:=defaultValue]; V2 data_ype [not null] [:=defaultValue];) eg: declare type recordTest is record( var1 tableTest.volumn1%type, var2 tableTest.volumn2%type ); recordResult recordTest; begin select vol1, vol2 into recordResult from tableTest2; dbms_output.put_line(recordResult.var1); end; | 类似python中的元组,可以用来存储数据表的一行记录; |
varray | type varrayName is varray(size) of data_ype [not null] eg: declare type varrayTest is varray(5) of varchar2(64); varrayResult varrayTest; begin varrayResult := varrayTest('1', '2', '3', '4', '5'); for i in varrayResult.first .. varrayResult.last loop DBMS_OUTPUT.PUT_LINE(varrayResult(i)); end loop; end; | 类似c中的数组,成员支持下标取值,灵活易用; |
table | type tableName is table of data_ype [not null] index by [BINARY_INTEGER|PLS_INTEGER|VARRAY2] eg: declare type recordTest is record( var1 tableTest.volumn1%type, var2 tableTest.volumn2%type ); type tableTest is table of recordTest; tableResult tableTest; begin select vol1, vol2 into bulk collect tableResult from tableTest2; for i in tableResult.first .. tableResult.last loop dbms_output.put_line(tableResult.var1); end loop; end | 对record类型的扩展,支持多行数据,可以用来存储数据表的查询结果。 存储单列多行: type tableTest is table of varchar2(64); 存储多列多行和ROWTYPE结合使用: type tableTest is table of tableTest%rowtype; 存储多列多行和RECORD结合使用: Type tableTest is table of recordTest; |
7. 存储过程、函数、作业
存储过程:
create or replace procedure 存储过程名 (p1 in|out type, p2 in|out type) as|is
var1 type;
begin
null;
end;
函数:
create or replace function 函数名 (p1 type, p2 type) return type is
var1 type;
begin
null;
end;
二者的区别:
函数一定要有return返回值,存储过程没有;
函数可用在sql语句调用但不能单独执行,存储过程可以单独执行但不能用于sql调用;
此外二者在语法等方面,都基本相似。
作业:
variable test_job number;
begin
dbms_job.submit(:test_job,'test_procedure;',sysdate,'sysdate+1/1440');
end;
这里参数的解释:
job OUT binary_ineger:出参,唯一标识一个工作
What IN varchar2:表示被执行的代码块对象名
next_date IN date:初次运行此job的时间
interval IN varchar2:何时此job被重新运行
8.其它
oracle的导入导出非常耗内存;
oracle的排序对性能影响很大,如非必要就别排序;
表设计时,根据具体业务场景,不一定死扣范式;
外键的好处是提高数据质量,但坏处是增加了其它负担,而且需要注意一些问题,比如外键如果不加索引会有严重性能问题;
oracle字段在设计时顺序就确定了,对于访问频繁的字段最好放前面,对性能有好处;
数据类型在设计是一定要确定好,另外不要用char, long这些数据类型;
varchar2类型的长度,虽然不会影响实际记录数据的大小,但对于外部应用来说,是有影响的,比如weblogic等进程会根据类型长度预分配内存,这样可能导致这些进程的内存消耗过大;
表大分表、业务大分库,不过这些一般在设计阶段会容易些,因为没有数据负担;
主键不要有业务规则,主键仅标志记录唯一性即可,否则随业务膨胀会有影响;
转载于:https://www.cnblogs.com/PattonCCNU/p/6347645.html