文章目录
mysql中常说的库,相当于oracle的表空间。
登录,切换用户
连接数据库
sqlplus / as sysdba; # 匿名用户作为sysdba登录
sqlplus guanyu/1234 # 实际用户登录
切换用户(表空间)
conn root/1234 ; -- 连接用户(也就是库)
-- 查看当前库(表空间)
show user;
select user from dual;
select * from user_users;
查看当前数据库(实例名):
用处并不大,一般切换用户就能到所属库
show parameter instance_name; -- 这个其实会显示所有有权限的库,一般用户只显示自己的所属库
select name from v$database;
表结构,列结构
查看所有表名
user_tables常用场景:
查看是否有某个表名, table_name
统计库的总行数, num_rows字段 求和
select t.table_name,t.num_rows
from user_tables t ; -- from tab也可 tab是user_tables的视图
desc dba_data_files; -- 这个是命令,不是sql
查看字段类型,长度,默认值(不带注释)
user_tab_columns 这个用处比较大,查表,查列,字段,长度,默认值等都在这里
select table_name,column_name,data_type,data_length,data_default
from user_tab_columns where table_name ='t_user';
查看字段注释
user_col_comments(只有三个字段)应用场景:
查看某表的列注释
其他的时候推荐user_tab_columns,字段类型,长度等都在这里。
select
table_name,
column_name,
comments
from user_col_comments where table_name like '%t_user%';
导出数据字典
有的时候客户要求导出字典表结构,用下面的语句可以满足一般要求:
select t.table_name,t.column_name,
case
-- 文档中常见的字段类型为varchar(32),number(10,2)这样的类
-- 如果是number类型还要考虑精度,data_type,data_precision,data_scale
WHEN t.data_type ='NUMBER'and t.data_precision is not null and t.data_scale is not null THEN
t.data_type||'('||t.data_precision||','||t.data_scale||')'
else t.data_type||'('||t.data_length||')'
end as data_type
,t.nullable,
t2.comments
from user_tab_columns t
-- tab_columns表里面没有注释,所以要关联col_comments表
left join
user_col_comments t2
on t.table_name =t2.table_name and t.column_name =t2.column_name
order by t.table_name
视图结构,列结构
视图和表类似
查看所有视图
查表用*_tables,查视图用*_views。 而且视图最好dba_views,因为user_views太少了。视图一般都是系统级的。
select * from dba_views where view_name like '%$SESSION%'
v$ 和 v_$的区别
作用相同。
select * from sys.v$session;
select * from v$session.;
查视图字段,类型,长度,默认值
视图的列都也是放在*_tab_columns里面,而且都是table_name来查询。但要注意:
1. 最好用dba_tab_columns,不要用user_tab_columns。
2. 视图名要大写,而且最好模糊搜索。
因为视图名跟我想象的可能不一样,如查询中用:
select * from v$session
但是实际视图名是V_$SESSION。
示例语句:
select table_name,column_name,data_type,data_length,data_default
from dba_tab_columns where table_name like '%$SESSION%';
视图列注释
和表一样。注意用dba_col_comments, 视图名大写。
其实这个没用,因为视图一般没有列注释。
select * from dba_col_comments where table_name like '%$SQL%'
dict字典表
看了这么多,大家肯定要问,这些表视图,列视图都有哪些,能不能从全局的角度来看下,要不用到一个找一个太被动。
必须能,这些信息都在dict字典表,如sql:
# dict表只有2列table_name,comments
select TABLE_NAME,COMMENTS from dict
这个字典表还是很有用的。
rownum限定行数
查看前10条
select * from sys_dict where rownum<11;
查看5-10条
oracle中的rownum不能使用大于>,所以sql如下:
(select * from sys_dict where rownum<10 )
minus
(select * from sys_dict where rownum<5 );
其他
查看所有表空间(用户)
dba_tablespaces 有表空间名,block,bytes等信息。
select * from dba_tablespaces;
查看数据的文件位置
DBA_DATA_FILES 有文件位置,表空间名,block,bytes等信息。
select * FROM DBA_DATA_FILES;
解锁用户
如果一个某个用户登录请求太频繁,会被锁住,这是一种保护机制。
解锁办法,使用system用户登录,或者使用dba用户登录:
alter user root identified by root 111111 unlock;
是否区分大小写
oracle是区分大小写的。
那么为什么我表名小写还能查询出来?
例如:
select * from test;
发现确实可以查询出来。
那么这条能查出来吗?
select * from user_col_comments where table_name = 'test';
差不出来的。因为存的是大写的TEST。
所以,如果是作为sql主体可以小写,如果作为字符串,那么需要大写。
oracle为什么要区分大小写。
因为只要你不使用双引号表示区分大小写, ORACLE 会默认把你写的脚本全部转换为大写的。