天天看点

如何利用系统数据库获取数据库中的属性

  • 在数据库结构中,分为数据库(database),表(table),列(column),数据(某行某列)几个层级。有时我们想知道某一层级下的一些属性,例如:

    1.数据库名 2.某一数据库的表名 3.某一个表的有几列,每列的属性叫什么 4.某一列的数据类型是什么

  • 上述这些问题有一个共同点,我们想获取的都是一些属性类的数据,这些数据不存在与我们创建的表或数据库中,它们以属性的形式存在于我们创建的数据库中,而不是以数据的形式存在,也就是说我们无法从创建的数据库中直接获取这些属性,但我们可以查询一些属性,例如:show databases;结果如下图
    如何利用系统数据库获取数据库中的属性
  • 这句话并不是一个查询语句,如果我们想获取一个内容为这些数据库名的表该怎么办?这里有一个简单的逻辑,获取数据一定要向具体的表中获取,实际上select

    xxx from 后的内容一定是一个表名。所以我们要向获得数据库名为内容的表时,代表着这些内容必须在一个表中,但我们又没有创建过这个表,怎么办呢?实际上每创建一个数据库,表,以及具体数据时,系统都会把这写内容的属性,如数据库名、表名、列名、列属性、数据类型(如int,varchar)存在系统数据库Information_schema中。这个数据库包含了整个数据库的各种属性信息,这些信息被存在不同的表中,常用的如:schemata,tables,columns等。

  • 这时我们就可以向系统数据库索要我们想要的属性了,在查询时,我们需要知道要查询的属性是什么,这些属性是系统可以识别的因为select语句结构实际上是select

    (属性名),from (表名) where xxxx; 那么会有一些常用的属性名我们需要知道,这里暂且叫它们通用属性名;例如:schema_name, table_name,column_name等。

  • 此外,在where条件语句中,我们需要知道参数在表中的名称,也就是表的列属性,这里也有一些常见的列属性名,如:table_schema(在系统数据库的tables表中,指明表属于哪个数据库),table_name等。这里的table_name既是通用属性名,又是列属性名(存在于系统数据库的tables表中),如下图。
如何利用系统数据库获取数据库中的属性
  • 那么我们想查询数据库名时,可以调用系统数据库中的tables表(记录了所有数据库表的属性),语句为: select schema_name

    from information_schema.tables where table_schema=‘security’;

    这时我们就获取到了security数据库中的所有表名,如下图所示。

如何利用系统数据库获取数据库中的属性
  • 如果想获取users表中的列名,语句为: select column_name from

    information_schema.tables where table_name=‘users’;

    可以看到前一个语句中的table_name为通用属性名,作为select后查询的内容,而这句话中的table_name为表属性名,作为

    where条件语句中的定位元素。

注:table_schema与schema_name从内涵上都是数据库名,但前者是tables表中的变量属性,作为条件语句中的定位元素;后者是一个通用属性名,作为select语句中的查询对象。 初学者常常分不清这两个元素,哪一个写在select的后面,哪个在条件语句中,通过上述的分析相信也就比较明了了。

简单分析了利用系统数据库Information_schema 获取属性类的数据,这个过程与我们查询自建数据库中内容是一致的,只不过查询的对象是系统数据库,因此我们要对系统数据库的结构,常用表和表中列属性等结构有一定的了解,此处仅分析和理解其原理,对系统数据库的学习可以自行进行对应的学习。