MySQL提供了以下三种方法用于获取数据库对象的元数据:

1)show语句

2)从INFORMATION_SCHEMA数据库里查询相关表

3)命令行程序,如mysqlshow, mysqldump

用SHOW语句获取元数据

MySQL用show语句获取元数据是最常用的方法,下面提供了几种典型用法:

  1. show databases;  --列出所有数据库
  2. show create database db_name;  --查看数据库的DDL
  3. show tables; --列出默认数据库的所有表
  4. show tables from db_name;  --列出指定数据库的所有表
  5. show table status;  --查看表的描述性信息
  6. show table status from db_name;
  7. show create table tbl_name;  --查看表的DDL
  8. show columns from tbl_name;  --查看列信息
  9. show index from tbl_name;  --查看索引信息
  1.  
    show databases; --列出所有数据库
  2.  
    show create database db_name; --查看数据库的DDL
  3.  
    show tables; --列出默认数据库的所有表
  4.  
    show tables from db_name; --列出指定数据库的所有表
  5.  
    show table status; --查看表的描述性信息
  6.  
    show table status from db_name;
  7.  
    show create table tbl_name; --查看表的DDL
  8.  
    show columns from tbl_name; --查看列信息
  9.  
    show index from tbl_name; --查看索引信息

有几种show语句还可以带有一条like 'pattern'字句,用来限制语句的输出范围,其中'pattern'允许包含'%'和'_'通配符,比如下面这条语句返回domaininfo表中以s开头的所有列:

  1. show columns from domaininfo like 's%';
show columns from domaininfo like 's%';

像上面这张支持like字句的所有show都可以改写成一条where字句,如:

  1. show columns from domaininfo where field='sysdomain';
show columns from domaininfo where field='sysdomain';

注:desc tbl_name和explain tbl_name的效果和show columns from tbl_name一致。

从INFORMATION_SCHEMA数据库里查询相关表

INFORMATION_SCHEMA是MySQL自带的一个系统数据库,它里面存储了所有的元数据,通过select里面的相关表就可以获取你想要的元数据。和show语句相比,它比较麻烦,但它的好处是标准的SQL语句,更具有可移植性,且更灵活,可以通过各种表达式获取你真正需要的信息。

从命令行获取元数据

前面两种方法都必须得在MySQL命令行里执行,而mysqlshow和mysqldump提供了从OS命令行获取元数据库的方法,如:
  1. mysqlshow  --列出所有数据库
  2. mysqlshow db_name  --列出给定数据库的所有表
  3. mysqlshow db_name tbl_name  --列出给定数据库表的所有列
  4. mysqlshow --keys db_name tbl_name  --列出索引信息
  5. mysqlshow --status db_name  --列出数据库的描述性信息
  1.  
    mysqlshow --列出所有数据库
  2.  
    mysqlshow db_name --列出给定数据库的所有表
  3.  
    mysqlshow db_name tbl_name --列出给定数据库表的所有列
  4.  
    mysqlshow --keys db_name tbl_name --列出索引信息
  5.  
    mysqlshow --status db_name --列出数据库的描述性信息

mysqldump可以让你看到create table语句(就想show create table语句一样),如:

  1. mysqldump --no-data db_name [tbl_name] ...
mysqldump --no-data db_name [tbl_name] ...

注意:在用mysqldump查看表结构时,一定要加上--no-data,否则你看到的将是数据库表里的数据。

 

MySQL元数据库——information_schema

2017年04月06日 23:45:05

阅读数:1963

平时使用MySQL客户端操作数据库的同学,只要稍微留神都会发现,除了我们建的库之外,还经常看到三个数据库的影子:

1. information_schema
2. performance_schema
3. mysql

这三个数据库究竟是什么东西呢?今天我们好好认识一下MySQL三个火枪手中的information_schema。

一、数据库实例和数据库

在认识information_schema前,我们先了解下数据库实例和数据库的区别和联系。我们本地启动MySQL服务,就是启动了一个数据库实例,他首先是一个进程管理了一系列的数据库文件。而我们执行create database cmcc_web 这条SQL语句时,才是真正创建一个数据库,他是一堆表的集合,其实也是文件的集合。简而言之,数据库实例就是RDBMS(数据库管理系统),数据库就是Database,Database是存放数据的仓库,RDBMS就是管理仓库的系统。 
在MySQL中,每个schema就是对应一个数据库。这个词将会在下面的篇幅频繁出现。

二、数据库元数据

元(meta),一般被我们翻译成“关于……的……”。元数据(meta data)——“data about data” 关于数据的数据,一般是结构化数据(如存储在数据库里的数据,规定了字段的长度、类型等)。(这段话来源于知乎)。 
所以metadata就是描述数据的数据,在MySQL中就是描述database的数据。有哪些数据库、每个表有哪些表、表有多少字段、字段是什么类型等等,这样的数据就是数据库的元数据。

官方定义:

INFORMATION_SCHEMA provides access to database metadata, information about the MySQL server such as the name of a database or table, the data type of a column, or access privileges

综上,我们可以称information_schema是一个元数据库。它就像物业公司的信息库,对管理的每栋大厦有多少电梯、电梯型号、每个房间的长宽高等等了如指掌。

三、常见的表

1、SCHEMATA 
提供数据库信息,有哪些数据库,字符集是GBK还是UTF-8等等。常用字段:

字段名 含义 备注
SCHEMA_NAME 数据库名  
DEFAULT_CHARACTER_SET_NAME 字符集  
DEFAULT_COLLATION_NAME 排序规则  

等同命令:SHOW DATABASES

2、TABLES 
提供表的信息,数据库有哪些表,是什么存储引擎等等。常用字段:

字段名 含义 备注
SCHEMA_NAME 数据库名  
TABLE_NAME 表名  
TABLE_TYPE 表的类型 类型有BASE TABLE、VIEW、SYSTEM VIEW
ENGINE 存储引擎  
CREATE_TIME 建表时间  

等同命令:SHOW TABLES

3、COLUMNS 
提供字段的信息,有哪些字段字段类型是什么等等。常用字段:

字段名 含义 备注
SCHEMA_NAME 数据库名  
TABLE_NAME 表名  
COLUMN_NAME 字段名  
COLUMN_TYPE 字段类型 如int(10),varchar(250)

等同命令:SHOW COLUMNS 或者 desc tctest.emp 看emp表的具体字段。

4、STATISTICS 
这张表的单词是统计的意思,但是却是索引的信息,真奇怪。常用字段:

字段名 含义 备注
SCHEMA_NAME 数据库名  
TABLE_NAME 表名  
INDEX_SCHEMA 也是数据库名  
INDEX_NAME 索引名  
COLUMN_NAME 字段名  
INDEX_TYPE 索引类型 一般是BTREE

等同命令:SHOW INDEX

5、TABLE_CONSTRAINTS 
提供约束情况,我们想看看表有哪些约束?约束指的是唯一性约束、主键约束、外键约束。常用字段:

字段名 含义 备注
CONSTRAINT_SCHEMA 数据库名  
CONSTRAINT_NAME 约束名  
TABLE_SCHEMA 也是数据库名  
TABLE_NAME 表名  
CONSTRAINT_TYPE 约束类型 UNIQUE、PRIMARY KEY、FOREIGN KEY

唯一约束和主键约束,我们在前面的索引中一样可以查到。

6、KEY_COLUMN_USAGE 
有STATISTICS和TABLE_CONSTRAINTS表,为什么还需要KEY_COLUMN_USAGE? 
因为外键时没有指出参考的是哪张表的哪个字段!常用字段:

字段名 含义 备注
CONSTRAINT_SCHEMA 数据库名  
CONSTRAINT_NAME 约束名 PRIMARY或列名或外键名
TABLE_SCHEMA 也是数据库名  
TABLE_NAME 表名  
COLUMN_NAME 列名  
REFERENCED_TABLE_SCHEMA 参考的数据库  
REFERENCED_TABLE_NAME 参考的表  
REFERENCED_COLUMN_NAME 参考的列  

相比前面两个,KEY_COLUMN_USAGE这个表的信息是最全的。包括主键、外键、唯一约束。

7、ROUTINES 
routines是程序的意思,在MySQL当然指的是函数和存储过程

字段名 含义 备注
SPECIFIC_NAME 程序名  
ROUTINE_SCHEMA 数据库名  
ROUTINE_NAME 程序名  
ROUTINE_TYPE 程序类型 PROCEDURE或FUNCTION
ROUTINE_BODY 函数体 好像都是SQL
ROUTINE_DEFINITION 具体的程序语句  

并没有show ROUTINES语句。

8、VIEWS 
查询数据库下所有的视图

字段名 含义 备注
TABLE_SCHEMA 数据库名  
TABLE_NAME 表名  
VIEW_DEFINITION 视图定义语句  

9、TRIGGERS 
查询所有的触发器

字段名 含义 备注
TRIGGER_SCHEMA 数据库名  
TRIGGER_NAME 触发器名  
EVENT_OBJECT_SCHEMA 触发的数据库  
EVENT_OBJECT_TABLE 触发的表  
ACTION_STATEMENT 触发的语句  
ACTION_TIMING 触发时机 BEFORE或AFTER

等同命令:show triggers from tctest

10、其他表 
ENGINES:列举了当前数据库对InnoDB、MEMORY、MyISAM等各种存储引擎的支持情况。等同show ENGINES 
GLOBAL_VARIABLES:服务器变量设置,一些开关和设置。等同命令show global variables。除了global还有session。 
PLUGINS:MySQL的插件列表。可以看到存储引擎InnoDB甚至binlog都是插件!binlog是强制加载的,InnoDB是默认打开的。等同命令show PLUGINS 
PROCESSLIST:查看正在运行的线程!比如我查这个表,就看到一个查询的线程。等同命令show full processlist

四、是表还是视图?

文档说information_schema下的表不是基本表,而是视图。但是在VIEWS中查不到,在TABLES中能查到这些表,表类型是SYSTEM VIEW。存储引擎使用的是MEMORY或MyISAM。 
使用show命令

show create table information_schema.`TABLES`;
  • 1

可以看到创建的是临时表,存储引擎是MEMORY

CREATE TEMPORARY TABLE `TABLES`(
)ENGINE=MEMORY
  • 1
  • 2

五、show命令还是select语句

show命令更简便,有时也能达到相同目的。但是输出格式已固定,select表的结果更完善,符合SQL标准。

六、Oracle中有information_schema吗?

没有实践过,但是平时使用Oracle时没有见到过这个库。官方的FAQ给出了结果:

F:What is the difference between the Oracle Data Dictionary and MySQL INFORMATION_SCHEMA?

A:Both Oracle and MySQL provide metadata in tables. However, Oracle and MySQL use different table names and column names. The MySQL implementation is more similar to those found in DB2 and SQL Server, which also support INFORMATION_SCHEMA as defined in the SQL standard.

大意是DB2和SQL Server都支持information_schema,Oracle有元数据表,但是列名和表名不一样。

MySQL提供了以下三种方法用于获取数据库对象的元数据的更多相关文章

  1. MySQL修改密码的三种方法

      MySQL修改密码的三种方法 1.方法1: 2.方法2: 3.方法3:        

  2. Docker MySql 查看版本的三种方法

    目录 Docker MySql 查看版本的三种方法 1.mysql -V命令查看版本 2.status命令查看版本 3.version命令查看版本 Docker MySql 查看版本的三种方法 1.m ...

  3. mysql分表的三种方法

    先说一下为什么要分表当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间.根据个人经验,mysql执行一 ...

  4. MySQL创建用户的三种方法 (并授权)转

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

  5. MySQL创建用户的三种方法

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

  6. mysql 变量赋值的三种方法

    mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了.第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量第二种用法:s ...

  7. 获取class对象的三种方法以及通过Class对象获取某个类中变量,方法,访问成员

    public class ReflexAndClass { public static void main(String[] args) throws Exception { /** * 获取Clas ...

  8. 解决 MySQL 1045错误的三种方法 (转)

    连接MySQL数据库时难免会遇到1045错误,主要是因为用户输入的用户名或密码错误被拒绝访问,如果不想重装,需要找回密码或者重置密码. 问题描述: 1045-Access denied for use ...

  9. mysql 分表的三种方法

    原文:https://www.cnblogs.com/lucky-man/p/6207873.html   一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查 ...

随机推荐

  1. yum和编译两种方式升级or降级Centos内核

    http://blog.51cto.com/renzhiyuan/1882599 今天探讨用yum和编译两种方式升级或者降级内核版本: 升级:比如玩kvm,docker等虚拟化,centos内核则升级 ...

  2. py-day1-6 python 5个灰魔法 【len,index索引,for循环,切片】

    # 索引,下标,获取字符串中的某一个字符. test = 'MuMingJun' v = test[3] print(v) i # 切片 test = 'MuMingJun' v = test[0:- ...

  3. 手写Spring框架学习笔记

    以下是咕泡公开课的学习笔记 一.创建工程springdemo 二.在pom中配置servlet <dependency> <groupId>javax.servlet</ ...

  4. Spark Hadoop Free 安装遇到的问题

    运行 ./sbin/start-master.sh : SparkCommand:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -cp /home/se ...

  5. 【java】数据类型

    逻辑型boolean: boolean类型数据只能取值True或False,不可以0或者非0替代True或False,这点与c语言不同. 字符型char: 一个char类型的字符占两个字节.一个汉字也 ...

  6. PHP优化思路

    想起来记录一下自己对PHP的优化思路 针对Nginx和 PHP-FPM进行优化 首先应该分为代码层面.配置层面.架构层面 代码层面 参见了https://segmentfault.com/a/1190 ...

  7. Hiero中修改BinView中binitem对象名字的方法

    之前博客提到了scan for more version这样一个功能,该功能会放宽查询条件,这就会导致BinItem的名称与activeVersion的名称不符.这篇博客提供了一个方法去统一名称. 该 ...

  8. seo一些相关内容

    PR值算法原理总体上基于下面2个前提: 1.一个网页被多次引用,则它可能是很重要的: 一个网页虽然没有被多次引用,但是被重要的网页引用,则它也可能是很重要的:一个网页的重要性被平均的传递到它所引用的网 ...

  9. 同台同时多开DELPHI2007的解决办法

    Cannot create file "C:\Users\Administrator\AppData\Local\Temp\EditorLineEnds.ttr"这个问题的产生根据 ...

  10. Linux Bash on Win10 (WSL)在cmder下使用vim时方向键失灵问题解决

    更改方法 由于cmder和bash.exe不兼容,如果你直接输入bash ~,那么进入子系统后将无法使用方向键和Home/PageUp/PageDown等键都无法使用,网上常见的cmder配置过程如下 ...