delete,drop,truncate 都有删除表的作用,区别在于:
1)delete 和 truncate 仅仅删除表数据,drop 连表数据和表结构一起删除
2)delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,
3)执行的速度上,drop>truncate>delete
truncate:释放表空间,对外显示
truncate无法通过binlog回滚,会清空所有数据且执行速度很快。
DML 数据操纵语言:select、insert、update、delete
DDL 数据定义语言:create、truncate、drop、alter
DCL 数据控制语言:grant ... to .. revoke ... from
TCL 事务控制语言: commit、rollback
trunc(d,fmt):将日期保留到指定的精度,如果第二个参数缺失,相当于是dd,fmt可以是yyyy、mm、dd、hh24、mi、ss、day
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
nvl:nvl(string1, replace_with)
mod(m,n): m/n的余数
round(n,p): 四舍五入
length 长度、
lower小写、
upper大写,
to_date转化日期,
to_char转化字符
to_number转变为数字
ltrim/rtrim/trim(c): 去左/右/中 空格
substr(c,p,n):截取字符串,从p位开始截,包含p位,截取n位
add_month增加或者减掉月份、
在kettle的运行路径中,用文本编辑器打开Spoon.bat
将其中字段为:-Xmx1024m 加大最好是256的整数倍;
修改字段:MaxPermSize 最大值,运行时最大
修改默认缓存条数(默认为1万)
双击Transformation空白地方,会弹出一个界面,修改Nr of rows in rowset值:
黄色的锁:表示不论上一步是否执行成功,将会继续向下执行,下一步可以正常执行
绿色的对勾:表示只有当上一步的任务执行成功并且没有任何错误的时候才会执行下一步
红色停止:表示当上一个作业项的执行结果为假或者没有成功执行时,执行下一个作业项
双斜线:并行启动下一个条目,右键菜单launch next entries in parallel可以设置
贴源层:ODS (Operation data store) 直接接入源数据的:业务库、埋点日志、消息队列等
数据明细层:DWD(Data Warehouse Detail)业务层和数据仓库层的隔离层,保持和ODS层相同颗粒度,进行数据清洗和规范化操作:去空/脏数据、离群值等
数据中间层:DWM(Data WareHouse Middle)在DWD的基础上进行轻微的聚合操作、算出相应的统计指标、聚合之后会生成中间表
数据服务层:DWS(Data WareHouse Servce)在DWM的基础上,整合汇总成一个主题的数据服务层,汇总结果通常是宽表
数据应用层:ADS (Application data service)供数据分析和挖掘使用
宽表概念: 通常是指业务主题相关的指标、维度、属性关联在一起的一张数据库表。
优点:用户使用方便,通过一张表以及对应标签、维度的筛选就可以得到对应的数据。
缺点:如果遇到废弃字段、新增字段、修改逻辑等需求,数据开发人员维护成本较高。
拉链表概念:记录历史数据的每个状态,记录一个事物从开始,一直到当前状态的所有变化的信息;拉链表通常是对账户信息的历史变动进行处理保留的结果。”
非空(NOT NULL)约束:所定义的列不绝对不能为空;
主键(PRIMARY KEY)约束:唯一的标识表中的每一行;
唯一(UNIQUE)约束:每列字段的值不能相同;
外键(FOREIGN KEY)约束:用来维护从表与主表之间的引用完整性;
条件(CHECK)约束:表中每行都要满足该约束条件。
1、Oracle是大型数据库,而MySQL是中小型数据库。
2、Oracle的内存占有量非常大,而mysql非常小
3、MySQL支持主键自增长,指定主键为auto increment,插入时会自动增长。Oracle主键一般使用序列。
优点:查询速度读取快。
建立索引可以加快表与表之间的连接
缺点:占内存,插入数据变慢。
创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长
优点:
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点:
分区表相关,已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。
外表数据量大,内表数据量小可使用 in ( in 可以理解为一个子查询,会先全表扫描再根据条件匹配)
外表数据量小,内表数据量大可使用 exists( exists 是匹配每行数据匹配上才满足条件)
第一范式:
1.要有主键。
2.列不可分。
第二范式:不存在部分依赖
非主键的字段不依赖于非主键字段或者部分主键(两个字段合并成主键)的字段。
遇见 1 的情况,需要将该表分割成多表。
第三范式:不能存在传递依赖,不是主键的任何其他字段必须直接依赖于主键。
内存结构、进程结构、存储结构
内存结构主要由SGA和PGA构成;
进程结构主要由用户进程和ORACLE进程组成;
存储结构主要由逻辑存储和物理存储构成。
SGA系统全局区是Oracle Instance的基本组成部分,在实例启动时分配。是一组包含一个Oracle实例的数据和控制信息的共享内存结构。主要是用于存储数据库信息的内存区,该信息为数据库进程所共享(PGA不能共享的)。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
PGA是一块包含一个服务进程的数据和控制信息的内存区域。你每启动一个数据库进程就会在内存中创建一个pga,它是独有的,非共享。
排名 rank() over(partition by 重复字段 order by )
dense_rank() over(partition by 重复字段 order by)
分页/去重 row_number() over(partition by 重复字段 order by )
累计 sum() over(parition by order by )
同期/上期/环比 lag( 列,n) over(parition by order by )
lead(列,n) over(parititon by order by )
逗号拼接 wm_concat listagg
delete from project a
where a.rowid>(select min(b.rowid) from project b where b.ID=a.ID);
(1)SELECT子句中避免使用 ' * '
(2)使用索引提高效率,避免在索引列上使用计算
(3)使用EXISTS替代IN、用NOT EXISTS替代NOT IN
(4)用UNION替换OR
(5)少用 <> 操作符(不等于)、!= 、 not
(6)WHERE子句的连接顺序:要将过滤掉最大数量记录的条件必须写在WHERE子句的末尾
(7)清空表用TRUNCATE,删除部份行用DELETE
分类:唯一索引、主键索引、聚集索引
优点:1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
1.索引应该建立在WHERE子句中经常使用的列上。如果某个大表经常使用某个字段进行查询,并且检索的啊行数小于总表行数的5%,则应该考虑在该列上建立索引。
2.对于两个表连接的字段,应该建立索引。
3.如果经常在某表的一个字段上进行Order By的话,则也应该在这个列上建立索引。
4.不应该在小表上建立索引。
什么是存储过程?
简单理解,事先创建了一个函数,当需要使用的时候,可以直接调用,无需再重复写sql语句了。
如何使用存储过程?
使用存储过程需要:1)定义存储过程 2)使用已经定义好的存储过程
无参数的存储过程:create procedure <存储过程名称>()begin
3.Oracle是怎样分页的:
Oracle用rownum进行分页
a.最内层sql,查询要分页的所有数据
b.第二层sql,通过rownum伪列确定显示数据的上限,并且给查询的数据添加rownum伪列的值
c.最外层sql,设置显示数据的下限功能:接受参数;调用另一过程;返回一个状态值给调用过程或批处理,指示调用成功或失败;返回若干个参数值给调用过程或批处理,为调用者提供动态结果;
优点:效率高,极大地改善SQL语句的性能、复用性高(只在创造时进行编译,以后每次执行存储过程都不需再重新编译)、安全性高、分布式工作
缺点:调试麻烦(没有像开发程序那样容易)
可移植性不灵活(因为存储过程依赖于具体的数据库)
匿名块
declare
begin
end;
create or replace procudure P_NAME( I_NAME IN TYPE,O_NAME2 OUT TYPE)
is/as
begin
end;
create or replace function F_NAME(I_NAME IN TYPE)
return type
is/as
begin
exception when others then
rollback;
--错误日志
commit;
end;
kettle 是纯 java 开发,开源的 ETL工具,用于数据库间的数据迁移。可以在 Linux、windows、unix 中运行。有图形界面,也有命令脚本还可以二次开发。
因为kettle是用java代码编写的,java代码中的jdbc可以根据不同的jar包连接数据库。
Ltrim
返回不带前导(light)空格的字符串副本
Rtrim
返回不带后续(right)空格的字符串副本
Trim
返回不带前导和后续空格的字符串副本
A程序执行了对 tableA 的 insert ,并还未 commite时,B程序也对tableA 进行insert 则此时会发生资源正忙的异常 就是锁表
锁表常发生于并发而不是并行(并行时,一个线程操作数据库时,另一个线程是不能操作数据库的,cpu 和i/o 分配原则)
为什么要引入锁:当多个用户同时对数据库的并发操作时会带来以下数据不一致的问题
分类:从数据库管理的角度对锁进行划分:共享锁,排它锁
共享锁:对同一个数据,多个读操作可以同时进行,互不干扰
排他锁:如果当前写操作没有完毕,则无法进行其他操作
按粒度划分:行锁、页锁、表锁
查看是否锁表
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;
解锁
alter system kill session '628,63405';
利用“alter database datafile 表空间位置 resize 大小”增加表空间大小;
用“alter tablespace 表空间名 add datafile 数据文件地址 size 数据文件”增加表空间大小
第一步:查看表空间的名字及文件所在位置:
select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name
第二步:增大所需表空间大小:
方法一:
alter database datafile '表空间位置'resize 新的尺寸
例如:
alter database datafile '\oracle\oradata\anita_2008.dbf' resize 4000m
方法二:增加数据文件个数
alter tablespace 表空间名称add datafile '新的数据文件地址' size 数据文件大小
例如:
alter tablespace ESPS_2008 add datafile '\oracle\oradata\anita_2010.dbf' size 1000m
方法三:设置表空间自动扩展。
alter database datafile '数据文件位置' autoextend on next 自动扩展大小maxsize 最大扩展大小
例如:
alter database datafile '\oracle\oradata\anita_2008.dbf' autoextend on next 100m maxsize 10000m
create or replace trigger 触发器名
before|after insert|update|delete on 表名
for each row()
declare
begin
end;
包头
procudure P_NAME( I_NAME IN TYPE,O_NAME2 OUT TYPE)
包体
procudure P_NAME( I_NAME IN TYPE,O_NAME2 OUT TYPE)
is/as
begin
end;
隐式游标
insert
select;
update
delete
显示游标
reate or replace procedure p_cursor as
---statment:cur_emp
cursor cur_emp is
select * from emp;
v_emp_1 emp%rowtype;---和emp表具有相同的列及对应的数据类型
begin
open cur_emp;
loop
fetch cur_emp
into v_emp_1; --获取每一行记录给v_emp
exit when cur_emp%notfound;--游标的行如已获取完则推出循环
dbms_output.put_line(v_emp_1.empno);
end loop;
close cur_emp;
end;
25、truncate、delete 清空oracle自增序列
使用truncate,表中的记录全部被清除,如果向表中插入数据,那么数据的排序是从1开始的。
如果使用的是delete,那么记录的排序值不会被清除,它是一次累加上去的