[Oracle]细节、经验
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/131054454
出自【进步*于辰的博客】
纯文字阐述,内容比较干。并且,由于考虑到时间长了恐有所遗漏,便即兴记录,并没有对内容进行筛选、排序。因此,大家在阅读时可以直接Ctrl + F进行检索。
文章目录
1、细节积累
- 字符串前有一个
' '
(空字符),故首字母的索引是1
; - 使用
in/not in
时,逐条检索。任何类型与null
比较,都返回null
,故子查询时,要先清除所有null
记录,否则结果集都为空; - 使用
group by
时,select
中出现的字段必须在group by
中存在; - 查看所有实例:
show parameter name
;(注:当前用户必须至少拥有sysdba
权限) - 插入时,若要插入特殊字符
'&'
,不能直接放入字符串中,因为&
是变量修饰符,只能通过字符串拼接实现; - 插入时,未赋值却有值,此值来自
default
,使用alter table 表名 set 字段 = default
可将所有已存储数据重置为default
; - 数据表存储于用户的数据群中,会占据存储空间。
delete
是 DML,删除记录后并不释放空间,可回滚;truncate
是 DDL,执行后释放空间,不可回滚。 - 表约束和列约束相同,只是定义位置不同。列约束定义于列后,表约束定义于所有列后。定义格式:
constraint 约束名 约束类型(字段)
。(出自create table...
) - 日期运算: (1)
+ 1
:增加一天;(2)+ 1/24
:增加一小时,都会进位。 - 查询对象结构:
desc 对象名
。 (“对象”如:数据表) - 查看Oracle版本方法:(1)登录时(cmd)显示;(2)
sqlplus -v
;(3)select * from v$version
。 - 修改表名命令:(1)
alter table old_name rename to new_name
;(2)rename old_name to new_name
。 - 查看所有实例:
show parameter name
;
2、关于修改数据表字段时的规定
参考笔记一,P21.15。
- 若修改数据类型,则此列中已存储数据必须全为
null
(不是字符串'null'
,而是指“空”,无数据)。 - 若此类的数据类型为数值类型,(1)减少长度,同上;(2)增大长度,无限制。
- 若此类的数据类型为字符类型,减少长度时,只要修改后的长度足够容纳已存储数据,无限制;
- 修改默认值:
modify(字段 default 值)
。只会改变新增值,不会影响已存储值。 - 修改别名:
alter table 表名 rename column 旧名 to 新名
。
3、登录相关
参考笔记二,P24.5/6、P58.1。
3.1 免密登录
Oracle登录命令的形式很多,普遍的两种形式是:
sqlplus /nolog
,一般的用途是防止用户名和密码被窥视;sqlplus / as sysdba
。(登录用户为sys
,身份是sysdba
)
为什么可以“免密登录”?
\color{grey}{为什么可以“免密登录”?}
为什么可以“免密登录”?
首先,Oracle具有三种身份认证方式:操作系统身份认证、密码文件认证、数据库认证。之所以能“免密登录”,是因为操作系统的当前账户在用户组ora_dba
中。(大家可以在“组策略”中看到这个用户组)
3.2 登录
远程登录命令格式:
sqlplus 用户名/密码@ip地址:端口/实例名
例如:
sqlplus scott/123456@localhost:1521/bpmtest
默认端口是1521
。
其他命令:
show user // 查看当前用户
// 切换用户
1、conn scott/123456
2、connect /
3、conn / as sysdba
shutdown immediate // 关闭数据库
startup // 打开数据库
4、数据字典dba_profiles
参考笔记二,P24.4。
此字典记录了口令和资源限制的配置信息,如:登录允许密码错误次数、密码过期时间。如下:(当前用户身份至少是sysdba
才能访问,当前用户为基础数据库管理员sys
)
修改此表数据不能使用update
,而是需要在命令行完成。
示例。
alter profile default limit failed_login_attempts 3;
将登录允许密码错误次数设置为3次。
5、集合运算
参考笔记一,P20.10;笔记二,P58.3。
5.1 概述
常见的集合运算有4种:
union
:联合。相当于“并集”,去重,按照第一列升序排序;若每个查询都有 null(空记录),只保留一个。union all
:完全联合。不去重,默认不排序,并保留所有 null。由于不去重,故效率高于union
。intersect
:交集。minus
:差集。假设运算是A minus B
(A、B是select
查询),等价于A - A intersect B
。
集合运算条件:
- 所有
select
查询(在后称为“子查询”)的列数必须相同并类型一一对应,列名无需相同; - 不允许“子查询”使用
order by
,只能联合后使用(即只能在最后使用); - 以第一个“子查询”的列作为运算结果的列;
- 去重依据:在“子查询”内、“子查询”间,根据不同记录之间所有列的数据是否相同判断(一一对应比较),不考虑列名(包括相同列名)。
5.2 示例
示例数据。
运算示例。
6、关于 null
参考笔记一,P26.30/31;P27.30。
注:null 指空,即“无数据”,不是'null'
或'NULL'
。
6.1 规则
- 任何类型与 null 运算都为空。
- 包含空值的连接字符串
||
,同与空字符串''
连接。
6.2 null 对in/not in
的影响
in
与not in
我们都很熟悉,不知道大家有没有注意一个细节,就是明明存在满足in/not in
的记录,可结果集为空。为何如此?
我先将所有情况列举出来,再说明原因。为了降低大家的阅读成本,在此规定格式:
where A B C
A 是字段,B 是in/not in
,C 是条件列表。
八种情况:
- A 中有 null,B 是
in
,C 有null
。结果:正常匹配,但 null 行无法显示。(正常匹配非 null 记录) - A 中有 null,B 是
in
,C 无null
。结果:正常匹配。 - A 中有 null,B 是
not in
,C 有null
。结果:无记录。 - A 中有 null,B 是
not in
,C 无null
。结果:正常匹配非 null 记录。 - A 中无 null,B 是
in
,C 有null
。结果:正常匹配。 - A 中无 null,B 是
in
,C 无null
。结果:正常匹配。 - A 中无 null,B 是
not in
,C 有null
。结果:无记录。 - A 中无 null,B 是
not in
,C 无null
。结果:正常匹配。
原因:
in
相当于=
,not in
相当于!=
。- 表示为空的格式是
is null
,不为空是is not null
。 - 满足
in
的条件是“只要有一个匹配”,满足not in
的条件是“必须所有都不匹配”。 - 无论
in
还是not null
,都是逐一进行比较。
大家基于这四点,套用到以上八种情况,就知道为何“无记录”了,在此不赘述。
P
S
:
PS:
PS:当然,大家在使用in/not in
时,可以直接对比这八种情况,作相应的数据处理即可,不需要具体分析。
8、关于类型间转换
参考笔记一,P17。
8.1 隐式转换
- 插入、更新时,转换为字段的类型,如:
Integer → number
; - 查询时,转换为属性的类型,如:
number → int
; - 字符与数字比较时,转换为数值类型;
- 字符与日期比较时,转换为日期类型;
- 用
||
连接时,转换为字符类型。
8.2 显式转换
如下图:
图解:
- A:
to_char(d, 格式码)
。
格式码:
yyyy
→ 年,year
→ 年份英文全称,month
→ 月份,MM/mm
→ 月,day/dy
→ 星期,dd
→ 日,hh24/HH24
→ 小时,mi
→ 分钟,ss
→ 秒,am/pm
→ 朝夕。
示例:
- B:
to_number(c)
规定: c
必须是数字型字符串才可以转换。
示例:
- C:
to_char(n, 格式码)
;
格式码:
9(数字)
→ 保持数字原状;0(数字)
→ 若n
的位数小于格式码的位数时,用0
代替;$
→ 美元;L(字母)
→ 本地货币;.(小数点)
→ 保持本身。
示例:
1、格式码:'9999.99'
。
2、格式码:'0000.00'
。
3、格式码:'$9999.99'
或'$0000.00'
。
4、格式码:'L9999.99'
。
特例:
若格式码的长度大于数字的长度,则显示##...
。
示例:
- D:
to_date(c, 格式码)
。
同样遵循转换A中的格式码。(后续补充)
9、用户相关
9.1 用户
参考笔记一,P24.19;笔记二,P24.3。
用户创建步骤:
// 创建用户
create user 用户名 identified by 密码;
// 修改用户配额
alter user 用户名 quota 空间大小 on 表空间名
// 或:
grant unlimited tablespace to 用户名; // 无限表空间
// 授权
grant 权限 to 用户 [with admin option];
// []内语句的作用是:允许此用户将此权限授予其他用户
// 回收权限
revoke 权限 from 用户;
// 若此用户已将此权限授予其他用户,则回收权限时不会连带回收
其他命令:
alter user 用户 identified by 密码; // 修改密码
alter user 用户名 account lock/unlock; --上锁 / 解锁--
// 用户状态:open(打开。默认)、expired(密码过期)、locked(已锁定)
9.2 对象权限
参考笔记一,P24.20、P25.23~25。
分类:
select
、delete
、insert
、update
、alter
(修改)、references
(外链)、index
(索引)、execute
(执行)。
命令:
// 授权
grant 权限[(字段)]|all privileges[(字段)]
on [schema.]Object
to 用户|public [with grant option]
// 回收权限
revoke 权限 on [schema.]Object from 用户;
说明:
- 权限即上述分类;
all privileges
指所有对象权限;schema
是用户名;Object
是对象,指数据表;public
指所有用户;with grant option
类似with admin option
。 - 关于
public
对象:既不是用户,也不是角色,为所有用户自动共有。public
拥有的所有权限,所有用户都会自动拥有,如:grant create user to public
,表示所有用户都有权创建用户; - 若用户有创建对象(如:数据表),则删除用户(
drop user 用户
)时需加上cascade
,表示“先删除此用户旗下对象,再删除用户”;
9.3 角色
参考笔记一,P24.21。
角色创建步骤:
create role 角色名; // 创建角色
grant 权限 to 角色; // 授权
grant 角色 to 用户; // 为用户分配角色
revoke 角色 from 用户; // 收回用户角色
revoke 权限 from 角色; // 收回权限
drop role 角色; // 删除角色
9.4 数据字典
参考笔记一,P23.17、P25.26;笔记二,P58.2。
user_objects --当前用户旗下所有对象--
user_users --查询当前用户--
dba_users/all_users --查询所有用户--
dba_sys_privs/user_sys_privs --查询用户所有系统权限--
dba_tab_privs/all_tab_privs/user_tab_privs --查询用户所有对象权限--
dba_role_privs/user_role_privs --查询用户所有角色--
dba_roles --查询所有角色--
role_sys_privs --查询角色所有系统权限--
最后
如果大家想要了解一些Oracle知识点,可查阅博文《Oracle知识点锦集》。
本文持续更新中。。。
[Oracle]细节、经验的更多相关文章
- 给同为.NET开发者普及一点Oracle数据库经验
前段时间,因为要给自己开发的搜易站内搜索引擎增加Oracle数据库的支持,所以学习了下Oracle的基础知识,发现使用方式跟MYSQL,MSSQL等数据库的思维有很大的不同,总结一下几点不同,希望给初 ...
- oracle细节
1.oracle中NVL的含义: 如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值. 2.Oracle中in和exists的区别: 1).sel ...
- oracle工作经验(左右连接、decode)
oracle左右连接:select a.studentno, a.studentname, b.classname from students a, classes b where a.classid ...
- 一旦配置oracle em经验
对oracle10grac构造em,原本很easy事儿,但它需要一个很长的时间,记录下来.MEMO. 首先,例如,报告了以下错误: [oracle@node1 admin]$ emca -config ...
- 一些oracle的经验
注:再写存储过程的时候,在for循环里要写begin和end,这样就可以写exception ,让这条错误数据回滚,然后记录错误日志,commit 关键字: oracle 存储过程 1.基本结构 CR ...
- 之前的一些Oracle的经验总结
1. 安装: 1) 关于字符集的选择,现在还不很了解,修改是需要进入一个模式下才可以修改,当然新建一个数据库实例的时候可以重新设定: UTF8是相对比较大的一个字符集, 可以简单实用这个就能保存很多的 ...
- Oracle查询优化经验
1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (低效,执行时间156 ...
- [转]SQLServer和Oracle,存储过程区别,常用函数对比
本文转自:http://www.cnblogs.com/neru/archive/2011/08/18/2144049.html 以前一直用sqlserver,只有很少的一点oracle的经验,现在要 ...
- RHEL5 X86-64上安装Oracle 11gR2演示样例与总结
进入Oracle DBA行业也有好几年了,可是说到安装Oracle的经验,我还真不是特别多,印象中刚開始每次安装都有点磕磕碰碰,随着接触Oracle的时间越来越长,各方面的原理.机制也都有一定的了解后 ...
- Oracle中的AWR,全称为Automatic Workload Repository
Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库.它收集关于特定数据库的操作统计信息和其他统计信息,Oracle以固定的时间间隔(默认为1个小时 ...
随机推荐
- Sunnyui画曲线溢出错误
之前用sunnyui做展示数据库数据曲线的时候.偶然会报溢出错误,也不报错错误在哪,就是直接程序都跑不动了. 后面发现 设置曲线上下限的时候,当上下限一样的时候就会导致溢出错误.sunnyui的曲线也 ...
- Linux常用的20个命令(下)
无论你是后端程序员还是前端程序员,都避免不了和Linux打交道.上篇介绍了Linux常用的20个命令其中的10个,本文继续介绍剩下的10个命令. 11.man 命令 manual的缩写,即使用手册的意 ...
- Swoole从入门到入土(19)——WebSocket服务器[文件传输]
要利用WebSocket进行文件传输,我们需要讨论两种情况,分别是:发送方可以是客户端,和 发送方是服务端. 1.发送方是客户端 1)服务端接收 $server->on('message', ...
- 盘点 Udemy 上最受欢迎的免费编程课程
之前给大家推荐过一些油管上的免费学习资源,如果您还没有看过的话可以点击这里前往. 今天再给大家推荐一批Udemy上超高质量并且免费的编程课程,有需要的小伙伴可以学起来了. 1. JavaScript ...
- 通过performance_schema获取造成死锁的事务语句(转)
数据库日常维护中我们经常遇到死锁的问题,由于无法获取造成死锁的事务内执行过的语句,对我们死锁的分析造成很大的困难.但是在MySQL 5.7中我们可以利用performance_schema来获取这些语 ...
- eclipse安装UML插件
安装AmaterasUML AmaterasUML 是一个用于 Eclipse 的轻量级 UML 和 ER 图编辑器. 将AmaterasUML的3个jar包拷到Eclpise的plugins文件下: ...
- PostgreSQL中查看版本的几种方式
PostgreSQL中查看版本的几种方式 1.SQL方式 1 2 3 4 5 6 7 8 9 10 postgres=# show server_version; server_version -- ...
- 产品分享:Qt鸿图电子智慧白板(适合会议机、电子黑板、电子笔记、电子阅读器等场景),当前版本v1.0.0
产品 鸿途电子智慧白板. 原理 使用Qt技术为基础,开发的windows/ubuntu/arm电子绘图板,主要为windows,支持触摸鼠标,可以定制跨平台. 适合场景 1.会议机 ...
- 项目实战:Qt球机控制工具 v1.0.0(球机运动八个方向以及运动速度,设置运动到指定角度,查询当前水平和垂直角度)
需求 1.调试球机控制,方向速度,设置到指定的角度: 2.支持串口,485等基于串口的协议端口配置打开: 3.子线程串口控制和.子线程协议解析: 4.支持球机水平运动速度.垂直运动速度设置: ...
- 异步aioredis连接时报错TypeError: duplicate base class TimeoutError问题
版本 python3.11版本,aioredis 2.0.1版本,redis 7.x版本 redis.conf配置文件 daemonize yes bind 0.0.0.0 port 6379 pro ...