目录
什么是数据字典?
SQL Server如何使用数据字典
数据字典的其他用途
INFORMATION_SCHEMA视图
使用INFORMATION_SCHEMA视图的示例
列出包含指定列的所有表
列出数据库中的所有表
列出每个模式中的表数
SQL Server目录(Catalog)视图
使用目录(Catalog)视图的示例
列出数据库中的所有表
列出每个模式中的表数
在SQL Server中,数据字典是一组数据库表,用于存储有关数据库定义的信息。该字典包含有关数据库对象的信息,例如表,索引,列,数据类型和视图。
SQL Server使用数据字典来执行查询,并在数据库中添加,删除或更改对象时自动更新。
本文的所有示例都基于Microsoft SQL Server Management Studio和AdventureWorks2012数据库。
SQL Server使用数据库字典来验证SQL语句。执行SQL语句时,DBMS(数据库管理系统)会解析该语句,然后确定您引用的表和字段是否有效。要快速执行此操作,它将引用数据字典。
除了测试语句的有效性之外,SQL Server还使用数据字典来协助生成查询计划,并引用定义数据库结构的信息。
数据字典本身就成为SQL Server用于访问数据的指南。简单地说,没有数据字典,虽然SQL Server会知道并理解SQL语言,但它不会知道您的数据库表和列;因此,它无法查询它们。
由于数据字典包含数据库的定义,因此您可以使用它来获取有关数据库的信息。真正酷的是数据字典由SQL表和视图组成。这意味着,您可以通过查询获取有关数据库的信息!
设计人员和开发人员使用数据字典来理解数据库的结构。您可以将字典视为最新的参考文档。
SQL Server Management Studio等设计工具使用数据字典通过对象资源管理器显示有关数据库的信息。
SQL Server Management Studio对象资源管理器
上面列出的表格并不神奇,而是对象资源管理器向数据字典发出查询以检索所有用户表。
数据字典存储在一系列系统表中。虽然您可以直接查询这些表,但Microsoft保留修改组成数据字典的系统表的权利。因此,他们建议您查询INFORMATION_SCHEMA视图而不是直接访问表。
由于您可以自己查询数据字典,因此您可以回答一些问题,否则这些问题需要通过对象资源管理器进行大量搜索和确定。例如,如何使用BusinessEntityID列轻松找到所有表和视图?如果没有数据字典,您将不得不使用对象资源管理器并打开每个表和视图,并查看列的定义。但是,使用数据字典可以使用简单查询来完成。
SQL Server中包含的INFORMATION_SCHEMA视图符合SQL-92 ISO标准。这意味着符合ISO标准的其他数据库供应商将提供相同的视图集。
以下是一些更常用的视图及其描述:
您可以使用INFORMATION_SCHEMA.COLUMNS视图执行此操作。例如,以下列出了所有包含列BusinessEntityID的表和视图
SELECT TABLE_NAME
FROM AdventureWorks2012_Data.INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'BusinessEntityID'
你可以想象数据字典可以派上用场!你能想象必须手工搜索每个定义才能找到数据库中某个字段的所有匹配项吗?
使用INFORMATION_SCHEMA.TABLES视图执行此操作。
SELECT TABLE_NAME, TABLE_TYPE
FROM AdventureWorks2012_Data.INFORMATION_SCHEMA.TABLES
ORDER BY TABLE_NAME
此查询返回基表和视图。
在此示例中,列出了每个模式以及在其中定义的表和视图的数量:
SELECT TABLE_SCHEMA, Count(TABLE_SCHEMA)
FROM AdventureWorks2012_Data.INFORMATION_SCHEMA.TABLES
GROUP BY TABLE_SCHEMA
目录视图是另一种方式,以查看数据字典。如果觉得对象目录视图提供了更多信息,我倾向于在视图上使用INFORMATION_SCHEMA视图。
我发现最有用的一些视图包括:
以下示例使用Microsoft SQL Server目录视图来获取上面使用INFORMATION_SCHEMA的相同信息。
列出包含指定列的所有表
为了使用特定列获取表的名称,必须同时使用sys.tables和sys.columns视图。它们通过object_id连接,用于标识公共数据库对象,例如表和视图。
SELECT t.name,
t.type_desc
FROM AdventureWorks2012_Data.sys.columns AS c
INNER JOIN sys.tables AS t
ON c.object_id = t.object_id
WHERE c.name = 'BusinessEntityID'
sys.tables视图可用于获取数据库中定义的所有表的名称。此视图返回基表和视图。
SELECT name,
type_desc
FROM AdventureWorks2012_Data.sys.tables
ORDER BY Name
sys.tables视图不包含模式名称,因此使用内置函数SCHEMA_NAME来获取它。
SELECT SCHEMA_NAME(schema_id),
count(name)
FROM AdventureWorks2012_Data.sys.tables
GROUP BY SCHEMA_NAME(schema_id)
正如你可以看到的那样,它比使用INFORMATION_SCHEMA更具技术性。但是,我从经验中说,目录视图中包含更多信息。如果您对数据库的结构有特定问题,那么这些是要触及的表。