查询表字段属性
Mysql
SELECT TABLE_SCHEMA dataBaseName -- 库名
,TABLE_NAME tableName -- 表名
, COLUMN_NAME columnName -- 列名
, COLUMN_KEY columnConstraint -- 列限制 主键,唯一之类的
, COLUMN_COMMENT columnComment -- 列注释
, DATA_TYPE columnType -- 字段类型 varchar之类的
, CHARACTER_MAXIMUM_LENGTH columnLength -- 以字符为单位的最大长度
, CHARACTER_OCTET_LENGTH columnOctetLength -- 以字节为单位的最大长度
, NUMERIC_PRECISION columnNumberPrecision -- 数字类型整数位长度
, NUMERIC_SCALE columnNumberScale -- 数字小数位长度
, COLUMN_DEFAULT columnDefault -- 列的默认值
, IS_NULLABLE columnIsNullable -- 列是否可以为空 YES 是可以为空
FROM INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = database()
and TABLE_NAME = '{tableName}'
Oracle
SELECT
a.USERNAME dataBaseName -- 库名
, b.TABLE_NAME tableName -- 表名
, c.COLUMN_NAME columnName -- 列名
, e.CONSTRAINT_TYPE columnConstraint -- 主键,唯一之类的
, f.COMMENTS columnComment -- 列注释
, c.DATA_TYPE columnType -- 字段类型 varchar之类的
, c.DATA_LENGTH columnLength -- 以字符为单位的最大长度
, -1 columnOctetLength -- 以字节为单位的最大长度
, c.DATA_PRECISION columnNumberPrecision -- 数字类型整数位长度
, c.DATA_SCALE columnNumberScale -- 数字小数位长度
, c.DATA_DEFAULT columnDefault -- 列的默认值
, c.NULLABLE columnIsNullable -- 列是否可以为空 YES 是可以为空
FROM USER_USERS a
LEFT JOIN all_tables b ON a.USERNAME = b.OWNER
LEFT JOIN user_tab_columns c ON b.TABLE_NAME = c.TABLE_NAME
LEFT JOIN user_ind_columns d ON b.TABLE_NAME = d.TABLE_NAME
LEFT JOIN user_constraints e ON b.TABLE_NAME = e.TABLE_NAME AND d.INDEX_NAME = e.INDEX_NAME
LEFT JOIN all_col_comments f ON a.USERNAME = f.OWNER AND b.TABLE_NAME = f.TABLE_NAME AND c.COLUMN_NAME = f.COLUMN_NAME
WHERE b.TABLE_NAME = '{tableName}'
SqlServer
SELECT A.name AS tableName
, B.name AS columnName
, isnull (D.value,B.name) AS columnComment
, C.name AS columnType
FROM sys.tables A
INNER JOIN sys.columns B ON B.object_id = A.object_id
left join sys.types C ON B.system_type_id = C.system_type_id
LEFT JOIN sys.extended_properties D ON D.major_id = B.object_id AND D.minor_id = B.column_id
WHERE A.name = '{tableName}'
PostgreSql
select a.relname tableName
, b.attname columnName
, COALESCE(c.description ,b.attname) columnComment
, d.typname columnType
from pg_class a
left join pg_attribute b on a.oid = b.attrelid
left join pg_description c on b.attrelid = c.objoid and b.attnum = c.objsubid
left join pg_type d on b.atttypid = d.oid
where a.relname = '{tableName}'
and b.attname not in ('gp_segment_id','tableoid','ctid','xmax','xmin','cmax','cmin')
Sqlite
PRAGMA table_info({tableName})
hive
desc {tableName}
深度解析
标准
select * from INFORMATION_SCHEMA.COLUMNS
我记得在一篇博客中看到过 这句sql是一个行业标准,我自己也有发现 在 sqlserver ,mysql ,postgresql 中都有支持,当然在mysql我认为是支持最好的,但是现在资料太少,等我慢慢整理,写在这里只是表示这是一个万金油语句,查询表字段的时候很多数据库都能支持的上的
Mysql
1 获取当前数据库
database()
Oracle
1、oracle 获取当前用户的详细信息
select * from USER_USERS
1.1、oracle 获取当前模式(schema)
您可以简单理解为,schema 名 就是用户名 是一样的,每个模式代表一个用户
-- 查看所有schema 可以理解为查询所有的schema用户
select username from sys.dba_users;
-- (硬要查询的话应该就是下面的语句)根据当前用户查询schema
select a.USERNAME ,b.*
from USER_USERS a
LEFT JOIN sys.dba_users b ON a.USER_ID = b.USER_ID ;
2、oracle获取当前用户的角色信息
SELECT * FROM USER_ROLE_PRIVS
3、oracle获取当前用户的角色权限信息
SELECT * FROM ROLE_SYS_PRIVS
postgresql
在前面的语句中大家应该可以看到这个语句,因为我发现我在使用上面的语句获取表字段信息的时候发现会获取一些多余的字段,猜测应该是跟 Oracle 的rowid 一样的隐藏字段,可能在特殊的地方会有用处,但是我这里用不到,所以拿掉了,当然也可以使用上面的语句 标准
and b.attname not in ('gp_segment_id','tableoid','ctid','xmax','xmin','cmax','cmin')
SqlLite
目前获取字段名称方法我只找到这么一个,不过好消息是这个语句可以使用 sqlsugar 创建的数据库连接中直接调用,并返回结果
代码如下,自己的测试demo
public class program
{
public static void Main(string[] args)
{
string connect = "data source=C:\\Users\\Administrator\\AppData\\Local\\Packages\\cf906e41-910f-41ab-9cae-5a814460689d_9g7jfgbsde0p2\\LocalState\\sqlite.db";
SqlSugarClient sqlSugarClient = new SqlSugarClient(new ConnectionConfig
{
ConfigId = "A",
ConnectionString = connect,
DbType = SqlSugar.DbType.Sqlite
});
var dt = sqlSugarClient.Ado.GetDataTable("PRAGMA table_info(schedulework)");
Console.WriteLine(dt.Rows.Count);
}
}
hive
hive 有一些查询表信息的命令,自己可以在控制台使用,但是无法使用上述的代码访问到具体信息