(脑图文件的分享,本意是方便大家,但是积分资源变成平台收割的途径,如有需要,可私信)
oracle
基础操作
DML
插入
-
single table insert
insert into… values…
一次不能插入多行
insert into … select from…
multi table insert
- insert all,分为有条件插入和无条件插入,可以有else子句,同一个when可以被多个into使用
更新
-
update
更新单行
单行单列
update table set column = … where…
单行多列
update table set col1=…,col2=…, where…
可以对被更新的每一列单独使用不同子查询
update set can modify multiple rows based on multiple conditions on a table
update table set (select … from …)
更新多行
- update table set col1=…(即没有where条件)
删
-
delete
dml,可使用rollback撤销回滚
- 可以使用where指定要删除的行
- 清空表数据
cascade:级联删除时使用
DDL
改
-
alter table
重命名一张表/列名/列字段类型;新加列
alter table add/drop/modify column 列名 (字符类型)(单列,需要加上column)
-
alter table add/drop/modify (列名1,列名2…) (多列)
-
为表中一组数据行加锁
-
启用或禁用表上的约束
-
drop column
不能将所有列同时drop掉,会报错
set unused(列名)
- unused:由于对大表drop column很耗时,可以先用 set unused逻辑删除,等找到时间窗口再做物理删除;set unused的列仍被计算在每张表的前1000列
增
- create table
外表
create table cost ( cost_id number(2), credit_limit number(10) ) organization external (type **** default directory *** location(‘***.csv’))
- type: 数据转换驱动器,默认为oracle_loader/oracle_driver
- location: 指定外部表所在文件夹以及指定文件
- create table as select语句可以从外表中upload数据到数据库里的regular table
- data,metadata存储位置,都在数据库外❌
- 默认的reject limit对于外表来说是unlimited❌
- oracle_loader/datapump在外表里有相同的功效❌
临时表
- global temporary table,分为事务级、会话级;事务级只对当前事务有效,on commit delete rows;会话级只对当前会话有效,on commit preserve rows
删
-
truncate
不可以通过rollrack撤销
- 不可以使用where指定要删除的行
- ddl语句,隐式提交
- 只删除表中数据,保留表结构及其列、约束、索引等,新行计数值重置
drop
- drop index/table/database (表上定义的所有索引/约束被drop)
purge
- 对回收站中的表执行清除
函数
聚合函数
-
group by。。。having 聚合函数 条件
-
count
count(*,1,常量),不忽略null,每个null计数加1
- count(column/distinct column)忽略null
max min
- 可以在char类型的列上使用
avg
- 忽略null值,而不是将其作为 0 处理。
sum
- 忽略NULL值
日期函数
-
date类型加减法
date-date=number
group by (date1 – date2),可以成功执行
date-number=date
date比较,大于“>”,小于“<”
CURRENT_DATE,返回date类型
- 时区敏感,返回基于session时区的当前日期returns the current date in the session time zone
current_timestamp,返回timestamp类型
- 返回session时区的日期和时间
sysdate,返回date类型,格式默认值包含日期
to_date(c, fmt)
- 将char、varchar、varchar2、nchar、nvarchar2转换为date类型
to_char(datetime,fmt),第一个参数为date或其他日期类型
ADD_MONTHS(d,i),d可以为date或可隐性转换为date的值,i为整数或可隐性转换为整数的值
date与字符常量直接比较时,字符串格式需与date默认格式相同
替换函数
-
NVL(str1,replace_with)如果str1为NULL,则替换为replace_with返回结果==ISNULL(str,x)
-
NVL2(str1,replace_with1,replace_with2)如果str1为NULL,则回replace_with1,否则返回replace_with2
-
COALESCE(expression, value1, value2, …)判断expression是否为null,若不为null则返回expression,否则返回后续第一个不为null的value
应用:几个表合并,都有id,但是不一定相同。coalesce(a,id,b.id,c.id)取出表中所有的id
NULLIF(exp1,exp2),若exp1与exp2相等,则返回null,否则返回exp1,返回类型与exp1相同,exp1不能为null
replace:replace(原字段,“原字段旧内容”,“新内容”),返回新内容
合并函数(a 函数 b)
- union并集,去重
select t.* from (sql1 union all sql2) t order by t.time desc - 第二个select返回的每一列的data type group必须与第一个select返回的data type group一致
- union all 会保留重复值,不去重
- intersect交集
- minus,a minus b, 取a有b没有的
截取函数
-
ROUND(number[,decimals]):decimal指明需要保留的小数点后位数,被截断的数据要四舍五入;decimals为负数时指明截取到小数点左边的整数的位数
-
TRUNC(x[,y]):返回x按精度y截取后的值,y>0时,x保留y位小数,y<0时,x截取到小数点左边第y位(被截取部分用0代替);y不为整数时只有整数部分有效。
可以用于numer,date,timestamp
ceil(n) :取≥n的最小整数(向上取整)。e.g:ceil(1.5)=2,ceil(-1.5)=-1
floor(n):取≤n的最大整数(向下取整)。e.g:floor(1.5)=1,floor(-1.5)=-2
substr:substr(string, start, length),返回string从开始位置start截取,length的部分字符串start为负数时,从倒数第几位开始向后截取
trim:用来去除一个字符串的开头或结尾(或两者)的字符,字符只能为单个字符,TRAILING 参数指定去除结尾字符
而ltrim和rtrim可以去除多个字符
- 示例:SQL> SELECT trim(trailing ‘2’ from ‘213dsq12’) FROM dual; (213dsq1)
连接函数
-
join
inner join
-
self join:自连接,可以是inner join,可以是 left outer join
-
left join
right joinA left join B on …and…,and后条件只对B进行过滤,A不受影响
- left join on where,where条件会对A B联合后的临时表进行过滤
外链接可以用于两个表有多个链接条件时
非等值连接:non-equijoin
- where a.col between b.low_col and b.high_col
<>,<,>,like,>=,<=
cross join
- 交叉连接,笛卡尔积
merge
排序函数
-
row_number() over e.g. 1,2,3,4,5,6
-
rank over e.g. 1,1,3,4,4,6
-
dense_rank over e.g. 1,1,2,3,3,4
-
order by
oracle默认为 null 最大。
- 升序排列,默认情况下,null值排后面。
- 降序排序,默认情况下,null值排前面。
字母大小写
- INITCAP:单词中的第一个字符将转换为大写字母,其余所有字符转换为小写字母
- UPPER: 全大写,e.g.UPPER(‘Mc%’)
like :
- like“Mc%” OR like “MC%“. (like ‘Mc%’ or ‘MC%’ 写法是错的)
- 通配符:% –
- 下划线-:1个字符
exist /in
- exist:for 循环处理
- in:子查询
- in(q,b,c) 和 =a or =b or =c,2个查询的performance no change
all\\any\\some
-
any\\some等价:满足查询结果的任意一个
where cost=any(),等价于where cost in()
all:满足所有查询结果
- e.g.where cost<all(select max(cost) from t1 group b c1)
比较运算:=,>,<,<>
single-row function
- can be nested to any level
- 参数可以是列名,变量,字面值,或表达式
- 返回的数据类型可能与参数数据类型不一致
执行顺序
-
insert all when into
不管其他条件的判断结果,所有记录都会进行when的判断
insert any
case when
- 先筛选第一个条件,不符合的会进行第二个条件的筛选
fetch
-
使用这个子句去指定返回行的个数或者返回行的百分比
-
[ FETCH { FIRST | NEXT }[ { rowcount | percent PERCENT } ]
{ ROW| ROWS } { ONLY | WITH TIES } ]指定only会返回明确的行数或者是百分比的行数
- 如果指定with ties子句,那么拥有和最后一行相同的排序键值的行都会被fetch。并且此时必须指定order by 。如果没有指定order by,那么不会有附加的行被返回
- 在order by之后使用
listagg…within group (order by …)
- 多行合并为一行
decode
- decode(exp1,con1,value1,con2,value2…default,value0)
- 判断exp1,若exp1==con1,则返回value1,否则继续向后判断exp1=con2…直到找到相等条件;若exp1与此后所有con都不想等,则返回default对应的value0;若未定义default,则返回null
主键&索引
键
- unique key:唯一约束,允许null值,可以有多个,可以是复合字段,如果null+非null字段重复,也会报错。
- primary key:主键,不为null,只能有一个,可以是复合字段
可以直接创建create table(c1 varchar(10) primary key) - foreign key:外键,允许null值,可以有多个外键
- Partition key:指定为分区键的列不能被drop
- constraint:纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。
index: 存储在数据库中的一个物理结构,
创建主键或唯一约束时,会自动创建唯一性索引,反之不成立。
外键不会自动创建索引, 须关联一个唯一性索引(主键或唯一约束)
索引
- 唯一索引可以被改为非唯一索引
- 唯一索引和非唯一索引不能出现在同一列上
- 递减索引是一个 function-based 类型索引
- create table时可以创建索引/主键
- 属于用户a的表可以拥有属于用户b的 索引
- 更新表会导致表的任一或所有索引的更新
- CREATE INDEX index_name ON table_name (column_name)
- union index和 non-union index可以在同一列创建
数据类型
类型转换
-
显性转换
函数
1.日期->字符:to_char(date,’yyyy-mm-dd’)
-
2.字符 -> 日期:to_date(string,’yyyy-mm-dd’)
-
3.字符 -> 数字:to_number(“123”)
-
4.数字 -> 字符:to_char(123)
to_char(1234,\”$99,99”):如果格式的位数不如数字的位数多,会返回’#’;
被截取的字符需四舍五入
场景
- anydate > date’01-02-2018’
(写成’01-Feb-2018’可以隐性转换)
隐性转换
- ||,concat (拼接,只能拼string):number/date->string
日期
-
timestamp:timestamp包含年、月、日,时分秒 毫秒的信息
-
timezone
DBTIMEZONE函数返回与UTC的偏移
- SESSIONTIMEZONE 函数返回与UTC的偏移
系统自带日期
- current_date返回当前会话时间
interval year to month 类型:支持年份间隔
- interval ‘123-2’ year(3) to month:123年2隔越月,year(3)表示年的精度为3位,默认为2
interval day to second:存储两个TIMESTAMP之间的时间差异
- 单位可为day、hour、minute、second
日期只能进行加、减运算
数值
-
number(a,b),总共数字长度是a,其中b位是小数
插入的整数位个数<= a-b。e.g.numer(5,2),1234.5会报错
- 插入的小数位可任意多个,多余小数四舍五入
字符串
- char类型:不需要指定长度
- varchar :汉字算2个字符
- Nvarchar :汉字算1个字符
bfile类型:
- 在操作系统文件中存储非结构化的二进制数据
BLOB类型:
- 在数据库中存储非结构化二进制数据
其他
view视图
-
是否有段?是否有 object number?是否可以join tables?
视图如果是可更新视图,则可以支持insert,且insert后如view被drop,插入的记录会保留在相应表中
- 只有同一个schema下的表才能在视图中join
- 视图没有segment(段)
使用with check 子句可以阻止固定行被更新或插入,即不满足视图定义时where条件的数据无法更新或插入(如果视图定义包括条件(譬如 WHERE 子句)并且其意图是确保任何引用该视图的 INSERT 或 UPDATE 语句都应用 WHERE 子句)
视图可以不需要重新授权就完成更新
- create or replace语句,无需先drop再create,保留现有权限
DML
不可执行DML的条件
拥有组函数
定义 有group by
在使用了group by定义的视图上,通过视图执行delete/insert一行或多行数据会报错
定义有rownum伪列
不可update的其他条件
- 列定义为表达式
不可insert的其他条件
- 列定义为表达式
synonym同义词
- 可以认为是对表、视图、序列、存储过程、函数、程序包或者其他同义词的一个别名
- 同义词也可以拥有同义词
- sequence可以拥有同义词
- 同义词拥有一个object number
- 所有用户都可以访问到
- 一个用户可以创建属于另一个用户的对象的同义词
- 不是所有用户都可以创建public 同义词
sequence序列
- 步长 increment by,初始值 start with,最大值 maxvalue ,达到最大值后是否循环从头开始 cycle/nocycle,nocycle时达到最大值后新申请值会报错,cache改善性能
- sequence 不保证不产生重复值
- 字段默认值为sequence.nextval时,插入数据的用户需有对于sequence的access权限
- 一个序列可以给两张表的key提供值
- 数据库非正常关闭后,已经缓存的序列会丢失
- 有select、alter、drop、reference权限
- alter不可改start with,其他都可改
事务
-
sqlplus,用户退出,未提交的事务会自动提交
-
session可以看到它中所有未提交的事务
-
开始于第一条DML/DDL语句
-
结束于
一条显式的COMMIT或者Rollback命令
- 一条DDL或者DCL语句
- 系统崩溃
- 用户退出SQLplus或者SQLplussheet 或者iSQL*plus
rollback
- 回滚所有未提交事务
权限
-
object privilege权限
select/update 仅可以授权给 表 和 视图
- alter 仅可以授权给 表 和 序列
- 一个对象的owner,默认需要此对象的所有对象权限
- 表的owner必须被授予 references权限,从而允许其他user创建外键
- 创建关联到其他schema表的外键约束
- 从除去sys之外的任意schema中删除表
- 用户默认拥有其schema中所有object的所有object权限
system 权限
登录一个库:Log into a database
查询数据库中任意表
使用with grant option 子句
语法grant create… on table to role with grant option
向其他schema中的现有表,增加主键约束
public权限
- 可以从一个user收回public权限
role
- 1个role可以是多个role和权限的集合
read-only模式的table,可以执行 create index、drop unused columns、drop table
session_privs,用户可用的权限,包括当前可用的system权限
可单独授予表中部分列的权限
- references
DUAL:虚拟表
- 拥有select权限都可以使用
- 只显示1行1列,varchar2类型
savepoint
- 执行前的事务不会被提交
- 可以回滚delete操作,不能回滚truncate操作
- 不能回滚create index操作
merge
- 可以使用子查询produce源数据row
- 可以使用视图produce源数据row
- 可以有条件的从多个表中将数据聚合为一行插入到单表中
- delete的update,delete需要有where
- merge into new_table n USING ( select … from old_table ) p ON (n.id=p.id) when matched then update set … delete
- merge into … using () on … when not matched then insert …values …where
substitution变量:替代变量
- 替代变量可以在任何select子句中使用
- 使用两个“&&”符号的替代变量在同一个session中只需要指定一次值
- &使用变量,&&的变量只需要第一次出现时提供值
set verify on:
- 打开时,对于有&变量的语句,输入变量值后会显示变量赋值后的语句
- 可以在SQL Developer和SQL *PLUS中使用
- 显示由DEFINE命令定义的变量的值
ERD:根据ERD选择两行相关数据
- 两个表中的每一个关系必须通过join条件实现
- 同一表中的关联数据通过self join实现
data dictionary
- data dictionary持续更新以反映数据库对象、权限和数据的更新
- sys用户拥有data dictionary下所有base table和用户可达的视图(注意区别于system用户)
- DICRIONARY是一个view,包含所有用户可访问的数据字典视图的名称
q引用:q‘引用符…引用符’,q可以大写Q.引用符可以为:
- 任意单字节或多字节字符集
- (){}[]<>
别名
- as可有可无
- 可以数字、特殊符号开头,但此时必须用双引号
- 不可用单引号
- 注意避免用关键字
- 表别名可以提高性能
多行子查询:返回多行数据的子查询
- 可以使用group by
- 可以使用having
- 可能返回多个列
- 可以包含子查询
object 对象
-
user_objects视图
包含当前用户拥有的所有表、视图、索引、包等对象
- User_objects is a list of all the database objects (tables, views, indexes, packages, etc., etc.) belonging to the current user
all_objects视图
- 用户有访问权限的所有对象
dba_objects视图
- 数据库中的所有对象
表、视图、pakcage、同义词等
用户自定义object type
SQL
- 最适合关系型数据库
- 需要数据存储在分层存储上
- 为逻辑数据提供独立于底层物理存储的操作
ERD(实体关系图)
- 实体
- 关系
- 属性