如何仅获取数据库表名而非视图名?解决SHOW TABLES混显问题
只查询数据库中的表名(排除视图)的解决方案
嗨,这个问题我碰到过好多次了!show tables from database; 确实会把表和视图一并返回,要精准过滤出仅表名的话,得根据你使用的数据库系统来调整查询方式,下面是几个主流数据库的具体实现:
MySQL/MariaDB
直接查询information_schema.tables系统视图,通过TABLE_TYPE字段区分表和视图:
SELECT table_name FROM information_schema.tables WHERE table_schema = '你的数据库名' AND table_type = 'BASE TABLE';
- 把
'你的数据库名'替换成你实际要查询的数据库名称 BASE TABLE代表实体表,视图的TABLE_TYPE值为VIEW,这样就会自动排除视图
PostgreSQL
有两种常用方式,选你顺手的就行:
方式1:使用pg_tables和pg_views过滤
SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename NOT IN (SELECT viewname FROM pg_views WHERE schemaname = 'public');
方式2:使用information_schema.tables
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE';
- 默认schema是
public,如果你的表在其他schema下,记得替换成对应名称
SQL Server
最简单的方式是直接查询sys.tables系统表(只存储表信息):
SELECT name AS table_name FROM sys.tables;
也可以用information_schema的方式:
SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE';
Oracle
如果你要查当前用户的表,直接用user_tables即可(它只包含表,不包含视图):
SELECT table_name FROM user_tables;
如果要查所有你有权限访问的表,用all_tables:
SELECT table_name FROM all_tables;
核心逻辑就是利用数据库自带的系统元数据对象(系统表/视图),通过类型标识或者专属表来区分实体表和视图,替代通用的show tables命令。
内容的提问来源于stack exchange,提问作者sagar vanave
相关产品推荐
相关产品推荐

