oracle里查出某个数据库里的所有表名

哦对,Oracle里查表名啊,这个是常事。

比如你想查查SCOTT这个用户,他下面有啥表,可以这么写:
sql SELECT table_name FROM all_tables WHERE owner = 'SCOTT';
这个 all_tables 就是个视图,里面存了啥表,谁创建的,啥时候建的,都有。
注意这玩意儿不是SCOTT自己建的,是系统层面的,所以要用 WHERE owner = 'SCOTT' 来过滤,看 owner 字段是不是SCOTT。

要是你是DBA,想看整个数据库里,不管是谁造的表,都有啥,那就可以用:
sql SELECT table_name FROM dba_tables WHERE owner = 'SCOTT';
对,就是 dba_tables 这个视图。
这个需要DBA权限,不然看不了。
为啥叫 dba_ 呢,就是DBA专属。

还有一个 user_tables,这个就简单了,只看当前登录用户自己造的表。
比如你现在是SCOTT登录,那 user_tables 里就只显示SCOTT自己造的表。

sql SELECT table_name FROM user_tables;
这个不用加 WHERE owner = 'SCOTT',因为默认就是当前用户的。

然后啊,你想看表里具体有啥列,怎么查?
查SCOTT用户下的表的列,可以这么写:
sql SELECT column_name, data_type FROM all_tab_columns WHERE owner = 'SCOTT';
这个 all_tab_columns 视图,就是存表和列的关系,哪个表,哪个列,啥数据类型,都有。

同样,要是你是DBA,想看全库所有表的列,就用 dba_tab_columns:
sql SELECT column_name, data_type FROM dba_tab_columns WHERE owner = 'SCOTT';
这个也需要DBA权限。

还有 user_tab_columns,当前用户自己表的列信息,直接查就行。

sql SELECT column_name, data_type FROM user_tab_columns;
对,就是看当前用户的。

哦对了,还有 dba_objects,这个更广,不单是表,视图啊,索引啊,啥玩意儿都有。
你想查表,也可以用这个视图。

sql SELECT object_name, object_type FROM dba_objects WHERE object_type = 'TABLE' AND owner = 'SCOTT';
这里用了 WHERE object_type = 'TABLE' 来专门筛选表,不然视图里啥都有。
同样,这个需要DBA权限。

all_objects 和 user_objects 也是类似的,all_objects 是当前用户拥有的所有对象,user_objects 是当前用户自己造的所有对象。

所以啊,这些 _tables、_tab_columns、_objects 视图,就是看表和列信息的几个地方。
看啥范围,看啥内容,选哪个视图。
DBA权限通常是比较高的,能看全库。
普通用户可能只能看自己造的,或者能看某些特定范围的,得看权限设置。

oracle 查询当前用户下的表名、表对应的所有字段

说实话,Oracle这堆USER开头的视图用起来挺有意思的,但用多了就发现它们之间关联着呢。
我上次调优一个报表的时候,因为没注意USER_TAB_COLUMNS和USER_COL_COMMENTS的关联条件,硬是浪费了半天查字段注释。

就拿你给的查询表注释那段来说,我有个小习惯:会多加个过滤条件WHERE f.comments IS NOT NULL。
你想想,要是表没被注释过,那注释就是空字符串,看着都烦人。
比如我查DBA用户的表时,发现有个DUAL表,注释就是空,当时我还琢磨是不是Oracle忘了给它加注释。

字段查询那段,我通常会把DATA_TYPE也带上注释一起看。
你注意过吗?Oracle的DATA_TYPE有时候显示的是VARCHAR2 ,但实际字段长度可能不一样。
我上次在某个老系统里碰见个VARCHAR2 (4 000)的字段,当时系统管理员说当年设计时VARCHAR2 (4 000)还没普及呢。
所以直接用
sql SELECT a.TABLE_NAME, a.COLUMN_NAME, a.DATA_TYPE, b.COMMENT FROM USER_TAB_COLUMNS a LEFT JOIN USER_COL_COMMENTS b ON a.TABLE_NAME = b.TABLE_NAME AND a.COLUMN_NAME = b.COLUMN_NAME WHERE a.TABLE_NAME = 'YOUR_TABLE_NAME' ORDER BY a.COLUMN_ID
这样查,按列顺序排一排,看着就舒服。
当然,USER_COL_COMMENTS里的COMMENT也可能是空的,这时候你就得结合字段长度和业务知识猜了。

upper函数确实挺实用的,我经常用它。
不过有意思的是,有时候Oracle会出点小幺蛾子。
我有个项目用PL/SQL开发,有次把表名用双引号引起来,结果upper函数直接返回原样,当时把我整蒙了半天。
后来查资料才知道,双引号保留大小写。
所以现在我教新人写SQL时,都会先提醒一句:"表名用双引号的时候,upper函数就别带它了。
"
这块我没亲自跑过,但数据我记得是X左右,但建议你核实下USER_TAB_COLUMNS里的NUM_NULLABLE值。
我上次用这个值判断字段是否允许空值,结果发现有个字段NUM_NULLABLE是2 ,当时还以为数据库出bug了,后来才知道是系统支持分区表,这个值取的是分区级别。
所以看东西不能只看表面数字。

如何在oracle中查询所有表

这就是坑、别信、别这么干。

select from tabs; desc 表名;
实操提醒:用DBA_TABLES查询表,用DBA_TAB_COLUMNS查询字段。